Merge "media: dvb: mpq: Add Support to use Deinterlacer"
diff --git a/drivers/media/dvb/mpq/video/mpq_dvb_video.c b/drivers/media/dvb/mpq/video/mpq_dvb_video.c
index 22d37e9..229a81a 100644
--- a/drivers/media/dvb/mpq/video/mpq_dvb_video.c
+++ b/drivers/media/dvb/mpq/video/mpq_dvb_video.c
@@ -53,6 +53,7 @@
 				"dvb-vid-3",
 };
 
+static enum scan_format map_scan_type(enum vdec_interlaced_format type);
 static int mpq_int_vid_dec_decode_frame(struct video_client_ctx *client_ctx,
 				struct video_data_buffer *input_frame);
 static int mpq_int_vid_dec_get_buffer_req(struct video_client_ctx *client_ctx,
@@ -2120,6 +2121,8 @@
 				vdec_msg_info.msgdata.output_frame.time_stamp;
 		ev->u.buffer.offset      =
 				vdec_msg_info.msgdata.output_frame.offset;
+		ev->u.buffer.interlaced_format = map_scan_type(vdec_msg_info.\
+				msgdata.output_frame.interlaced_format);
 		break;
 	case VDEC_MSG_RESP_START_DONE:
 		DBG("VIDEO_EVENT_DECODER_PLAYING\n");
@@ -2161,6 +2164,8 @@
 				vdec_msg_info.msgdata.output_frame.time_stamp;
 		ev->u.buffer.offset      =
 				vdec_msg_info.msgdata.output_frame.offset;
+		ev->u.buffer.interlaced_format = map_scan_type(vdec_msg_info.\
+				msgdata.output_frame.interlaced_format);
 		break;
 	case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
 		DBG("VIDEO_EVENT_INPUT_FLUSH_DONE\n");
@@ -2176,6 +2181,17 @@
 	return 0;
 }
 
+static enum scan_format map_scan_type(enum vdec_interlaced_format type)
+{
+	if (type == VDEC_InterlaceFrameProgressive)
+		return INTERLACE_FRAME_PROGRESSIVE;
+	if (type == VDEC_InterlaceInterleaveFrameTopFieldFirst)
+		return INTERLACE_INTERLEAVE_FRAME_TOP_FIELD_FIRST;
+	if (type == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
+		return INTERLACE_INTERLEAVE_FRAME_BOTTOM_FIELD_FIRST;
+	return INTERLACE_FRAME_PROGRESSIVE;
+}
+
 static int mpq_dvb_video_play(struct mpq_dvb_video_inst *dev_inst)
 {
 	return mpq_int_vid_dec_start_stop(dev_inst->client_ctx, true);
diff --git a/include/linux/dvb/video.h b/include/linux/dvb/video.h
index 2a2a53d..6c42099 100644
--- a/include/linux/dvb/video.h
+++ b/include/linux/dvb/video.h
@@ -151,6 +151,12 @@
 	struct video_buffer_prop output_buf_prop; /* Output Buffer Prop */
 };
 
+enum scan_format {
+	INTERLACE_FRAME_PROGRESSIVE,
+	INTERLACE_INTERLEAVE_FRAME_TOP_FIELD_FIRST,
+	INTERLACE_INTERLEAVE_FRAME_BOTTOM_FIELD_FIRST
+};
+
 /* Video Data Buffer Structure for Input and Output */
 struct video_data_buffer {
 	void __user *bufferaddr; /* Pointer to Buffer */
@@ -161,6 +167,7 @@
 	void *client_data;
 	void *ip_buffer_tag;
 	__u64 pts;
+	enum scan_format interlaced_format;
 };
 
 struct video_h264_mv {