For testing , a link to one such failing video https://drive.google.com/file/d/0Bz6XfEJZ-9N3X0FSMWR6T3B3U28/view?usp=sharing . Without this patch,
ffprobe -show_frames -print_format compact | grep media_type=video - shows dts=N/A On Fri, Mar 11, 2016 at 12:39 PM, Sasi Inguva <is...@google.com> wrote: > With this patch it doesn't produce invalid DTS for the file you mentioned > tickets/1242/sample.mkv > ./ffmpeg -i sample.mkv -c:v copy -an -t 1 -f framecrc - > > On Fri, Mar 11, 2016 at 12:36 PM, Sasi Inguva <is...@google.com> wrote: > >> Having another go at this. My goal is to fix DTS of H264 videos which are >> shorter than 7 frames and don't have B-frames. Currently ffmpeg will output >> DTS=N/A for such frames. >> >> On Fri, Mar 11, 2016 at 12:34 PM, Sasi Inguva <is...@google.com> wrote: >> >>> Fill DTS if all packets have been read in avformat_find_stream_info, and >>> still >>> has_decode_delay_been_guessed returns false. >>> >>> Signed-off-by: Sasi Inguva <is...@google.com> >>> --- >>> libavformat/utils.c | 37 +++++++++++++++++++++++++++++++++++++ >>> 1 file changed, 37 insertions(+) >>> >>> diff --git a/libavformat/utils.c b/libavformat/utils.c >>> index 5f48de1..f22309d 100644 >>> --- a/libavformat/utils.c >>> +++ b/libavformat/utils.c >>> @@ -877,6 +877,7 @@ static int has_decode_delay_been_guessed(AVStream >>> *st) >>> avpriv_h264_has_num_reorder_frames(st->codec) == >>> st->codec->has_b_frames) >>> return 1; >>> #endif >>> + >>> if (st->codec->has_b_frames<3) >>> return st->nb_decoded_frames >= 7; >>> else if (st->codec->has_b_frames<4) >>> @@ -3165,6 +3166,7 @@ int avformat_find_stream_info(AVFormatContext *ic, >>> AVDictionary **options) >>> int64_t max_stream_analyze_duration; >>> int64_t max_subtitle_analyze_duration; >>> int64_t probesize = ic->probesize; >>> + int eof_reached = 0; >>> >>> flush_codecs = probesize > 0; >>> >>> @@ -3331,6 +3333,7 @@ int avformat_find_stream_info(AVFormatContext *ic, >>> AVDictionary **options) >>> >>> if (ret < 0) { >>> /* EOF or error*/ >>> + eof_reached = 1; >>> break; >>> } >>> >>> @@ -3454,6 +3457,40 @@ int avformat_find_stream_info(AVFormatContext >>> *ic, AVDictionary **options) >>> count++; >>> } >>> >>> + if (eof_reached && ic->internal->packet_buffer) { >>> + int stream_index; >>> + for (stream_index = 0; stream_index < ic->nb_streams; >>> stream_index++) { >>> + AVPacketList *pktl = ic->internal->packet_buffer; >>> + int64_t pts_buffer[MAX_REORDER_DELAY+1]; >>> + >>> + // EOF already reached while reading the stream above. >>> + // So continue with reoordering DTS with whatever delay we >>> have. >>> + int codec_delay = st->codec->has_b_frames; >>> + >>> + st = ic->streams[stream_index]; >>> + >>> + if (st->codec->codec_id != AV_CODEC_ID_H264 || >>> + has_decode_delay_been_guessed(st)) { >>> + continue; >>> + } >>> + >>> + >>> + for (; pktl; pktl = get_next_pkt(ic, st, pktl)) { >>> + if (pktl->pkt.stream_index != stream_index) >>> + continue; >>> + >>> + if (pktl->pkt.pts != AV_NOPTS_VALUE && codec_delay <= >>> MAX_REORDER_DELAY) { >>> + int j; >>> + pts_buffer[0] = pktl->pkt.pts; >>> + for (j = 0; j < codec_delay && pts_buffer[j] > >>> pts_buffer[j + 1]; j++) >>> + FFSWAP(int64_t, pts_buffer[j], pts_buffer[j + 1]); >>> + >>> + pktl->pkt.dts = select_from_pts_buffer(st, >>> pts_buffer, pktl->pkt.dts); >>> + } >>> + } >>> + } >>> + } >>> + >>> if (flush_codecs) { >>> AVPacket empty_pkt = { 0 }; >>> int err = 0; >>> -- >>> 2.7.0.rc3.207.g0ac5344 >>> >>> >> > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel