<div dir="ltr">Hi all,<div>I'm trying to use ffmpeg as a decoder for a real-time x264 stream that I'm generating. It works fine if I try to decode entire frames, but if I try to decode a single NALU the decoder errors out saying 'no frame'. I've tried using the parser (av_parser_parse2) but the h264 decoder doesnt seem to like that output either. I'm using x264 with annex-b and repeat-headers on. </div>
<div><br></div><div>The encoder config is as follows:<br><br>x264params.b_sliced_threads = 1;<br>x264params.i_slice_max_size = 1350;<br>x264params.i_width = yuvSize.width;<br>x264params.i_height = yuvSize.height;<br>x264params.i_fps_num = 10;<br>
x264params.i_fps_den = 1;<br>x264params.b_vfr_input = 0;<br>x264params.rc.i_bitrate = 1500;<br><br></div><div> // Intra refres:<br>x264params.i_keyint_max = 50000000;<br>x264params.b_intra_refresh = 1;<br><br></div><div>//Rate control:<br>
<br>x264params.rc.i_rc_method = X264_RC_ABR;<br>x264params.rc.i_vbv_buffer_size = 300;<br>x264params.rc.i_vbv_max_bitrate = 1500;<br><br></div><div>//For streaming:<br>x264params.b_repeat_headers = 1;<br>x264params.b_annexb = 1;<br>
<br></div><div>x264_param_apply_profile(&x264params, "baseline");</div><div><br></div><div style><br></div><div style><br></div><div style>I do the encode with:</div><div style>
<p class=""> <span class="">int</span> frame_size = <span class="">x264_encoder_encode</span>(<span class="">x264Encoder</span>, &nals, &i_nals, &<span class="">pic_in</span>, &<span class="">pic_out</span>);</p>
<p class=""><br></p><p class="">Now, since the max slice size is 1350, each packet output is a udp packet of size < MTU (this is true) and sent across the network.<br></p><p class="" style>I iterate over the nals[i].p_payload and send them over to the ffmpeg side for decoding. I receive the correct packet on the remote side. </p>
<p class="" style>If I assemble ALL the NALUs that were output in this frame and feed it directly to the decoder (even without the parser), it works fine! If I feed one NALU at a time, it fails (event with the parse). I'm sending it to the parser like:<br>
</p><p class="" style><br></p><p class="" style>int plen = av_parser_parse2(codecParser, decoderContext, &outbuf, &outside, indata,inlength,0,0,0);</p><p class="" style><br></p><p class="" style>plen always reports that it consumed the entire NALU that I gave it - after consuming a few NALUs, the outsize and outbuf are set to some value. Feeding it into the decoder using:</p>
<p class="" style><br></p><p class="" style> int len = avcodec_decode_video2(decoderContext,decoderOutframe, &gotpic,&avpkt);</p><p class="" style><br></p><p class="" style>Results in it saying 'No frame'. Again, if avpkt.data contains the entire frame (all NALUs concatenated) it will work! </p>
<p class="" style><br></p><p class="" style>I'm obviously doing some obviously wrong - but I really cant figure out why it wont decode a single NALU. Or is this a limitation in ffmpeg?</p><p class="" style><br></p><p class="" style>
Thanks Guys!</p><p class="" style><br></p><p class="" style><br></p></div><div><div dir="ltr"><br><div>--</div><div>Faraz Khan</div><div>Simple Collaboration Screensharing</div><div><a href="http://www.screenhero.com" target="_blank">www.screenhero.com</a></div>
</div>
</div></div>