[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 ) )
break;
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
http://www.x264bluray.com/home/720p-encoding
"NB: the next two streams use frame doubling to comply with the Blu-Ray specification:
720p25
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