X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=output%2Fmatroska.c;h=91f42e5bd79956a26ba69e0bd05702103b6bf882;hb=64db190d1157916a75656101fdf51e6bd00ba6e3;hp=b1c3f13e389654e7e1ff43fd7510452c4c335b1d;hpb=d7ccd89f1bea53c8c524f8e6eb963d57defb6813;p=x264 diff --git a/output/matroska.c b/output/matroska.c index b1c3f13e..91f42e5b 100644 --- a/output/matroska.c +++ b/output/matroska.c @@ -1,7 +1,7 @@ /***************************************************************************** * matroska.c: matroska muxer ***************************************************************************** - * Copyright (C) 2005-2015 x264 project + * Copyright (C) 2005-2016 x264 project * * Authors: Mike Matsnev * @@ -62,9 +62,14 @@ static int open_file( char *psz_filename, hnd_t *p_handle, cli_output_opt_t *opt return 0; } +#define STEREO_COUNT 7 +static const uint8_t stereo_modes[STEREO_COUNT] = {5,9,7,1,3,13,0}; +static const uint8_t stereo_w_div[STEREO_COUNT] = {1,2,1,2,1,1,1}; +static const uint8_t stereo_h_div[STEREO_COUNT] = {1,1,2,1,2,1,1}; + static int set_param( hnd_t handle, x264_param_t *p_param ) { - mkv_hnd_t *p_mkv = handle; + mkv_hnd_t *p_mkv = handle; int64_t dw, dh; if( p_param->i_fps_num > 0 && !p_param->b_vfr_input ) @@ -77,25 +82,27 @@ static int set_param( hnd_t handle, x264_param_t *p_param ) p_mkv->frame_duration = 0; } - p_mkv->width = p_mkv->d_width = p_param->i_width; - p_mkv->height = p_mkv->d_height = p_param->i_height; + dw = p_mkv->width = p_param->i_width; + dh = p_mkv->height = p_param->i_height; p_mkv->display_size_units = DS_PIXELS; - p_mkv->stereo_mode = p_param->i_frame_packing; - + p_mkv->stereo_mode = -1; + if( p_param->i_frame_packing >= 0 && p_param->i_frame_packing < STEREO_COUNT ) + { + p_mkv->stereo_mode = stereo_modes[p_param->i_frame_packing]; + dw /= stereo_w_div[p_param->i_frame_packing]; + dh /= stereo_h_div[p_param->i_frame_packing]; + } if( p_param->vui.i_sar_width && p_param->vui.i_sar_height && p_param->vui.i_sar_width != p_param->vui.i_sar_height ) { if ( p_param->vui.i_sar_width > p_param->vui.i_sar_height ) { - dw = (int64_t)p_param->i_width * p_param->vui.i_sar_width / p_param->vui.i_sar_height; - dh = p_param->i_height; + dw = dw * p_param->vui.i_sar_width / p_param->vui.i_sar_height; } else { - dw = p_param->i_width; - dh = (int64_t)p_param->i_height * p_param->vui.i_sar_height / p_param->vui.i_sar_width; + dh = dh * p_param->vui.i_sar_height / p_param->vui.i_sar_width; } - - p_mkv->d_width = (int)dw; - p_mkv->d_height = (int)dh; } + p_mkv->d_width = (int)dw; + p_mkv->d_height = (int)dh; p_mkv->i_timebase_num = p_param->i_timebase_num; p_mkv->i_timebase_den = p_param->i_timebase_den; @@ -150,11 +157,11 @@ static int write_headers( hnd_t handle, x264_nal_t *p_nal ) avcC, avcC_len, p_mkv->frame_duration, 50000, p_mkv->width, p_mkv->height, p_mkv->d_width, p_mkv->d_height, p_mkv->display_size_units, p_mkv->stereo_mode ); + free( avcC ); + if( ret < 0 ) return ret; - free( avcC ); - // SEI if( !p_mkv->b_writing_frame )