blob: 88f0926ac14ceb80d61044b73caeb15faa5cc687 [file] [log] [blame]
/*
* drivers/amlogic/media/stream_input/parser/streambuf.h
*
* Copyright (C) 2016 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef STREAMBUF_H
#define STREAMBUF_H
#include <linux/amlogic/media/utils/amports_config.h>
#define BUF_FLAG_ALLOC 0x01
#define BUF_FLAG_IN_USE 0x02
#define BUF_FLAG_PARSER 0x04
#define BUF_FLAG_FIRST_TSTAMP 0x08
#define BUF_FLAG_IOMEM 0x10
#define BUF_TYPE_VIDEO 0
#define BUF_TYPE_AUDIO 1
#define BUF_TYPE_SUBTITLE 2
#define BUF_TYPE_USERDATA 3
#define BUF_TYPE_HEVC 4
#define BUF_MAX_NUM 5
#define INVALID_PTS 0xffffffff
#define FETCHBUF_SIZE (64*1024)
#define USER_DATA_SIZE (8*1024)
/* stream_buffer_metainfo stbuf_flag */
#define STBUF_META_FLAG_SECURE (1 << 0)
#define STBUF_META_FLAG_PTS_SERV (1 << 1) /* use pts server flag */
#define STBUF_META_FLAG_XXX1 (1 << 2)
struct vdec_s;
struct stream_buf_s;
struct parser_args {
u32 vid;
u32 aid;
u32 sid;
u32 pcrid;
};
struct stream_buf_ops {
int (*init) (struct stream_buf_s *, struct vdec_s *);
void (*release) (struct stream_buf_s *);
int (*write) (struct stream_buf_s *, const u8 *, u32);
u32 (*get_wp) (struct stream_buf_s *);
void (*set_wp) (struct stream_buf_s *, u32);
u32 (*get_rp) (struct stream_buf_s *);
void (*set_rp) (struct stream_buf_s *, u32);
};
struct stream_buf_s {
int id;
u8 name[16];
s32 flag;
u32 type;
unsigned long buf_start;
struct page *buf_pages;
int buf_page_num;
u32 buf_size;
u32 default_buf_size;
u32 canusebuf_size;
u32 first_tstamp;
const ulong reg_base;
wait_queue_head_t wq;
struct timer_list timer;
u32 wcnt;
u32 buf_wp;
u32 buf_rp;
u32 max_buffer_delay_ms;
u64 last_write_jiffies64;
void *write_thread;
int for_4k;
bool is_secure;
bool is_multi_inst;
bool no_parser;
bool is_phybuf;
bool is_hevc;
bool use_ptsserv;
u32 drm_flag;
ulong ext_buf_addr;
atomic_t payload;
u32 stream_offset;
struct parser_args pars;
struct stream_buf_ops *ops;
u32 last_offset[2];
u32 write_count;
} /*stream_buf_t */;
struct stream_port_s {
/* driver info */
const char *name;
struct device *class_dev;
const struct file_operations *fops;
/* ports control */
s32 type;
s32 flag;
s32 pcr_inited;
/* decoder info */
s32 vformat;
s32 aformat;
s32 achanl;
s32 asamprate;
s32 adatawidth;
/* parser info */
u32 vid;
u32 aid;
u32 sid;
u32 pcrid;
bool is_4k;
} /*stream_port_t */;
enum drm_level_e {
DRM_LEVEL1 = 1,
DRM_LEVEL2 = 2,
DRM_LEVEL3 = 3,
DRM_NONE = 4,
};
struct drm_info {
enum drm_level_e drm_level;
u32 drm_flag;
u32 drm_hasesdata;
u32 drm_priv;
u32 drm_pktsize;
u32 drm_pktpts;
u32 drm_phy;
u32 drm_vir;
u32 drm_remap;
u32 data_offset;
u32 handle;
u32 extpad[7];
} /*drminfo_t */;
struct stream_buffer_metainfo {
union {
u32 stbuf_start;
u32 stbuf_pktaddr; //stbuf_pktaddr + stbuf_pktsize = wp
};
union {
u32 stbuf_size;
u32 stbuf_pktsize;
};
u32 stbuf_flag;
u32 stbuf_private;
u32 reserved[16];
};
struct stream_buffer_status {
u32 stbuf_wp;
u32 stbuf_rp;
u32 stbuf_start;
u32 stbuf_size;
u32 reserved[16];
};
#define TYPE_DRMINFO_V2 0x100
#define TYPE_DRMINFO 0x80
#define TYPE_PATTERN 0x40
struct vdec_s;
extern void *fetchbuf;
extern u32 stbuf_level(struct stream_buf_s *buf);
extern u32 stbuf_rp(struct stream_buf_s *buf);
extern u32 stbuf_space(struct stream_buf_s *buf);
extern u32 stbuf_size(struct stream_buf_s *buf);
extern u32 stbuf_canusesize(struct stream_buf_s *buf);
extern s32 stbuf_init(struct stream_buf_s *buf, struct vdec_s *vdec);
extern s32 stbuf_wait_space(struct stream_buf_s *stream_buf, size_t count);
extern void stbuf_release(struct stream_buf_s *buf);
extern int stbuf_change_size(struct stream_buf_s *buf, int size,
bool is_secure);
extern int stbuf_fetch_init(void);
extern void stbuf_fetch_release(void);
extern u32 stbuf_sub_rp_get(void);
extern void stbuf_sub_rp_set(unsigned int sub_rp);
extern u32 stbuf_sub_wp_get(void);
extern u32 stbuf_sub_start_get(void);
extern u32 stbuf_userdata_start_get(void);
extern struct stream_buf_s *get_stream_buffer(int id);
extern void stbuf_vdec2_init(struct stream_buf_s *buf);
u32 parser_get_wp(struct stream_buf_s *vb);
void parser_set_wp(struct stream_buf_s *vb, u32 val);
u32 parser_get_rp(struct stream_buf_s *vb);
void parser_set_rp(struct stream_buf_s *vb, u32 val);
#endif /* STREAMBUF_H */