<div dir="ltr">Update - <div>I added some code after my main while loop to flush remaining frames from codec. </div><div>Also i have added one more variable while configuring my encoder ie gop_size. these two changes have improved the situation.</div><div>the lost amount of video has come down to approx 0.9 secs. </div><div><br></div><div><i>Question- what codec settings i have missed which are required to make sure that input and output files are identical.  </i></div><div>my current encoder setting code looks like - </div><div><br></div><div><div>            <font face="georgia, serif">c->codec_id           = inputStream->codec->codec_id;</font></div><div><font face="georgia, serif">            c->bit_rate           = inputStream->codec->bit_rate;</font></div><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif">            /* Resolution must be a multiple of two. */</font></div><div><font face="georgia, serif">            c->width              = inputStream->codec->width;</font></div><div><font face="georgia, serif">            c->height             = inputStream->codec->height;</font></div><div><font face="georgia, serif">            c->gop_size           = inputStream->codec->gop_size;</font></div><div><font face="georgia, serif">            </font></div><div><font face="georgia, serif">            c->time_base          = inputStream->codec->time_base;</font></div><div><font face="georgia, serif">            out_stream->time_base = inputStream->time_base;</font></div><div><font face="georgia, serif">            av_stream_set_r_frame_rate(out_stream,av_stream_get_r_frame_rate(inputStream));</font></div><div><font face="georgia, serif">            </font></div><div><font face="georgia, serif">            c->pix_fmt            = AV_PIX_FMT_YUV420P;</font></div><div><font face="georgia, serif">            c->sample_aspect_ratio.num = inputStream->codec->sample_aspect_ratio.num;</font></div><div><font face="georgia, serif">            c->sample_aspect_ratio.den = inputStream->codec->sample_aspect_ratio.den;</font></div></div><div><div><font face="georgia, serif">            if (oc->oformat->flags & AVFMT_GLOBALHEADER)</font></div><div><font face="georgia, serif">                  c->flags |= CODEC_FLAG_GLOBAL_HEADER;</font></div></div><div><br></div><div><br></div><div>following are line from ffmpeg -i </div><div><b>for input file -</b> </div><div>







<p class=""><span class=""><font face="georgia, serif"> Duration: 00:00:30.92, start: 0.040000, bitrate: 998 kb/s</font></span></p><p class=""><span class=""><font face="georgia, serif">    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv), 1280x720 [SAR 1:1 DAR 16:9], 996 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)</font></span></p><p class=""><span class=""><font face="georgia, serif">    Metadata:</font></span></p><p class="">










</p><p class=""><span class=""><font face="georgia, serif">      handler_name    : VideoHandler</font></span></p><p class=""><span class=""><br></span></p><p class=""><b>for output file - </b></p><p class=""><font face="georgia, serif">Duration: 00:00:30.02, start: 0.000000, bitrate: 1022 kb/s</font></p>








<p class=""><span class=""><font face="georgia, serif">    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1019 kb/s, 25.02 fps, 25 tbr, 25k tbn, 100 tbc (default)</font></span></p>
<p class=""><span class=""><font face="georgia, serif">    Metadata:</font></span></p>
<p class=""><span class=""><font face="georgia, serif">      handler_name    : VideoHandler</font></span></p></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 12, 2015 at 3:13 PM, gaurav mishra <span dir="ltr"><<a href="mailto:gauravmishra.itbhu@gmail.com" target="_blank">gauravmishra.itbhu@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,<div>I have written some code which opens up a mp4 file , decodes each frame , does some manipulation on it and encode it back to new container. Issue i am seeing here is i am loosing last 3 sec (approx 65 frames) of video . </div><div>Below is a simplified version of code which i expected to create a identical file.which does no manipulation on frame just decode a frame then encode it back and finally mux it. </div><div><br></div><div><div><font face="georgia, serif">while(1) {</font></div><div><font face="georgia, serif">        </font></div><div><font face="georgia, serif">        ret = av_read_frame(ifmt_ctx, &packet);</font></div><div><font face="georgia, serif">        if(ret < 0) {</font></div><div><font face="georgia, serif">            av_log( NULL , AV_LOG_ERROR , "error reading frame or end of file");</font></div><div><font face="georgia, serif">            break;</font></div><div><font face="georgia, serif">        }</font></div><div><font face="georgia, serif">        AVStream *in_stream = ifmt_ctx->streams[packet.stream_index];</font></div><div><font face="georgia, serif">        AVStream *output_stream = out_stream.format_ctx->streams[packet.stream_index];</font></div><div><font face="georgia, serif">        </font></div><div><font face="georgia, serif">       </font></div><div><font face="georgia, serif">            stream_index = packet.stream_index;</font></div><div><font face="georgia, serif">            frame_decoded = 0;</font></div><div><font face="georgia, serif">            frame = av_frame_alloc();</font></div><div><font face="georgia, serif">            </font></div><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif">            ret = avcodec_decode_video2(in_stream->codec, frame, &frame_decoded, &packet);</font></div><div><font face="georgia, serif">            </font></div><div><font face="georgia, serif">            if(ret<0){</font></div><div><font face="georgia, serif">                av_frame_free(&frame);</font></div><div><font face="georgia, serif">                fprintf(stderr,"could not decode a packet....");</font></div><div><font face="georgia, serif">                return ret;</font></div><div><font face="georgia, serif">            }</font></div><div><font face="georgia, serif">            </font></div><div><font face="georgia, serif">            if(frame_decoded){</font></div><div><font face="georgia, serif">               </font></div><div><font face="georgia, serif">                ptsFactor = 2;</font></div><div><font face="georgia, serif">                frame->pts = ptsFactor*frameEncodedCount ;</font></div><div><font face="georgia, serif">                frameEncodedCount++;</font></div><div><font face="georgia, serif">                </font></div><div><font face="georgia, serif">                av_init_packet(&encoded_packet);</font></div><div><font face="georgia, serif">                </font></div><div><font face="georgia, serif">                encode_success = 0;</font></div><div><font face="georgia, serif">                </font></div><div><font face="georgia, serif">                ret = avcodec_encode_video2(this->out_stream.format_ctx->streams[0]->codec,</font></div><div><font face="georgia, serif">                                            &encoded_packet,</font></div><div><font face="georgia, serif">                                            frame,</font></div><div><font face="georgia, serif">                                            &encode_success);</font></div><div><font face="georgia, serif">                </font></div><div><font face="georgia, serif">                encoded_packet.stream_index = 0;</font></div><div><font face="georgia, serif">                </font></div><div><font face="georgia, serif">                if(encode_success){</font></div><div><font face="georgia, serif">                    </font></div><div><font face="georgia, serif">                    av_packet_rescale_ts(&encoded_packet,</font></div><div><font face="georgia, serif">                                         this->out_stream.format_ctx->streams[0]->codec->time_base,</font></div><div><font face="georgia, serif">                                         this->out_stream.format_ctx->streams[0]->time_base);</font></div><div><font face="georgia, serif">                    </font></div><div><font face="georgia, serif">                    </font></div><div><font face="georgia, serif">                    ret = av_interleaved_write_frame(this->out_stream.format_ctx, &encoded_packet);</font></div><div><font face="georgia, serif">                }</font></div><div><font face="georgia, serif">            }</font></div><div><font face="georgia, serif">                </font></div><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif">}</font></div></div><div><br></div><div>I also noticed that the first above code failed to encode first 60 frames of video. ie</div><div>it successfully decoded frames but didnt enter the if(encode_success) block. Any idea what might be going wrong here. </div><div><br></div></div>
</blockquote></div><br></div>