[vlc-devel] commit: Make it possible to flag blocks as interlaced and use in rawvideo and v4l2 . (Antoine Cellerier )
git version control
git at videolan.org
Sat Oct 3 20:57:38 CEST 2009
vlc | branch: master | Antoine Cellerier <dionoea at videolan.org> | Sat Oct 3 20:38:33 2009 +0200| [db2ec1d16bd39eeb5a38ba3e3470a8d425a71258] | committer: Antoine Cellerier
Make it possible to flag blocks as interlaced and use in rawvideo and v4l2.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=db2ec1d16bd39eeb5a38ba3e3470a8d425a71258
---
include/vlc_block.h | 8 ++++++++
modules/access/v4l2.c | 16 +++++++++++-----
modules/codec/rawvideo.c | 12 +++++++++++-
3 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/include/vlc_block.h b/include/vlc_block.h
index bc56992..4b629fc 100644
--- a/include/vlc_block.h
+++ b/include/vlc_block.h
@@ -78,6 +78,14 @@ typedef struct block_sys_t block_sys_t;
#define BLOCK_FLAG_PREROLL 0x0800
/** This block is corrupted and/or there is data loss */
#define BLOCK_FLAG_CORRUPTED 0x1000
+/** This block contains an interlaced picture with top field first */
+#define BLOCK_FLAG_TOP_FIELD_FIRST 0x2000
+/** This block contains an interlaced picture with bottom field first */
+#define BLOCK_FLAG_BOTTOM_FIELD_FIRST 0x4000
+
+/** This block contains an interlaced picture */
+#define BLOCK_FLAG_INTERLACED_MASK \
+ (BLOCK_FLAG_TOP_FIELD_FIRST|BLOCK_FLAG_BOTTOM_FIELD_FIRST)
#define BLOCK_FLAG_TYPE_MASK \
(BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B|BLOCK_FLAG_TYPE_PB)
diff --git a/modules/access/v4l2.c b/modules/access/v4l2.c
index 94cfc33..f170773 100644
--- a/modules/access/v4l2.c
+++ b/modules/access/v4l2.c
@@ -553,6 +553,7 @@ struct demux_sys_t
float f_fps; /* <= 0.0 mean to grab at full rate */
mtime_t i_video_pts; /* only used when f_fps > 0 */
int i_fourcc;
+ uint32_t i_block_flags;
es_out_id_t *p_es;
@@ -1456,6 +1457,7 @@ static block_t* GrabVideo( vlc_object_t *p_demux, demux_sys_t *p_sys )
/* Timestamp */
p_sys->i_video_pts = p_block->i_pts = p_block->i_dts = mdate();
+ p_block->i_flags |= p_sys->i_block_flags;
return p_block;
}
@@ -2146,29 +2148,33 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
break;
case V4L2_FIELD_INTERLACED:
msg_Dbg( p_obj, "Interlacing setting: interleaved (bottom top if M/NTSC, top bottom otherwise)" );
+ if( p_sys->i_selected_standard_id == V4L2_STD_NTSC )
+ p_sys->i_block_flags = BLOCK_FLAG_BOTTOM_FIELD_FIRST;
+ else
+ p_sys->i_block_flags = BLOCK_FLAG_TOP_FIELD_FIRST;
break;
case V4L2_FIELD_SEQ_TB:
- msg_Dbg( p_obj, "Interlacing setting: sequential top bottom" );
+ msg_Dbg( p_obj, "Interlacing setting: sequential top bottom (TODO)" );
break;
case V4L2_FIELD_SEQ_BT:
- msg_Dbg( p_obj, "Interlacing setting: sequential bottom top" );
+ msg_Dbg( p_obj, "Interlacing setting: sequential bottom top (TODO)" );
break;
case V4L2_FIELD_ALTERNATE:
- msg_Dbg( p_obj, "Interlacing setting: alternate fields" );
+ msg_Dbg( p_obj, "Interlacing setting: alternate fields (TODO)" );
break;
case V4L2_FIELD_INTERLACED_TB:
msg_Dbg( p_obj, "Interlacing setting: interleaved top bottom" );
+ p_sys->i_block_flags = BLOCK_FLAG_TOP_FIELD_FIRST;
break;
case V4L2_FIELD_INTERLACED_BT:
msg_Dbg( p_obj, "Interlacing setting: interleaved bottom top" );
+ p_sys->i_block_flags = BLOCK_FLAG_BOTTOM_FIELD_FIRST;
break;
default:
msg_Warn( p_obj, "Interlacing setting: unknown type (%d)",
fmt.fmt.pix.field );
break;
}
- if( fmt.fmt.pix.field != V4L2_FIELD_NONE )
- msg_Warn( p_obj, "Interlaced inputs haven't been tested. Please report any issue." );
/* Look up final fourcc */
p_sys->i_fourcc = 0;
diff --git a/modules/codec/rawvideo.c b/modules/codec/rawvideo.c
index d699832..db6e82e 100644
--- a/modules/codec/rawvideo.c
+++ b/modules/codec/rawvideo.c
@@ -298,7 +298,17 @@ static picture_t *DecodeFrame( decoder_t *p_dec, block_t *p_block )
FillPicture( p_dec, p_block, p_pic );
p_pic->date = date_Get( &p_sys->pts );
- p_pic->b_progressive = true;
+ if( p_block->i_flags & BLOCK_FLAG_INTERLACED_MASK )
+ {
+ p_pic->b_progressive = false;
+ p_pic->i_nb_fields = 2;
+ if( p_block->i_flags & BLOCK_FLAG_TOP_FIELD_FIRST )
+ p_pic->b_top_field_first = true;
+ else
+ p_pic->b_top_field_first = false;
+ }
+ else
+ p_pic->b_progressive = true;
block_Release( p_block );
return p_pic;
More information about the vlc-devel
mailing list