#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)
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;
/* 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;
}
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;
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;