Commit db2ec1d1 authored by Antoine Cellerier's avatar Antoine Cellerier

Make it possible to flag blocks as interlaced and use in rawvideo and v4l2.

parent beb5d0fd
...@@ -78,6 +78,14 @@ typedef struct block_sys_t block_sys_t; ...@@ -78,6 +78,14 @@ typedef struct block_sys_t block_sys_t;
#define BLOCK_FLAG_PREROLL 0x0800 #define BLOCK_FLAG_PREROLL 0x0800
/** This block is corrupted and/or there is data loss */ /** This block is corrupted and/or there is data loss */
#define BLOCK_FLAG_CORRUPTED 0x1000 #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 \ #define BLOCK_FLAG_TYPE_MASK \
(BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B|BLOCK_FLAG_TYPE_PB) (BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B|BLOCK_FLAG_TYPE_PB)
......
...@@ -553,6 +553,7 @@ struct demux_sys_t ...@@ -553,6 +553,7 @@ struct demux_sys_t
float f_fps; /* <= 0.0 mean to grab at full rate */ float f_fps; /* <= 0.0 mean to grab at full rate */
mtime_t i_video_pts; /* only used when f_fps > 0 */ mtime_t i_video_pts; /* only used when f_fps > 0 */
int i_fourcc; int i_fourcc;
uint32_t i_block_flags;
es_out_id_t *p_es; es_out_id_t *p_es;
...@@ -1456,6 +1457,7 @@ static block_t* GrabVideo( vlc_object_t *p_demux, demux_sys_t *p_sys ) ...@@ -1456,6 +1457,7 @@ static block_t* GrabVideo( vlc_object_t *p_demux, demux_sys_t *p_sys )
/* Timestamp */ /* Timestamp */
p_sys->i_video_pts = p_block->i_pts = p_block->i_dts = mdate(); 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; return p_block;
} }
...@@ -2146,29 +2148,33 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux ) ...@@ -2146,29 +2148,33 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux )
break; break;
case V4L2_FIELD_INTERLACED: case V4L2_FIELD_INTERLACED:
msg_Dbg( p_obj, "Interlacing setting: interleaved (bottom top if M/NTSC, top bottom otherwise)" ); 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; break;
case V4L2_FIELD_SEQ_TB: 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; break;
case V4L2_FIELD_SEQ_BT: 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; break;
case V4L2_FIELD_ALTERNATE: case V4L2_FIELD_ALTERNATE:
msg_Dbg( p_obj, "Interlacing setting: alternate fields" ); msg_Dbg( p_obj, "Interlacing setting: alternate fields (TODO)" );
break; break;
case V4L2_FIELD_INTERLACED_TB: case V4L2_FIELD_INTERLACED_TB:
msg_Dbg( p_obj, "Interlacing setting: interleaved top bottom" ); msg_Dbg( p_obj, "Interlacing setting: interleaved top bottom" );
p_sys->i_block_flags = BLOCK_FLAG_TOP_FIELD_FIRST;
break; break;
case V4L2_FIELD_INTERLACED_BT: case V4L2_FIELD_INTERLACED_BT:
msg_Dbg( p_obj, "Interlacing setting: interleaved bottom top" ); msg_Dbg( p_obj, "Interlacing setting: interleaved bottom top" );
p_sys->i_block_flags = BLOCK_FLAG_BOTTOM_FIELD_FIRST;
break; break;
default: default:
msg_Warn( p_obj, "Interlacing setting: unknown type (%d)", msg_Warn( p_obj, "Interlacing setting: unknown type (%d)",
fmt.fmt.pix.field ); fmt.fmt.pix.field );
break; 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 */ /* Look up final fourcc */
p_sys->i_fourcc = 0; p_sys->i_fourcc = 0;
......
...@@ -298,6 +298,16 @@ static picture_t *DecodeFrame( decoder_t *p_dec, block_t *p_block ) ...@@ -298,6 +298,16 @@ static picture_t *DecodeFrame( decoder_t *p_dec, block_t *p_block )
FillPicture( p_dec, p_block, p_pic ); FillPicture( p_dec, p_block, p_pic );
p_pic->date = date_Get( &p_sys->pts ); p_pic->date = date_Get( &p_sys->pts );
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; p_pic->b_progressive = true;
block_Release( p_block ); block_Release( p_block );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment