[PR] avcodec/h264_parser: align field_order default with the decoder (PR #24128)

ngaullier via ffmpeg-devel <[email protected]>
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178663545298.59.97680911046999126@29965ddac10e>
PR #24128 opened by ngaullier
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24128
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24128.patch

Use case: interlaced AVC Intra is typically missing the required information
for proper tff detection.
Currently, the decoder defaults to tff, but the parser defaults to progressive.

./ffmpeg -f lavfi -i testsrc=1920x1080 -codec libx264 -pix_fmt yuv422p10le \
    -x264-params avcintra-class=100:tff=1 -frames 1 tff.h264
./ffprobe tff.h264 -of flat -show_entries stream=field_order:frame=interlaced_frame,top_field_first

Before:
frames.frame.0.interlaced_frame=1
frames.frame.0.top_field_first=1
streams.stream.0.field_order="progressive"

After:
frames.frame.0.interlaced_frame=1
frames.frame.0.top_field_first=1
streams.stream.0.field_order="tt"

Issue since field_order setting in 3f1a7ceb2c604deff.


>From 9e94cff9dcd4d5f4abfd483a6d39d263a73007b6 Mon Sep 17 00:00:00 2001
From: Nicolas Gaullier <[email protected]>
Date: Thu, 13 Aug 2026 17:00:42 +0200
Subject: [PATCH] avcodec/h264_parser: align field_order default with the
 decoder

Use case: interlaced AVC Intra is typically missing the required information
for proper tff detection.
Currently, the decoder defaults to tff, but the parser defaults to progressive.

./ffmpeg -f lavfi -i testsrc=1920x1080 -codec libx264 -pix_fmt yuv422p10le \
    -x264-params avcintra-class=100:tff=1 -frames 1 tff.h264
./ffprobe tff.h264 -of flat -show_entries stream=field_order:frame=interlaced_frame,top_field_first

Before:
frames.frame.0.interlaced_frame=1
frames.frame.0.top_field_first=1
streams.stream.0.field_order="progressive"

After:
frames.frame.0.interlaced_frame=1
frames.frame.0.top_field_first=1
streams.stream.0.field_order="tt"

Issue since field_order setting in 3f1a7ceb2c604deff.

Signed-off-by: Nicolas Gaullier <[email protected]>
---
 libavcodec/h264_parser.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
index 9d64fc603f..af43cad609 100644
--- a/libavcodec/h264_parser.c
+++ b/libavcodec/h264_parser.c
@@ -423,6 +423,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
 
             if (sps->frame_mbs_only_flag) {
                 p->picture_structure = PICT_FRAME;
+                s->field_order = AV_FIELD_PROGRESSIVE;
             } else {
                 if (get_bits1(&nal.gb)) { // field_pic_flag
                     p->picture_structure = PICT_TOP_FIELD + get_bits1(&nal.gb); // bottom_field_flag
@@ -541,8 +542,11 @@ static inline int parse_nal_units(AVCodecParserContext *s,
                         s->field_order = AV_FIELD_TT;
                     else if (field_poc[0] > field_poc[1])
                         s->field_order = AV_FIELD_BB;
-                    else
-                        s->field_order = AV_FIELD_PROGRESSIVE;
+                    else if (sps->mb_aff) {
+                        /* Default to top field first
+                         * This is the same as what the decoder does */
+                        s->field_order = AV_FIELD_TT;
+                    }
                 }
             } else {
                 if (p->picture_structure == PICT_TOP_FIELD)
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.