X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Frawvid.c;h=120c9e391ab77d7cbf9652d127641460c9a2b882;hb=1afc9d6656e7e6a931d80f60efa1efdfd76dd7ff;hp=85b3a8642df94676c193883999478e241e0b0b0a;hpb=c5c06b64c806052086e5772d64e540a8db7e4a9b;p=vlc diff --git a/modules/demux/rawvid.c b/modules/demux/rawvid.c index 85b3a8642d..120c9e391a 100644 --- a/modules/demux/rawvid.c +++ b/modules/demux/rawvid.c @@ -132,7 +132,8 @@ static int Open( vlc_object_t * p_this ) unsigned u_fps_num=0, u_fps_den=1; char *psz_ext; vlc_fourcc_t i_chroma; - unsigned int i_aspect = 0; + unsigned int i_sar_num = 0; + unsigned int i_sar_den = 0; const struct preset_t *p_preset = NULL; const uint8_t *p_peek; bool b_valid = false; @@ -182,7 +183,8 @@ static int Open( vlc_object_t * p_this ) i_height = p_preset->i_height; u_fps_num = p_preset->u_fps_num; u_fps_den = p_preset->u_fps_den; - i_aspect = VOUT_ASPECT_FACTOR * p_preset->u_ar_num / p_preset->u_ar_den; + i_sar_num = p_preset->u_ar_num * p_preset->i_height; + i_sar_den = p_preset->u_ar_den * p_preset->i_width; i_chroma = p_preset->i_chroma; } @@ -226,11 +228,11 @@ static int Open( vlc_object_t * p_this ) READ_FRAC( " F", u_fps_num, u_fps_den ); READ_FRAC( " A", a, b ); #undef READ_FRAC - /* Try to calculate aspect ratio here, rather than store ratio - * in u_ar_{num,den}, since width may be overridden by then. - * Plus, a:b is sar. */ if( b != 0 ) - i_aspect = VOUT_ASPECT_FACTOR * a * i_width / (b * i_height); + { + i_sar_num = a; + i_sar_den = b; + } psz_buf = strstr( psz+9, " C" ); if( psz_buf ) @@ -329,8 +331,8 @@ static int Open( vlc_object_t * p_this ) if( psz_denominator ) { *psz_denominator++ = '\0'; - i_aspect = atoi( psz_tmp ) * VOUT_ASPECT_FACTOR - / atoi( psz_denominator ); + i_sar_num = atoi( psz_tmp ) * i_height; + i_sar_den = atoi( psz_denominator ) * i_width; } free( psz_tmp ); } @@ -349,22 +351,24 @@ static int Open( vlc_object_t * p_this ) } /* fixup anything missing with sensible assumptions */ - if( !i_aspect ) + if( i_sar_num <= 0 || i_sar_den <= 0 ) { /* assume 1:1 sar */ - i_aspect = i_width * VOUT_ASPECT_FACTOR / i_height; + i_sar_num = 1; + i_sar_den = 1; } es_format_Init( &p_sys->fmt_video, VIDEO_ES, i_chroma ); video_format_Setup( &p_sys->fmt_video.video, - i_chroma, i_width, i_height, i_aspect ); + i_chroma, i_width, i_height, + i_sar_num, i_sar_den ); vlc_ureduce( &p_sys->fmt_video.video.i_frame_rate, &p_sys->fmt_video.video.i_frame_rate_base, u_fps_num, u_fps_den, 0); date_Init( &p_sys->pcr, p_sys->fmt_video.video.i_frame_rate, p_sys->fmt_video.video.i_frame_rate_base ); - date_Set( &p_sys->pcr, 1 ); + date_Set( &p_sys->pcr, 0 ); if( !p_sys->fmt_video.video.i_bits_per_pixel ) { @@ -379,6 +383,7 @@ static int Open( vlc_object_t * p_this ) return VLC_SUCCESS; error: + stream_Seek( p_demux->s, 0 ); // Workaround, but y4m uses stream_ReadLines free( p_sys ); return VLC_EGENERIC; } @@ -405,7 +410,7 @@ static int Demux( demux_t *p_demux ) mtime_t i_pcr = date_Get( &p_sys->pcr ); /* Call the pace control */ - es_out_Control( p_demux->out, ES_OUT_SET_PCR, i_pcr ); + es_out_Control( p_demux->out, ES_OUT_SET_PCR, VLC_TS_0 + i_pcr ); if( p_sys->b_y4m ) { @@ -430,7 +435,7 @@ static int Demux( demux_t *p_demux ) return 0; } - p_block->i_dts = p_block->i_pts = i_pcr; + p_block->i_dts = p_block->i_pts = VLC_TS_0 + i_pcr; es_out_Send( p_demux->out, p_sys->p_es_video, p_block ); date_Increment( &p_sys->pcr, 1 );