[vlc-devel] commit: Adapt transcode to use the new croppadd video filter when needed. ( Antoine Cellerier )
git version control
git at videolan.org
Mon Jun 2 18:59:08 CEST 2008
vlc | branch: master | Antoine Cellerier <dionoea at videolan.org> | Sat Mar 8 22:36:04 2008 +0100| [efc571987f4047c0454f75d3ee30ba4df3693fa7]
Adapt transcode to use the new croppadd video filter when needed.
Do not use knowledge about the FFmpeg version in transcode.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=efc571987f4047c0454f75d3ee30ba4df3693fa7
---
modules/stream_out/transcode.c | 143 ++++++++++++++++++++--------------------
1 files changed, 72 insertions(+), 71 deletions(-)
diff --git a/modules/stream_out/transcode.c b/modules/stream_out/transcode.c
index afebc8c..a8e8b9b 100644
--- a/modules/stream_out/transcode.c
+++ b/modules/stream_out/transcode.c
@@ -2327,7 +2327,7 @@ static int transcode_video_process( sout_stream_t *p_stream,
id->i_filter++;
}
-#if (defined(HAVE_FFMPEG_SWSCALE_H) || defined(HAVE_LIBSWSCALE_TREE)) || defined(HAVE_LIBSWSCALE_SWSCALE_H)
+ /* Take care of the scaling and chroma conversions */
if( ( id->p_decoder->fmt_out.video.i_chroma !=
id->p_encoder->fmt_in.video.i_chroma ) ||
( id->p_decoder->fmt_out.video.i_width !=
@@ -2337,67 +2337,63 @@ static int transcode_video_process( sout_stream_t *p_stream,
{
id->pp_filter[id->i_filter] =
transcode_video_filter_new( p_stream,
- &id->p_decoder->fmt_out,
- &id->p_encoder->fmt_in,
- NULL, "scale" );
+ &id->p_decoder->fmt_out, &id->p_encoder->fmt_in,
+ /* FIXME don't take croppadding changes into account */
+ NULL, "scale" );
if( !id->pp_filter[id->i_filter] )
{
- p_pic->pf_release( p_pic );
- transcode_video_close( p_stream, id );
- id->b_transcode = false;
- return VLC_EGENERIC;
+ es_format_t fmt_middle;
+ es_format_Copy( &fmt_middle, &id->p_decoder->fmt_out );
+ fmt_middle.video.i_chroma = id->p_encoder->fmt_in.video.i_chroma;
+
+ /* Try doing the chroma conversion first ... */
+ if( id->p_decoder->fmt_out.video.i_chroma !=
+ id->p_encoder->fmt_in.video.i_chroma )
+ {
+ id->pp_filter[id->i_filter] =
+ transcode_video_filter_new( p_stream,
+ &id->p_decoder->fmt_out, &fmt_middle,
+ NULL, "chroma" ); /* FIXME: doesn't exist yet */
+ if( !id->pp_filter[id->i_filter] )
+ {
+ es_format_Clean( &fmt_middle );
+ p_pic->pf_release( p_pic );
+ transcode_video_close( p_stream, id );
+ id->b_transcode = false;
+ return VLC_EGENERIC;
+ }
+ id->i_filter++;
+ }
+
+ /* ... and then the scaling */
+ if( ( id->p_decoder->fmt_out.video.i_width !=
+ id->p_encoder->fmt_out.video.i_width ) ||
+ ( id->p_decoder->fmt_out.video.i_height !=
+ id->p_encoder->fmt_out.video.i_height ) )
+ {
+ id->pp_filter[id->i_filter] =
+ transcode_video_filter_new( p_stream,
+ &fmt_middle, &id->p_encoder->fmt_in,
+ /* FIXME don't take croppadding changes into account */
+ NULL, "scale" );
+ if( !id->pp_filter[id->i_filter] )
+ {
+ es_format_Clean( &fmt_middle );
+ p_pic->pf_release( p_pic );
+ transcode_video_close( p_stream, id );
+ id->b_transcode = false;
+ return VLC_EGENERIC;
+ }
+ id->i_filter++;
+ }
+ es_format_Clean( &fmt_middle );
}
- id->i_filter++;
- }
-#if 0 /* FIXME: */
- /* we don't do chroma conversion or scaling in croppad */
-// es_format_t fmt_in, fmt_out;
-// es_format_Copy( &fmt_out, &id->p_encoder->fmt_in );
-// es_format_Copy( &fmt_in, &id->p_encoder->fmt_in );
-
- if( ( id->p_decoder->fmt_out.video.i_chroma ==
- id->p_encoder->fmt_in.video.i_chroma ) &&
-
- ( ( (int)id->p_decoder->fmt_out.video.i_width !=
- p_sys->i_crop_width ) ||
- ( p_sys->i_crop_width != p_sys->i_nopadd_width ) ||
- ( p_sys->i_nopadd_width !=
- (int)id->p_encoder->fmt_out.video.i_width ) ||
-
- ( (int)id->p_decoder->fmt_out.video.i_height !=
- p_sys->i_crop_height ) ||
- ( p_sys->i_crop_height != p_sys->i_nopadd_height ) ||
- ( p_sys->i_nopadd_height !=
- (int)id->p_encoder->fmt_out.video.i_height ) ) )
- {
- id->pp_filter[id->i_filter] =
- transcode_video_filter_new( p_stream,
- &id->p_decoder->fmt_out,
- &id->p_encoder->fmt_in,
- NULL, "croppadd" );
- if( id->pp_filter[id->i_filter] )
- {
- /* Set crop and padding information */
- id->pp_filter[id->i_filter]->fmt_in.video.i_x_offset = p_sys->i_src_x_offset;
- id->pp_filter[id->i_filter]->fmt_in.video.i_y_offset = p_sys->i_src_y_offset;
- id->pp_filter[id->i_filter]->fmt_in.video.i_visible_width = p_sys->i_crop_width;
- id->pp_filter[id->i_filter]->fmt_in.video.i_visible_height = p_sys->i_crop_height;
-
- id->pp_filter[id->i_filter]->fmt_out.video.i_x_offset = p_sys->i_dst_x_offset;
- id->pp_filter[id->i_filter]->fmt_out.video.i_y_offset = p_sys->i_dst_y_offset;
- id->pp_filter[id->i_filter]->fmt_out.video.i_visible_width = p_sys->i_nopadd_width;
- id->pp_filter[id->i_filter]->fmt_out.video.i_visible_height = p_sys->i_nopadd_height;
-
+ else
id->i_filter++;
- }
}
-#endif
-#else
- /* Check if we need a filter for chroma conversion or resizing */
- if( id->p_decoder->fmt_out.video.i_chroma !=
- id->p_encoder->fmt_in.video.i_chroma ||
- (int)id->p_decoder->fmt_out.video.i_width != p_sys->i_crop_width ||
+ /* Take care of croping and padding */
+ if( (int)id->p_decoder->fmt_out.video.i_width != p_sys->i_crop_width ||
p_sys->i_crop_width != p_sys->i_nopadd_width ||
p_sys->i_nopadd_width != (int)id->p_encoder->fmt_out.video.i_width ||
@@ -2405,11 +2401,27 @@ static int transcode_video_process( sout_stream_t *p_stream,
p_sys->i_crop_height != p_sys->i_nopadd_height ||
p_sys->i_nopadd_height != (int)id->p_encoder->fmt_out.video.i_height)
{
+ /* Set crop and padding information */
+ es_format_t fmt_in, fmt_out;
+ es_format_Copy( &fmt_in, &id->p_encoder->fmt_in );
+ fmt_in.video.i_x_offset = p_sys->i_src_x_offset;
+ fmt_in.video.i_y_offset = p_sys->i_src_y_offset;
+ fmt_in.video.i_visible_width = p_sys->i_crop_width;
+ fmt_in.video.i_visible_height = p_sys->i_crop_height;
+
+ es_format_Copy( &fmt_in, &id->p_encoder->fmt_in );
+ fmt_out.video.i_x_offset = p_sys->i_dst_x_offset;
+ fmt_out.video.i_y_offset = p_sys->i_dst_y_offset;
+ fmt_out.video.i_visible_width = id->p_encoder->fmt_in.video.i_width;// p_sys->i_nopadd_width;
+ fmt_out.video.i_visible_height = id->p_encoder->fmt_in.video.i_height; // p_sys->i_nopadd_height;
+
id->pp_filter[id->i_filter] =
transcode_video_filter_new( p_stream,
- &id->p_decoder->fmt_out,
- &id->p_encoder->fmt_in,
- NULL, "crop padd" );
+ &fmt_in, &fmt_out, NULL, "croppadd" );
+
+ es_format_Clean( &fmt_in );
+ es_format_Clean( &fmt_out );
+
if( !id->pp_filter[id->i_filter] )
{
p_pic->pf_release( p_pic );
@@ -2418,20 +2430,9 @@ static int transcode_video_process( sout_stream_t *p_stream,
return VLC_EGENERIC;
}
- /* Set crop and padding information */
- id->pp_filter[id->i_filter]->fmt_in.video.i_x_offset = p_sys->i_src_x_offset;
- id->pp_filter[id->i_filter]->fmt_in.video.i_y_offset = p_sys->i_src_y_offset;
- id->pp_filter[id->i_filter]->fmt_in.video.i_visible_width = p_sys->i_crop_width;
- id->pp_filter[id->i_filter]->fmt_in.video.i_visible_height = p_sys->i_crop_height;
-
- id->pp_filter[id->i_filter]->fmt_out.video.i_x_offset = p_sys->i_dst_x_offset;
- id->pp_filter[id->i_filter]->fmt_out.video.i_y_offset = p_sys->i_dst_y_offset;
- id->pp_filter[id->i_filter]->fmt_out.video.i_visible_width = p_sys->i_nopadd_width;
- id->pp_filter[id->i_filter]->fmt_out.video.i_visible_height = p_sys->i_nopadd_height;
-
id->i_filter++;
}
-#endif
+
for( i = 0; (i < p_sys->i_vfilters) && (id->i_ufilter < TRANSCODE_FILTERS); i++ )
{
id->pp_ufilter[id->i_ufilter] =
More information about the vlc-devel
mailing list