X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Frawvid.c;h=82e4daaa38458e2087250f489d308bb4414c44ad;hb=314f2f9409b347f3c3fae70ec851ae394f085aec;hp=8a127275a0c7a90d0e404e58458ed5a47e6f22a1;hpb=174f75debc6ff4b0b3a7037bc21e7b77bfe2a9d8;p=vlc diff --git a/modules/demux/rawvid.c b/modules/demux/rawvid.c index 8a127275a0..82e4daaa38 100644 --- a/modules/demux/rawvid.c +++ b/modules/demux/rawvid.c @@ -33,7 +33,6 @@ #include #include #include -#include /* vout_InitFormat */ #include /***************************************************************************** @@ -69,12 +68,12 @@ vlc_module_begin () set_subcategory( SUBCAT_INPUT_DEMUX ) set_callbacks( Open, Close ) add_shortcut( "rawvideo" ) - add_string( "rawvid-fps", NULL, NULL, FPS_TEXT, FPS_LONGTEXT, false ) - add_integer( "rawvid-width", 0, 0, WIDTH_TEXT, WIDTH_LONGTEXT, 0 ) - add_integer( "rawvid-height", 0, 0, HEIGHT_TEXT, HEIGHT_LONGTEXT, 0 ) - add_string( "rawvid-chroma", NULL, NULL, CHROMA_TEXT, CHROMA_LONGTEXT, + add_string( "rawvid-fps", NULL, FPS_TEXT, FPS_LONGTEXT, false ) + add_integer( "rawvid-width", 0, WIDTH_TEXT, WIDTH_LONGTEXT, 0 ) + add_integer( "rawvid-height", 0, HEIGHT_TEXT, HEIGHT_LONGTEXT, 0 ) + add_string( "rawvid-chroma", NULL, CHROMA_TEXT, CHROMA_LONGTEXT, true ) - add_string( "rawvid-aspect-ratio", NULL, NULL, + add_string( "rawvid-aspect-ratio", NULL, ASPECT_RATIO_TEXT, ASPECT_RATIO_LONGTEXT, true ) vlc_module_end () @@ -131,12 +130,11 @@ static int Open( vlc_object_t * p_this ) demux_sys_t *p_sys; int i_width=-1, i_height=-1; unsigned u_fps_num=0, u_fps_den=1; - char *psz_ext; - vlc_fourcc_t i_chroma; - unsigned int i_aspect = 0; + vlc_fourcc_t i_chroma = 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; bool b_y4m = false; if( stream_Peek( p_demux->s, &p_peek, 9 ) == 9 ) @@ -144,29 +142,33 @@ static int Open( vlc_object_t * p_this ) /* http://wiki.multimedia.cx/index.php?title=YUV4MPEG2 */ if( !strncmp( (char *)p_peek, "YUV4MPEG2", 9 ) ) { - b_valid = true; b_y4m = true; + goto valid; } } - /* guess preset based on file extension */ - psz_ext = strrchr( p_demux->psz_path, '.' ); - if( psz_ext ) + if( !p_demux->b_force ) { + /* guess preset based on file extension */ + if( !p_demux->psz_file ) + return VLC_EGENERIC; + + const char *psz_ext = strrchr( p_demux->psz_file, '.' ); + if( !psz_ext ) + return VLC_EGENERIC; psz_ext++; - for( int i = 0; p_presets[i].psz_ext ; i++ ) + + for( unsigned i = 0; p_presets[i].psz_ext ; i++ ) { if( !strcasecmp( psz_ext, p_presets[i].psz_ext ) ) { p_preset = &p_presets[i]; - b_valid = true; - break; + goto valid; } } - } - if( !b_valid && !p_demux->b_force ) return VLC_EGENERIC; - + } +valid: /* Set p_input field */ p_demux->pf_demux = Demux; p_demux->pf_control = Control; @@ -183,7 +185,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; } @@ -227,11 +230,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 ) @@ -330,8 +333,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,23 +352,31 @@ static int Open( vlc_object_t * p_this ) goto error; } + if( i_chroma == 0 ) + { + msg_Err( p_demux, "invalid or no chroma specified." ); + goto error; + } + /* 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 ); - vout_InitFormat( &p_sys->fmt_video.video, i_chroma, i_width, i_height, - i_aspect ); + video_format_Setup( &p_sys->fmt_video.video, + 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 ) { @@ -380,6 +391,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; } @@ -406,7 +418,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 ) { @@ -431,7 +443,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 );