[Libav-user] Pulldown support in libx264?

Andrew Randrianasulu randrianasulu at gmail.com
Sun Nov 17 10:28:35 EET 2019

Hello, all!

I was trying to see if x264's cli option "piulldown" can be ported to libx264/ffmpeg. 
Not as simple as copy/pasta, it seems :O

in x264.c (from x264 source tree) I see this:

 /* set up pulldown */
    if( opt->i_pulldown && !param->b_vfr_input )
        param->b_pulldown = 1;
        param->b_pic_struct = 1;
        pulldown = &pulldown_values[opt->i_pulldown];
        param->i_timebase_num = param->i_fps_den;
        FAIL_IF_ERROR2( fmod( param->i_fps_num * pulldown->fps_factor, 1 ),
                        "unsupported framerate for chosen pulldown\n" );
        param->i_timebase_den = param->i_fps_num * pulldown->fps_factor;

and then:

    /* Encode frames */
    for( ; !b_ctrl_c && (i_frame < param->i_frame_total || !param->i_frame_total); i_frame++ )
        if( filter.get_frame( opt->hin, &cli_pic, i_frame + opt->i_seek ) )
        x264_picture_init( &pic );
        convert_cli_to_lib_pic( &pic, &cli_pic );

        if( !param->b_vfr_input )
            pic.i_pts = i_frame;

        if( opt->i_pulldown && !param->b_vfr_input )
            pic.i_pic_struct = pulldown->pattern[ i_frame % pulldown->mod ];
            pic.i_pts = (int64_t)( pulldown_pts + 0.5 );
            pulldown_pts += pulldown_frame_duration[pic.i_pic_struct];

I tried to insert similar logic into libx264, but failed %)

in x264.h i see

typedef struct x264_picture_t
    /* In: force picture type (if not auto)
     *     If x264 encoding parameters are violated in the forcing of picture types,
     *     x264 will correct the input picture type and log a warning.
     * Out: type of the picture encoded */
    int     i_type;
    /* In: force quantizer for != X264_QP_AUTO */
    int     i_qpplus1;
    /* In: pic_struct, for pulldown/doubling/etc...used only if b_pic_struct=1.
     *     use pic_struct_e for pic_struct inputs
     * Out: pic_struct element associated with frame */
    int     i_pic_struct;

and enum declared just above this as

enum pic_struct_e
    PIC_STRUCT_AUTO              = 0, // automatically decide (default)
    PIC_STRUCT_PROGRESSIVE       = 1, // progressive frame
    // "TOP" and "BOTTOM" are not supported in x264 (PAFF only)
    PIC_STRUCT_TOP_BOTTOM        = 4, // top field followed by bottom
    PIC_STRUCT_BOTTOM_TOP        = 5, // bottom field followed by top
    PIC_STRUCT_TOP_BOTTOM_TOP    = 6, // top field, bottom field, top field repeated
    PIC_STRUCT_BOTTOM_TOP_BOTTOM = 7, // bottom field, top field, bottom field repeated
    PIC_STRUCT_DOUBLE            = 8, // double frame
    PIC_STRUCT_TRIPLE            = 9, // triple frame

so, it basically number ? Just this number should be put in encoded frames, 
so they can be repeated at decoding according to pattern?

Now, does libx264 allow such manipulation, I mean it eats frames, and feed them to x264 library fuctions, so
just re-doing this dance with pts and timebase and pic_struct should be enough for making pulldown-converted  video?

It seems blu-ray at specific resolutions/framerates demand this type of encoding, see for example

"NB: the next two streams use frame doubling to comply with the Blu-Ray specification:


x264 --bitrate XXXXX --preset veryslow --tune film --bluray-compat --vbv-maxrate 40000 --vbv-bufsize 30000 --level 4.1 --keyint 25 --open-gop --slices 4 
--pulldown double 
--colorprim "bt709" --transfer "bt709" --colormatrix "bt709" --sar 1:1 --pass 1 -o out.264 input.file"

But because pulldown option only supported via x264 cli, it makes creating such streams harder, at least for CinelerraGG

Also, what kind of program can check if this pulldown process  actually was applied to encoded stream? medianfo?

Copy/pasta 'patch' attached ... (it isn't working, not even compiling, just for showing areas I hack on..
I hope at least i bark at correct tree?)

-------------- next part --------------
A non-text attachment was scrubbed...
Name: libx264_non_working.diff
Type: text/x-diff
Size: 2648 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20191117/8385a353/attachment.diff>

More information about the Libav-user mailing list