[FFmpeg-trac] #11195(avformat:new): AVC in MXF container calculates incorrect avg_frame_rate

FFmpeg trac at avcodec.org
Mon Sep 16 22:49:14 EEST 2024


#11195: AVC in MXF container calculates incorrect avg_frame_rate
----------------------------------+--------------------------------------
             Reporter:  ariley    |                     Type:  defect
               Status:  new       |                 Priority:  normal
            Component:  avformat  |                  Version:  git-master
             Keywords:            |               Blocked By:
             Blocking:            |  Reproduced by developer:  0
Analyzed by developer:  0         |
----------------------------------+--------------------------------------
 The AVC essence is interlaced 29.97hz, but ffprobe says the essence is
 14.99fps -- half what is expected:
 {{{
 $ ./ffprobe mxf_avc_incorrect_fps.mxf
 ffprobe version N-117011-gbb91425eb8 Copyright (c) 2007-2024 the FFmpeg
 developers
   built with gcc 12 (Debian 12.2.0-14)
   configuration: --extra-cflags=-g --extra-cxxflags=-g --optflags=-O0
   libavutil      59. 36.100 / 59. 36.100
   libavcodec     61. 13.100 / 61. 13.100
   libavformat    61.  5.101 / 61.  5.101
   libavdevice    61.  2.101 / 61.  2.101
   libavfilter    10.  2.102 / 10.  2.102
   libswscale      8.  2.100 /  8.  2.100
   libswresample   5.  2.100 /  5.  2.100
 [mxf @ 0x5606f2464640] index entry 102 + TemporalOffset 127 = 229, which
 is out of bounds
 Input #0, mxf, from 'mxf_avc_incorrect_fps.mxf':
   Metadata:
     operational_pattern_ul: 060e2b34.04010101.0d010201.01010100
     uid             : 28d57eae-5674-1f1e-91b8-00d028174ef2
     generation_uid  : 32d57eae-5674-1f1e-bd28-00d028174ef2
     company_name    : Omneon Inc.
     product_name    : Omneon Media Subsystem
     modification_date: 2024-09-16T18:08:31.532000Z
     product_version : SB Release 10.2.0.0-eng.3892 (trunk)
     product_version_num: 10.2.0.0.1
     application_platform: Omneon Media Api (mqx)
     product_uid     : 00000000-0000-1000-8000-050e0b010602
     material_package_umid:
 0x060A2B34010101050101062313000BF28ED87EAE56741F1E837500D028174EF2
     timecode        : 00:00:00:00
   Duration: 00:00:03.34, start: 0.000000, bitrate: 13501 kb/s
   Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, top first),
 1920x1080 [SAR 1:1 DAR 16:9], 14.99 fps, 29.97 tbr, 29.97 tbn
       Metadata:
         file_package_umid:
 0x060A2B34010101050101062313004C3738D97EAE56741F1E9FF700D028174EF2
 }}}
 I've tested various versions as far back as 4.1, all of them reporting the
 same 14.99fps.

 It seems like //avformat_find_stream_info()// is miscalculating the value
 of //sti->info->codec_info_duration_fields//:
 {{{
 2806             if (pkt->duration > 0) {
 2807                 const int fields = sti->codec_desc &&
 (sti->codec_desc->props & AV_CODEC_PROP_FIELDS);
 2808                 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE &&
 pkt->pts != AV_NOPTS_VALUE && st->start_time != AV_NOPTS_VALUE && pkt->pts
 >= st->start_time
 2809                     && (uint64_t)pkt->pts - st->start_time <
 INT64_MAX
 2810                 ) {
 2811                     sti->info->codec_info_duration = FFMIN(pkt->pts -
 st->start_time, sti->info->codec_info_duration + pkt->duration);
 2812                 } else
 2813                     sti->info->codec_info_duration += pkt->duration;
 2814                 sti->info->codec_info_duration_fields += sti->parser
 && sti->need_parsing && fields
 2815                                                          ?
 sti->parser->repeat_pict + 1 : 2;
 2816             }
 }}}
 //fields// is always //1//, and //sti->parser->repeat_pict// is always
 //0//, leading to //sti->info->codec_info_duration_fields// having the
 same value as //sti->info->codec_info_duration//.  Then, when we get here
 (where //time_base==1001/30000//):
 {{{
 2924                 av_reduce(&st->avg_frame_rate.num,
 &st->avg_frame_rate.den,
 2925                           sti->info->codec_info_duration_fields *
 (int64_t) st->time_base.den,
 2926                           sti->info->codec_info_duration * 2 *
 (int64_t) st->time_base.num, 60000);
 }}}
 the //avg_frame_rate// ends up being half what it should (//15000/1001//).
-- 
Ticket URL: <https://trac.ffmpeg.org/ticket/11195>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list