<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>