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;
#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)
......
......@@ -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;
......
......@@ -298,6 +298,16 @@ 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 );
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 );
......
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