From fb8b6fd7f58cd571211dfa4f8b7c22d6140ee9ba Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 24 Nov 2013 21:46:47 -0500 Subject: [PATCH] Add configurable ffmpeg performance options --- jni/nv_avc_dec/nv_avc_dec.c | 52 ++++++++++++------ jni/nv_avc_dec/nv_avc_dec.h | 2 +- jni/nv_avc_dec/nv_avc_dec_jni.c | 4 +- libs/armeabi-v7a/libnv_avc_dec.so | Bin 17700 -> 17700 bytes libs/x86/libnv_avc_dec.so | Bin 9576 -> 9576 bytes .../nvstream/av/video/AvcDecoder.java | 15 ++++- .../nvstream/av/video/CpuDecoderRenderer.java | 20 ++++++- 7 files changed, 72 insertions(+), 21 deletions(-) diff --git a/jni/nv_avc_dec/nv_avc_dec.c b/jni/nv_avc_dec/nv_avc_dec.c index 525f3567..4366ce11 100644 --- a/jni/nv_avc_dec/nv_avc_dec.c +++ b/jni/nv_avc_dec/nv_avc_dec.c @@ -20,15 +20,24 @@ struct SwsContext* scaler_ctx; #define RENDER_PIX_FMT AV_PIX_FMT_RGBA #define BYTES_PER_PIXEL 4 -#define VERY_LOW_PERF 0 -#define LOW_PERF 1 -#define MED_PERF 2 -#define HIGH_PERF 3 +// Disables the deblocking filter at the cost of image quality +#define DISABLE_LOOP_FILTER 0x1 +// Uses the low latency decode flag (disables multithreading) +#define LOW_LATENCY_DECODE 0x2 +// Threads process each slice, rather than each frame +#define SLICE_THREADING 0x4 +// Uses nonstandard speedup tricks +#define FAST_DECODE 0x8 +// Uses bilinear filtering instead of bicubic +#define BILINEAR_FILTERING 0x10 +// Uses a faster bilinear filtering with lower image quality +#define FAST_BILINEAR_FILTERING 0x20 // This function must be called before // any other decoding functions -int nv_avc_init(int width, int height, int perf_lvl) { +int nv_avc_init(int width, int height, int perf_lvl, int thread_count) { int err; + int filtering; pthread_mutex_init(&mutex, NULL); @@ -53,24 +62,25 @@ int nv_avc_init(int width, int height, int perf_lvl) { // Show frames even before a reference frame decoder_ctx->flags2 |= CODEC_FLAG2_SHOW_ALL; - if (perf_lvl <= LOW_PERF) { + if (perf_lvl & DISABLE_LOOP_FILTER) { // Skip the loop filter for performance reasons decoder_ctx->skip_loop_filter = AVDISCARD_ALL; } - if (perf_lvl <= MED_PERF) { - // Run 2 threads for decoding - decoder_ctx->thread_count = 2; - decoder_ctx->thread_type = FF_THREAD_FRAME; - - // Use some tricks to make things faster - decoder_ctx->flags2 |= CODEC_FLAG2_FAST; - } - else { + if (perf_lvl & LOW_LATENCY_DECODE) { // Use low delay single threaded encoding decoder_ctx->flags |= CODEC_FLAG_LOW_DELAY; } + if (perf_lvl & SLICE_THREADING) { + decoder_ctx->thread_type = FF_THREAD_SLICE; + } + else { + decoder_ctx->thread_type = FF_THREAD_FRAME; + } + + decoder_ctx->thread_count = thread_count; + decoder_ctx->width = width; decoder_ctx->height = height; decoder_ctx->pix_fmt = PIX_FMT_YUV420P; @@ -114,13 +124,23 @@ int nv_avc_init(int width, int height, int perf_lvl) { return err; } + if (perf_lvl & FAST_BILINEAR_FILTERING) { + filtering = SWS_FAST_BILINEAR; + } + else if (perf_lvl & BILINEAR_FILTERING) { + filtering = SWS_BILINEAR; + } + else { + filtering = SWS_BICUBIC; + } + scaler_ctx = sws_getContext(decoder_ctx->width, decoder_ctx->height, decoder_ctx->pix_fmt, decoder_ctx->width, decoder_ctx->height, RENDER_PIX_FMT, - SWS_BICUBIC, + filtering, NULL, NULL, NULL); if (scaler_ctx == NULL) { __android_log_write(ANDROID_LOG_ERROR, "NVAVCDEC", diff --git a/jni/nv_avc_dec/nv_avc_dec.h b/jni/nv_avc_dec/nv_avc_dec.h index d53d5425..bc47b021 100644 --- a/jni/nv_avc_dec/nv_avc_dec.h +++ b/jni/nv_avc_dec/nv_avc_dec.h @@ -1,6 +1,6 @@ #include -int nv_avc_init(int width, int height, int perf_lvl); +int nv_avc_init(int width, int height, int perf_lvl, int thread_count); void nv_avc_destroy(void); void nv_avc_redraw(JNIEnv *env, jobject surface); int nv_avc_decode(unsigned char* indata, int inlen); diff --git a/jni/nv_avc_dec/nv_avc_dec_jni.c b/jni/nv_avc_dec/nv_avc_dec_jni.c index e438c703..70f165b7 100644 --- a/jni/nv_avc_dec/nv_avc_dec_jni.c +++ b/jni/nv_avc_dec/nv_avc_dec_jni.c @@ -7,9 +7,9 @@ // any other decoding functions JNIEXPORT jint JNICALL Java_com_limelight_nvstream_av_video_AvcDecoder_init(JNIEnv *env, jobject this, jint width, - jint height, jint perflvl) + jint height, jint perflvl, jint threadcount) { - return nv_avc_init(width, height, perflvl); + return nv_avc_init(width, height, perflvl, threadcount); } // This function must be called after diff --git a/libs/armeabi-v7a/libnv_avc_dec.so b/libs/armeabi-v7a/libnv_avc_dec.so index ad485f7c990cde52cc2cf7229c9447db6b13c568..f9e6b5bc1e60743afe815631a4a4a7f4fe077417 100644 GIT binary patch delta 1962 zcmZ3|#ki!4aY72~X(I-P(-SlEITsi(Fo5yIhuMsGHv2MaGYU4SFfed1Ffa%)a51cB zWMD{~+{u*B#3(iS7gHajj|t33>HWRR&(NU3z#sz^P+?6Wp3=A5Y zh=9*vV_?uhl5b#RVDQmoU^oC(Kb;LVL{@`hNSlE{1uB1pt)78_0ZHIC8v}z168{Yv z|2G>0g9nnlI6Erekez`c2T9%ojUUU-z%T(xzAyw$pqZV4VSzpag9Frs)7Tjp9_TYL z=s@{v*%=sk3>X+Jp!~D!3=A#?h#-E#&cNWa`6pYSK)w4+w^*OH4YA%0ZZ$6aZVZZ| zZVw{9`PL5x0gwI7siGfP_<8m-Dl;iFC>{8rV|?I8kHY`&Ki)BD zG`g|evhuVBTVeL#|MxHNEWIB`fShCDX#o~J^!)$#7w^oxLw+z%IQfHtL1Cwfrzu!w z>vQ(s9N%{^{QrLMouT*R2u83s3_K0$!P3i~8)w|gXP6|Tbn^!T!|eS3-!FkJWWS~9 zsRdTSrtts!hIfh&7?oDDv0M@TAi&SFpGApD$v8tsbw>Wpe8#B^s!Wp@Ca!d2p2{+n zb?W6GJqpZj|G#f}Ck=I^l&2Kfq=M%jZfqO&zWC67$((_q{>cCT|4;n?|Nn_31H)@c z28J{L|NlQH$-wYIl7S&dl7V4`Bm={R|NsAoNir}jlVo7H^8f#T8%YL+9!Um<8~^|R zmy={*Xp>}M_#?rX~JkX`M;znqt#?lDMNF$cgh*J^Jh4*Tu}8?0|yA_ z0}D4txBuT2-m$w`>{Rkp0*itI{Lov)2dpc#-2Q);m|QC*YtHwML4)mF=*?jA*;R7Wv zCGVvXjH@0;Xl6)cFs=Uo{n}dw4K_FKTe6;P3bIhQ_`Q|!24$T|Z>1kF&Tif)0ZNAr z4sQRyH@y|}ejZ_+A-xk6{`=lqB!EQgCihB9yKZ`G;3fujsg(%>Lyi~&L#j9=&OvFx zOpJlSQ=EYTlujP}|NmdWP10@d3m%65-;eD5|9!(gLAU?k|4x1_EzejvnOjDRkzulm zj0fY2&ABq|j7%SlHh+^9Vr2X}nNvQT@&4pQ`D(`VoA1i=Gco#2eyf+168K8F!pSIso~5nx%=n;*BlPIFL(a@|GL8cfE&Ys`A_*j^gK|R>}p_d z_~hCD`VH$?8+N?-U%!%LV?)5p|MeTz@HZs90@0!k2Cx6uGcqtRXuSSkzhT3M2D8mu z4c_x?K43e6QE-JJq;3V(r=XgzU~{7Va%LtL$;n*Ka;zx^3=Aogb)A)2!S(OtP-kUU Nkd76bYn_)f0swU@UJw8P delta 2025 zcmZ3|#ki!4aY72~dLssg^%FDmIa>@E7{GYq!)(SQn|&Fz83j{R7#KJh7#M^YxER(m zGB9{f?qtemdMP>i7gHZ2~4-)?b3j@OkO$G)Ls55S{FihUgA}IJmo`JyyD)s^7hRHWs^qD?rPv&Bk ztIttkVDMpvcs+rYfk6hzzzS9d1|B4SA1ecc4ibMoD+5CX68|_W1H%O*{(V*kh8^mN zpnb>6z;HmFfnf>MF{8v}!ZCIiC(sQT$_s3EeNje+5b76XF{RQ?ECJ*vQMHUW!(I|D-rl6+wZnm{u<14D~G1A_z9h11v>7>?*O zFz7(}YuOnXKIk(rSU~w_*%=r#3=l#5gq?xGVDnG5K7o4Y2DfmZ_6_0Qoo+QQ42q&| z4k{|HFUt|KBCv*F89#%c$%8rGfcyD)Su!r2{_#l-V9I>B{YI&UOC6 zpxm6wevwJ3{=g3nWk#g~KXjCZoe!rns9I(m_)*bt;782_Ew=+ddIJ7`|MhN#6T2JB zEmKc3uoWf`{(t}W&cyq1ghYbEPGe7Fu;`)Z|G&R_X9#tqfu|u@bo+D8-yA>uUv)72 z|NiKmuJ_{zMmLZyZBHGr{POze#u>Nr879dnS!B%4|Ns5kI|dDQH}+eqo@!tPYzqIs zZ+R#Az&JxjN#AWo{>^;GNi0gtQyC^QO=6kKI`#689tCE%|KAV1lZHA-%2Nugv+B8p z8~cX6FFrJ1GG|~o^8f$;6aWAJKO@P&a9NUp;mrU4|F=mpFx20WWMBx9WMG&e$-r>o z|NsAXk_-%ek_-%2{{R24A<4i{A<4jSPA9?Q@m!}aL83r5we{XoFk@5d~(>n%b?F1=rkf;P$6vP+zej1^jp}bMU z?f>_>cMR^z+6f{^LM32L0!Sh`U=d!pF%e)sm-mB+y)P^r7(ZC>jJ=qjQ!FvCH z-}KhP?f-X?cOX*Y9m|UU-|xL;dSKx8|NEP_0-%6zWZ0i)3JLlL|NsBL^8bI-W70@ z6mVmh_5b_Dz5l;&+$ZSv|NFnmtTOUaRsWSUG~JxsF8^RCW>RKzQ*hhiZs4}}#fQep z4l*8$>o<4Gv@o;uJ&|tCo zqQQHf$pL~gn-ADdU=-{zgjCHbDhv#uiZf($qWyAarWX>Ext!%#Jq#EaJSOWpE3<;D T@5!Og%B&zAJ)3KtmoowYmBfQP diff --git a/libs/x86/libnv_avc_dec.so b/libs/x86/libnv_avc_dec.so index 8c52cb7f5e84caa28580ba396c6dd800611fcce4..affff12fc086536ab6452e9d7e5dcf231dec19cb 100644 GIT binary patch delta 1548 zcmaFi^}=gH3TufJ14GHgOn)v8DFy}zo_OdKW7pAAgC1sIa`?{rmra=ds>quIK;%w|?XA zP-bLcc)|Np-% z`v3obZ}XXF|NpIvJ4E}o5AX9R8l%~R5ChERG3}}Pp%SDWMrH?N65qE#IOJV zyTvS>YDye?o13tOT&If)%L~O{|Nr;8s3?H^8#-A+Sc9=;UPQe$N&GGHYzW)euDDf z4p1`S_y5qFqEZvx`2n1K!2#a96sLI)zJueYrt`z(Fi}z6halraRAf4tUIzdF|33|! zw1Z#7{RDZ%PYUdn7u_x@CY>%SJd-DgN?6(a1REd`eHh~P;1_aW#e5LOKVGbc#6Cy# zVW?sMet-;nCpr0*s4@FtFlX~-6|p0Xj5j8~6qjd=n9M05&sZ^8Q$k*H&bR;nc|hJ` zU|m}F|Nl$;`~QE(m;e7Q{{8=d{3XJB|Sd8V>58>Fz`d`Nj2BLICf BxIq8_ delta 1556 zcmaFi^}=gH3TucI14GEfOn_GGSSWSD%C zS>CWgl!3vBfq_AYfs4U|nStSeCX-s04Io)N}?^9B=4hfPmvJDjXnIw|HlW z3Jb^z?Z5y3cOLI;epUbM|Nqwi{2hvn3=A*SKo(Da1F;xt>F$TF-tlO)m(?><1JE)>FM1=?B02u}bhE5k1mTq>C z18)BT`}(*Df5$=w28M37?tqGJ53rujkjb+Ir0S2ms7SCdFfbfn z1`H! z{{R2$Gri3hK>Q=U&2Aw69*Bd(f?w4BRsa9L@o=sj14D0$${R>(=w@p@P$B^ez1_e6 z|L$3ZS-=-v#9zHYwOlO=qeCMqx1P7;!=pNu38ib$|QVChOE z8Bi2LWmr^R*dt_`AAmf=muVR~Uad6tkOqvGT}LLMeBe*OR7EoSLdQ{vd$ob((VM5qA=4rs?; z|Nr;8s3?FuSvuK5Sc7rSvHhCtA)?IqadM7GAmjSU`$VJ}KTp0TB3u9T$N&GYyL-zR zdYk9tv?buj|Nq_aklpm-|Nl-Kl^0$=|Nn3OwgZ$5`Talirl{0JcYXjRWvHuLahk{Q z0~|LsogXHbiHg=U{`~*HJ48jMlj&vf|NsBf!1{w<)cpi`B~J?Ml^5MEDh43Wce|+Q zfC9bSMMVP?-YGx9W=TXJhGmI8>L4ctzpw-A*MsQ)@nSV3L2yJLhMF%2mgke2%q3>b z{`d#Tvdf!Y#EvjB{+P@uA{Qqz9@BjZFU;h99@%R6KnXmu