Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 466a22af authored by Haifeng Xu's avatar Haifeng Xu
Browse files

media: dvb: add support for extradata handling and trickmode play



The extradata handling support is added for extradata types.
Trickmode play support is also added for fast forward, and rewind.
The smooth trick mode playback is supported too.

Change-Id: I8535c1e1c831e31b8c3aab73f9806e5639e9b9be
Signed-off-by: default avatarHaifeng Xu <haifeng@codeaurora.org>
parent 5caca646
Loading
Loading
Loading
Loading
+1127 −252

File changed.

Preview size limit exceeded, changes collapsed.

+49 −7
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
#define MPQ_DBG_INFO  "mpq_video:%d "
#define MPQ_VID_DEC_NAME "mpq_vidc_dec"

#define TRICKMODE_SUPPORT

extern int mpq_debug;
enum {
	MPQ_ERR = 0x001,
@@ -28,7 +30,7 @@ enum {
#define dprintk(dbg_mask, fmt, arg...)    \
	do { \
		if (mpq_debug & dbg_mask) { \
			pr_debug(MPQ_DBG_INFO fmt, dbg_mask, ## arg); \
			printk(MPQ_DBG_INFO fmt, dbg_mask, ## arg); \
		} \
	} while (0)

@@ -51,13 +53,15 @@ enum {
#define MPQ_DVB_OUTPUT_BUF_SETUP_BIT	0x00000020
#define MPQ_DVB_INPUT_STREAMON_BIT		0x00000040
#define MPQ_DVB_OUTPUT_STREAMON_BIT		0x00000080
#define MPQ_DVB_FLUSH_DONE_BIT			0x00000100
#define MPQ_DVB_FLUSH_IN_PROGRESS_BIT	0x00000200
#define MPQ_DVB_EVENT_FLUSH_DONE_BIT		0x00000100
#define MPQ_DVB_INPUT_FLUSH_IN_PROGRESS_BIT	0x00000200
#define MPQ_DVB_OUTPUT_FLUSH_IN_PROGRESS_BIT	0x00000400

#define DEFAULT_INPUT_BUF_SIZE	        (1024*1024)
#define DEFAULT_INPUT_BUF_NUM		16

#define MPQ_VID_DEC_NAME "mpq_vidc_dec"
#define EXTRADATA_HANDLING
#define EXTRADATA_IDX(__num_planes) (__num_planes - 1)

enum {
@@ -71,6 +75,11 @@ enum {
	INPUT_MODE_RING
};

enum {
	MPQ_INPUT_BUFFER_FREE,
	MPQ_INPUT_BUFFER_IN_USE
};

enum {
	MPQ_MSG_OUTPUT_BUFFER_DONE,
	MPQ_MSG_VIDC_EVENT
@@ -99,7 +108,16 @@ struct mpq_msg_q_msg {
	struct list_head	list;
	u32			msg_type;
};
#ifdef EXTRADATA_HANDLING

struct mpq_pkt_msg {
	struct list_head	list;
	int	ion_fd;
	u32		offset;
	u32		len;
	u64		pts;
};


struct mpq_extradata {
	int index;
	u32	uaddr;
@@ -108,9 +126,10 @@ struct mpq_extradata {
	int	ion_fd;
	int fd_offset;
};
#endif

struct buffer_info {
	int			index;
	int			state;
	enum v4l2_buf_type	buf_type;
	u32			size;
	u32			offset;
@@ -120,10 +139,11 @@ struct buffer_info {
	u32			dev_addr;
	u32			kernel_vaddr;
	u32			buf_offset;
	u64			pts;
	struct msm_smem     *handle;
#ifdef EXTRADATA_HANDLING

	struct mpq_extradata extradata;
#endif

};

struct mpq_ring_buffer {
@@ -162,13 +182,35 @@ struct v4l2_instance {
	u32				input_buf_count;
	u32				num_output_buffers;
	u32				output_buf_count;

	u32				flag;
	u32				state;
	u32		vidc_etb;
	u32		vidc_ebd;
	u32		vidc_ftb;
	u32		vidc_fbd;
	struct mutex flush_lock;

	struct msm_smem     *extradata_handle;
	u32					extradata_types;
	u32					extradata_size;
	struct extradata_buffer extradata;


	int		playback_mode;

};

struct mpq_dmx_source {
	struct mpq_streambuffer *stream_buffer;
	wait_queue_head_t		dmx_wait;
	int						device_id;
#ifdef DMX_NO_COPY
	struct video_data_buffer dmx_video_buf;
	struct list_head		pkt_queue;
	struct semaphore		pkt_sem;
	wait_queue_head_t		pkt_wait;
#endif
};

struct mpq_dvb_video_instance {
+2 −0
Original line number Diff line number Diff line
@@ -1051,6 +1051,8 @@ void *msm_vidc_smem_get_client(void *instance)

	return inst->mem_client;
}
EXPORT_SYMBOL(msm_vidc_smem_get_client);

static void *vidc_get_userptr(void *alloc_ctx, unsigned long vaddr,
				unsigned long size, int write)
{
+39 −0
Original line number Diff line number Diff line
@@ -30,6 +30,25 @@
#include <time.h>
#endif

#define V4L2_MPEG_VIDC_EXTRADATA_MB_QUANTIZATION_BIT	0x00000001
#define V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO_BIT	0x00000002
#define V4L2_MPEG_VIDC_EXTRADATA_VC1_FRAMEDISP_BIT		0x00000004
#define V4L2_MPEG_VIDC_EXTRADATA_VC1_SEQDISP_BIT		0x00000008
#define V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP_BIT			0x00000010
#define V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING_BIT	0x00000020
#define V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE_BIT			0x00000040
#define V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW_BIT		0x00000080
#define V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI_BIT	0x00000100
#define V4L2_MPEG_VIDC_EXTRADATA_CLOSED_CAPTION_UD_BIT	0x00000200
#define V4L2_MPEG_VIDC_EXTRADATA_AFD_UD_BIT 0x00000400
#define V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO_BIT	0x00000800
#define V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB_BIT	0x00001000
#define V4L2_MPEG_VIDC_EXTRADATA_METADATA_FILLER_BIT	0x00002000
#define V4L2_MPEG_VIDC_INDEX_EXTRADATA_INPUT_CROP_BIT	0x00004000
#define V4L2_MPEG_VIDC_INDEX_EXTRADATA_DIGITAL_ZOOM_BIT	0x00008000
#define V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO_BIT	0x00010000
#define V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP_BIT		0x00020000

typedef enum {
	VIDEO_FORMAT_4_3,     /* Select 4:3 format */
	VIDEO_FORMAT_16_9,    /* Select 16:9 format. */
@@ -68,6 +87,12 @@ enum video_out_format_t {
	VIDEO_YUV_FORMAT_TILE_4x2
};

enum video_playback_mode_t {
	VIDEO_PLAYBACK_NORMAL = 0,
	VIDEO_PLAYBACK_TRICKMODE_COARSE = 1,
	VIDEO_PLAYBACK_TRICKMODE_SMOOTH = 2
};

typedef struct {
	int w;
	int h;
@@ -112,6 +137,9 @@ typedef enum {
#define VIDEO_CMD_CLEAR_INPUT_BUFFER  (18)
#define VIDEO_CMD_CLEAR_OUTPUT_BUFFER (19)
#define VIDEO_CMD_SET_BUFFER_COUNT    (20)
#define VIDEO_CMD_SET_EXTRADATA_TYPES  (21)
#define VIDEO_CMD_SET_EXTRADATA_BUFFER (22)
#define VIDEO_CMD_SET_PLAYBACK_MODE		(23)

/* Flags for VIDEO_CMD_FREEZE */
#define VIDEO_CMD_FREEZE_TO_BLACK	(1 << 0)
@@ -147,6 +175,7 @@ struct video_buffer_req {
	unsigned int num_output_buffers; /* Number of Output Buffers */
	struct video_buffer_prop input_buf_prop; /* Input Buffer Properties */
	struct video_buffer_prop output_buf_prop; /* Output Buffer Prop */
	size_t	extradata_size;
};

enum scan_format {
@@ -168,6 +197,13 @@ struct video_data_buffer {
	enum scan_format interlaced_format;
};

struct extradata_buffer {
	void __user	*bufferaddr;
	size_t buffer_len;
	int	ion_fd;
	size_t offset;
};

struct video_h264_mv {
	size_t size;
	int count;
@@ -213,6 +249,9 @@ struct video_command {
			struct video_data_buffer buffer; /* Buffer Details */
			struct video_mv_buff_size mv_buffer_req;
			struct video_h264_mv mv_buffer_prop;
			unsigned int extradata_type;
			struct extradata_buffer extradata_buffer;
			enum video_playback_mode_t video_mode;
		};

		struct {