summaryrefslogtreecommitdiff
authormiaohong chen <miaohong.chen@amlogic.com>2020-04-17 04:41:14 (GMT)
committer Shen Liu <shen.liu@amlogic.com>2020-04-28 08:20:04 (GMT)
commit9ec0d633941a7daaf9c16166002d1e35fefee1a1 (patch)
treed01dda6e7808f646056a0010b9f46d31278338f7
parent8cc771eb8b9b67f9cc4999e119d3148c8136bdf3 (diff)
downloadmedia_modules-9ec0d633941a7daaf9c16166002d1e35fefee1a1.zip
media_modules-9ec0d633941a7daaf9c16166002d1e35fefee1a1.tar.gz
media_modules-9ec0d633941a7daaf9c16166002d1e35fefee1a1.tar.bz2
vmh264: fix video jitter bug [1/1]
PD#SWPL-24276 Problem: Interlaced stream jitter. Solution: This type of stream consists of a pack of two fields and a pack of single fields. When the second field is the same as the pts of the first field, the display module will drop the second field, causing jitter. The pts of the second field needs to be set to 0, and the display module reconstructs the pts through duration / 2 to output the second field. Verify: u212 Change-Id: Ia0dba6666f3fed5f3b62585bf79dc5ad24b3da3e Signed-off-by: miaohong chen <miaohong.chen@amlogic.com>
Diffstat
-rw-r--r--drivers/frame_provider/decoder/h264_multi/h264_dpb.c22
-rw-r--r--drivers/frame_provider/decoder/h264_multi/h264_dpb.h19
-rw-r--r--drivers/frame_provider/decoder/h264_multi/vmh264.c400
-rw-r--r--firmware/video_ucode.bin2278
4 files changed, 1506 insertions, 1213 deletions
diff --git a/drivers/frame_provider/decoder/h264_multi/h264_dpb.c b/drivers/frame_provider/decoder/h264_multi/h264_dpb.c
index 82db15f..ff9e92f 100644
--- a/drivers/frame_provider/decoder/h264_multi/h264_dpb.c
+++ b/drivers/frame_provider/decoder/h264_multi/h264_dpb.c
@@ -385,6 +385,20 @@ void slice_prepare(struct h264_dpb_stru *p_H264_Dpb,
pSlice->structure = (p_H264_Dpb->
dpb_param.l.data[NEW_PICTURE_STRUCTURE] == 3) ?
FRAME : p_H264_Dpb->dpb_param.l.data[NEW_PICTURE_STRUCTURE];
+
+
+ if (pSlice->structure == FRAME) {
+ pSlice->field_pic_flag = 0;
+ pSlice->bottom_field_flag = 0;
+ } else {
+ pSlice->field_pic_flag = 1;
+ if (pSlice->structure == TOP_FIELD)
+ pSlice->bottom_field_flag = 0;
+ else
+ pSlice->bottom_field_flag = 1;
+ }
+ pSlice->pic_struct = p_H264_Dpb->dpb_param.l.data[PICTURE_STRUCT];
+
sps->num_ref_frames = p_H264_Dpb->
dpb_param.l.data[MAX_REFERENCE_FRAME_NUM];
sps->profile_idc =
@@ -1045,6 +1059,14 @@ static void init_picture(struct h264_dpb_stru *p_H264_Dpb,
currSlice->picture_structure_mmco);
}
+ if (currSlice->pic_struct < PIC_INVALID) {
+ dec_picture->pic_struct = currSlice->pic_struct;
+ } else {
+ dec_picture->pic_struct = PIC_INVALID;
+ }
+
+ dpb_print(p_H264_Dpb->decoder_index, PRINT_FLAG_DPB_DETAIL,
+ "%s pic_struct = %d\n", __func__, dec_picture->pic_struct);
}
void dump_pic(struct h264_dpb_stru *p_H264_Dpb)
diff --git a/drivers/frame_provider/decoder/h264_multi/h264_dpb.h b/drivers/frame_provider/decoder/h264_multi/h264_dpb.h
index 33c75ac..94cc3e0 100644
--- a/drivers/frame_provider/decoder/h264_multi/h264_dpb.h
+++ b/drivers/frame_provider/decoder/h264_multi/h264_dpb.h
@@ -78,6 +78,9 @@
#define H264_FIND_NEXT_DVEL_NAL 0x51
#define H264_AUX_DATA_READY 0x52
+#define H264_SEI_DATA_READY 0x53
+#define H264_SEI_DATA_DONE 0x54
+
/* 0x8x, search state*/
#define H264_STATE_SEARCH_AFTER_SPS 0x80
#define H264_STATE_SEARCH_AFTER_PPS 0x81
@@ -407,6 +410,20 @@ enum PictureStructure {
BOTTOM_FIELD
};
+typedef enum {
+ PIC_SINGLE_FRAME = 0,
+ PIC_TOP,
+ PIC_BOT,
+ PIC_TOP_BOT,
+ PIC_BOT_TOP,
+ PIC_TOP_BOT_TOP = 5,
+ PIC_BOT_TOP_BOT,
+ PIC_DOUBLE_FRAME,
+ PIC_TRIPLE_FRAME,
+ PIC_INVALID,
+} PicStruct_E;
+
+
#define I_Slice 2
#define P_Slice 5
#define B_Slice 6
@@ -508,6 +525,7 @@ struct Slice {
unsigned char dec_ref_pic_marking_buffer_valid;
struct DecRefPicMarking_s
dec_ref_pic_marking_buffer[DEC_REF_PIC_MARKING_BUFFER_NUM_MAX];
+ int pic_struct;
};
struct OldSliceParams {
@@ -686,6 +704,7 @@ struct StorablePicture {
u64 pts64;
u64 timestamp;
unsigned char data_flag;
+ int pic_struct;
};
struct FrameStore {
diff --git a/drivers/frame_provider/decoder/h264_multi/vmh264.c b/drivers/frame_provider/decoder/h264_multi/vmh264.c
index 003658d..1ee2e21 100644
--- a/drivers/frame_provider/decoder/h264_multi/vmh264.c
+++ b/drivers/frame_provider/decoder/h264_multi/vmh264.c
@@ -80,6 +80,7 @@
#define CHECK_INTERVAL (HZ/100)
+#define SEI_DATA_SIZE (8*1024)
#define SEI_ITU_DATA_SIZE (4*1024)
#define RATE_MEASURE_NUM 8
@@ -308,10 +309,15 @@ static void vmh264_dump_state(struct vdec_s *vdec);
((status & 0xf0) == 0x80))
#define is_interlace(frame) \
- (frame->frame &&\
+ ((frame->frame &&\
frame->top_field &&\
frame->bottom_field &&\
- (!frame->frame->coded_frame))
+ (!frame->frame->coded_frame)) || \
+ (frame->frame && \
+ frame->frame->coded_frame && \
+ (!frame->frame->frame_mbs_only_flag) && \
+ frame->frame->structure == FRAME))
+
static inline bool close_to(int a, int b, int m)
{
return (abs(a - b) < m) ? true : false;
@@ -340,14 +346,6 @@ static inline bool close_to(int a, int b, int m)
/*#define V_BUF_ADDR_OFFSET (0x13e000)*/
u32 V_BUF_ADDR_OFFSET = 0x200000;
#define DCAC_READ_MARGIN (64 * 1024)
-#define PIC_SINGLE_FRAME 0
-#define PIC_TOP_BOT_TOP 1
-#define PIC_BOT_TOP_BOT 2
-#define PIC_DOUBLE_FRAME 3
-#define PIC_TRIPLE_FRAME 4
-#define PIC_TOP_BOT 5
-#define PIC_BOT_TOP 6
-#define PIC_INVALID 7
#define EXTEND_SAR 0xff
#define BUFSPEC_POOL_SIZE 64
@@ -600,6 +598,11 @@ struct vdec_h264_hw_s {
u32 suffix_aux_size;
void *aux_addr;
dma_addr_t aux_phy_addr;
+
+ /* buffer for store all sei data */
+ void *sei_data_buf;
+ u32 sei_data_len;
+
/* buffer for storing one itu35 recored */
void *sei_itu_data_buf;
u32 sei_itu_data_len;
@@ -2334,14 +2337,9 @@ static int check_force_interlace(struct vdec_h264_hw_s *hw,
struct FrameStore *frame)
{
int bForceInterlace = 0;
-
- if (frame->frame) {
- if (frame->frame->coded_frame
- && !frame->frame->frame_mbs_only_flag) {
- if (frame->frame->structure == FRAME)
- return 1;
- }
- }
+ /* no di in secure mode, disable force di */
+ if (vdec_secure(hw_to_vdec(hw)))
+ return 0;
if ((dec_control & DEC_CONTROL_FLAG_FORCE_2997_1080P_INTERLACE)
&& (hw->frame_width == 1920)
@@ -2536,29 +2534,57 @@ int prepare_display_buf(struct vdec_s *vdec, struct FrameStore *frame)
hw->buffer_spec[buffer_index].used = 2;
hw->buffer_spec[buffer_index].vf_ref++;
+ dpb_print(DECODE_ID(hw), PRINT_FLAG_DPB_DETAIL,
+ "%s %d frame = %p top_field = %p bottom_field = %p\n", __func__, __LINE__, frame->frame,
+ frame->top_field, frame->bottom_field);
+
+ if (frame->frame != NULL) {
+ dpb_print(DECODE_ID(hw), PRINT_FLAG_DPB_DETAIL,
+ "%s %d coded_frame = %d frame_mbs_only_flag = %d structure = %d\n", __func__, __LINE__,
+ frame->frame->coded_frame, frame->frame->frame_mbs_only_flag, frame->frame->structure);
+ }
+
if (bForceInterlace || is_interlace(frame)) {
vf->type =
VIDTYPE_INTERLACE_FIRST |
VIDTYPE_VIU_NV21;
- if (bForceInterlace) {
+ if (frame->frame != NULL &&
+ (frame->frame->pic_struct == PIC_TOP_BOT ||
+ frame->frame->pic_struct == PIC_BOT_TOP)) {
+ if (frame->frame != NULL && frame->frame->pic_struct == PIC_TOP_BOT) {
vf->type |= (i == 0 ?
VIDTYPE_INTERLACE_TOP :
VIDTYPE_INTERLACE_BOTTOM);
- if (i == 1) {
- vf->pts = 0;
- vf->pts_us64 = 0;
+ } else if (frame->frame != NULL && frame->frame->pic_struct == PIC_BOT_TOP) {
+ vf->type |= (i == 0 ?
+ VIDTYPE_INTERLACE_BOTTOM :
+ VIDTYPE_INTERLACE_TOP);
}
- } else if (frame->top_field->poc <=
- frame->bottom_field->poc) /*top first*/
+ } else if (frame->top_field != NULL && frame->bottom_field != NULL) {/*top first*/
+ if (frame->top_field->poc <= frame->bottom_field->poc)
+ vf->type |= (i == 0 ?
+ VIDTYPE_INTERLACE_TOP :
+ VIDTYPE_INTERLACE_BOTTOM);
+ else
+ vf->type |= (i == 0 ?
+ VIDTYPE_INTERLACE_BOTTOM :
+ VIDTYPE_INTERLACE_TOP);
+ } else {
vf->type |= (i == 0 ?
VIDTYPE_INTERLACE_TOP :
VIDTYPE_INTERLACE_BOTTOM);
- else
- vf->type |= (i == 0 ?
- VIDTYPE_INTERLACE_BOTTOM :
- VIDTYPE_INTERLACE_TOP);
+ }
vf->duration = vf->duration/2;
+ if (i == 1) {
+ vf->pts = 0;
+ vf->pts_us64 = 0;
+ }
+
+ dpb_print(DECODE_ID(hw), PRINT_FLAG_DPB_DETAIL,
+ "%s %d type = 0x%x pic_struct = %d pts = 0x%x pts_us64 = 0x%llx bForceInterlace = %d\n",
+ __func__, __LINE__, vf->type, frame->frame->pic_struct,
+ vf->pts, vf->pts_us64, bForceInterlace);
}
kfifo_put(&hw->display_q, (const struct vframe_s *)vf);
@@ -4394,8 +4420,8 @@ static bool is_buffer_available(struct vdec_s *vdec)
if ((error_proc_policy & 0x4) &&
(error_proc_policy & 0x8)) {
if ((kfifo_len(&hw->display_q) <= 0) &&
- (p_H264_Dpb->mDPB.used_size ==
- p_H264_Dpb->mDPB.size) &&
+ (p_H264_Dpb->mDPB.used_size >=
+ p_H264_Dpb->mDPB.size - 1) &&
(p_Dpb->ref_frames_in_buffer >
(imax(
1, p_Dpb->num_ref_frames)
@@ -4406,8 +4432,8 @@ static bool is_buffer_available(struct vdec_s *vdec)
bufmgr_h264_remove_unused_frame(p_H264_Dpb, 1);
} else if ((error_proc_policy & 0x4) &&
(kfifo_len(&hw->display_q) <= 0) &&
- ((p_H264_Dpb->mDPB.used_size ==
- p_H264_Dpb->mDPB.size) ||
+ ((p_H264_Dpb->mDPB.used_size >=
+ p_H264_Dpb->mDPB.size - 1) ||
(!have_free_buf_spec(vdec)))) {
enum receviver_start_e state = RECEIVER_INACTIVE;
if ((error_proc_policy & 0x10) &&
@@ -4441,6 +4467,215 @@ static bool is_buffer_available(struct vdec_s *vdec)
return buffer_available;
}
+#define AUX_TAG_SEI 0x2
+
+#define SEI_BUFFERING_PERIOD 0
+#define SEI_PicTiming 1
+#define SEI_USER_DATA 4
+#define SEI_RECOVERY_POINT 6
+
+/*
+ *************************************************************************
+ * Function:Reads bits from the bitstream buffer
+ * Input:
+ byte buffer[]
+ containing sei message data bits
+ int totbitoffset
+ bit offset from start of partition
+ int bytecount
+ total bytes in bitstream
+ int numbits
+ number of bits to read
+ * Output:
+ int *info
+ * Return:
+ -1: failed
+ > 0: the count of bit read
+ * Attention:
+ *************************************************************************
+ */
+
+static int get_bits(unsigned char buffer[],
+ int totbitoffset,
+ int *info,
+ int bytecount,
+ int numbits)
+{
+ register int inf;
+ long byteoffset;
+ int bitoffset;
+
+ int bitcounter = numbits;
+
+ byteoffset = totbitoffset / 8;
+ bitoffset = 7 - (totbitoffset % 8);
+
+ inf = 0;
+ while (numbits) {
+ inf <<= 1;
+ inf |= (buffer[byteoffset] & (0x01 << bitoffset)) >> bitoffset;
+ numbits--;
+ bitoffset--;
+ if (bitoffset < 0) {
+ byteoffset++;
+ bitoffset += 8;
+ if (byteoffset > bytecount)
+ return -1;
+ }
+ }
+
+ *info = inf;
+
+
+ return bitcounter;
+}
+
+static int parse_one_sei_record(struct vdec_h264_hw_s *hw,
+ u8 *sei_data_buf,
+ u8 *sei_data_buf_end)
+{
+ int payload_type;
+ int payload_size;
+ u8 *p_sei;
+ int temp = 0;
+ int bit_offset;
+ int read_size;
+ struct h264_dpb_stru *p_H264_Dpb = &hw->dpb;
+
+ p_sei = sei_data_buf;
+ read_size = 0;
+ payload_type = 0;
+ do {
+ if (p_sei >= sei_data_buf_end)
+ return read_size;
+
+ payload_type += *p_sei;
+ read_size++;
+ } while (*p_sei++ == 255);
+
+
+ payload_size = 0;
+ do {
+ if (p_sei >= sei_data_buf_end)
+ return read_size;
+
+ payload_size += *p_sei;
+ read_size++;
+ } while (*p_sei++ == 255);
+
+
+ if (p_sei + payload_size > sei_data_buf_end) {
+ dpb_print(DECODE_ID(hw), PRINT_FLAG_DPB_DETAIL,
+ "%s: payload_type = %d, payload_size = %d is over\n",
+ __func__, payload_type, payload_size);
+ return read_size;
+ }
+ bit_offset = 0;
+
+ if (payload_size <= 0) {
+ dpb_print(DECODE_ID(hw), PRINT_FLAG_DPB_DETAIL,
+ "%s warning: this is a null sei message for payload_type = %d\n",
+ __func__, payload_type);
+ return read_size;
+ }
+ switch (payload_type) {
+ case SEI_BUFFERING_PERIOD:
+ break;
+ case SEI_PicTiming:
+ if (p_H264_Dpb->vui_status & 0xc) {
+ int cpb_removal_delay;
+ int dpb_output_delay;
+ u32 delay_len;
+
+ delay_len = p_H264_Dpb->dpb_param.l.data[DELAY_LENGTH];
+ cpb_removal_delay
+ = (delay_len & 0x1F) + 1;
+ dpb_output_delay
+ = ((delay_len >> 5) & 0x1F) + 1;
+
+ get_bits(p_sei, bit_offset,
+ &temp, payload_size,
+ dpb_output_delay+cpb_removal_delay);
+ bit_offset += dpb_output_delay+cpb_removal_delay;
+ }
+ if (p_H264_Dpb->vui_status & 0x10) {
+ get_bits(p_sei, bit_offset, &temp, payload_size, 4);
+ bit_offset += 4;
+ p_H264_Dpb->dpb_param.l.data[PICTURE_STRUCT] = temp;
+ }
+ break;
+ case SEI_USER_DATA:
+ if (enable_itu_t35) {
+ int i;
+ int j;
+ int data_len;
+ u8 *user_data_buf;
+
+ user_data_buf
+ = hw->sei_itu_data_buf + hw->sei_itu_data_len;
+ /* user data length should be align with 8 bytes,
+ if not, then padding with zero*/
+ for (i = 0; i < payload_size; i += 8) {
+ if (hw->sei_itu_data_len + i >= SEI_ITU_DATA_SIZE)
+ break; // Avoid out-of-bound writing
+ for (j = 0; j < 8; j++) {
+ int index;
+
+ index = i+7-j;
+ if (index >= payload_size)
+ user_data_buf[i+j] = 0;
+ else
+ user_data_buf[i+j]
+ = p_sei[i+7-j];
+ }
+ }
+
+ data_len = payload_size;
+ if (payload_size % 8)
+ data_len = ((payload_size + 8) >> 3) << 3;
+
+ hw->sei_itu_data_len += data_len;
+ if (hw->sei_itu_data_len >= SEI_ITU_DATA_SIZE)
+ hw->sei_itu_data_len = SEI_ITU_DATA_SIZE;
+ /*
+ dpb_print(DECODE_ID(hw), 0,
+ "%s: user data, and len = %d:\n",
+ __func__, hw->sei_itu_data_len);
+ */
+ }
+ break;
+ case SEI_RECOVERY_POINT:
+ p_H264_Dpb->dpb_param.l.data[RECOVERY_POINT] = 1;
+ break;
+ }
+
+ return read_size + payload_size;
+}
+
+static void parse_sei_data(struct vdec_h264_hw_s *hw,
+ u8 *sei_data_buf,
+ int len)
+{
+ char *p_sei;
+ char *p_sei_end;
+ int parsed_size;
+ int read_size;
+
+
+ p_sei = sei_data_buf;
+ p_sei_end = p_sei + len;
+ parsed_size = 0;
+ while (parsed_size < len) {
+ read_size = parse_one_sei_record(hw, p_sei, p_sei_end);
+ p_sei += read_size;
+ parsed_size += read_size;
+ if (*p_sei == 0x80) {
+ p_sei++;
+ parsed_size++;
+ }
+ }
+}
+
static void check_decoded_pic_error(struct vdec_h264_hw_s *hw)
{
struct h264_dpb_stru *p_H264_Dpb = &hw->dpb;
@@ -4657,6 +4892,8 @@ static irqreturn_t vh264_isr_thread_fn(struct vdec_s *vdec, int irq)
data_low,
data_hight);*/
+ parse_sei_data(hw, hw->sei_data_buf, hw->sei_data_len);
+
if (hw->config_bufmgr_done == 0) {
hw->dec_result = DEC_RESULT_DONE;
vdec_schedule_work(&hw->work);
@@ -5147,47 +5384,72 @@ send_again:
hw->dec_result = DEC_RESULT_DONE;
vdec_schedule_work(&hw->work);
return IRQ_HANDLED;
- }
-
- if (READ_VREG(AV_SCRATCH_G) == 1) {
- hw->sei_itu_data_len =
+ } else if (dec_dpb_status == H264_SEI_DATA_READY) {
+ int aux_data_len;
+ aux_data_len =
(READ_VREG(H264_AUX_DATA_SIZE) >> 16) << 4;
- if (hw->sei_itu_data_len > SEI_ITU_DATA_SIZE * 2) {
+
+ if (aux_data_len > SEI_DATA_SIZE) {
dpb_print(DECODE_ID(hw), PRINT_FLAG_ERROR,
- "itu data size more than 4K: %d, discarded it\n",
+ "sei data size more than 4K: %d, discarded it\n",
hw->sei_itu_data_len);
hw->sei_itu_data_len = 0;
}
- if (hw->sei_itu_data_len != 0) {
+ if (aux_data_len != 0) {
u8 *trans_data_buf;
u8 *sei_data_buf;
- u32 temp;
- u32 *pswap_data;
+ u8 swap_byte;
dma_sync_single_for_cpu(
- amports_get_dma_device(),
- hw->aux_phy_addr,
- hw->prefix_aux_size + hw->suffix_aux_size,
- DMA_FROM_DEVICE);
+ amports_get_dma_device(),
+ hw->aux_phy_addr,
+ hw->prefix_aux_size + hw->suffix_aux_size,
+ DMA_FROM_DEVICE);
#if 0
dump_aux_buf(hw);
#endif
-
trans_data_buf = (u8 *)hw->aux_addr;
- sei_data_buf = (u8 *)hw->sei_itu_data_buf;
- for (i = 0; i < hw->sei_itu_data_len/2; i++)
- sei_data_buf[i] = trans_data_buf[i*2];
- hw->sei_itu_data_len = hw->sei_itu_data_len / 2;
-
- pswap_data = (u32 *)hw->sei_itu_data_buf;
- for (i = 0; i < hw->sei_itu_data_len/4; i = i+2) {
- temp = pswap_data[i];
- pswap_data[i] = pswap_data[i+1];
- pswap_data[i+1] = temp;
+
+ if (trans_data_buf[7] == AUX_TAG_SEI) {
+ int left_len;
+
+ sei_data_buf = (u8 *)hw->sei_data_buf
+ + hw->sei_data_len;
+ left_len = SEI_DATA_SIZE - hw->sei_data_len;
+ if (aux_data_len/2 <= left_len) {
+ for (i = 0; i < aux_data_len/2; i++)
+ sei_data_buf[i]
+ = trans_data_buf[i*2];
+
+ aux_data_len = aux_data_len / 2;
+ for (i = 0; i < aux_data_len; i = i+4) {
+ swap_byte = sei_data_buf[i];
+ sei_data_buf[i]
+ = sei_data_buf[i+3];
+ sei_data_buf[i+3] = swap_byte;
+
+ swap_byte = sei_data_buf[i+1];
+ sei_data_buf[i+1]
+ = sei_data_buf[i+2];
+ sei_data_buf[i+2] = swap_byte;
+ }
+
+ for (i = aux_data_len-1; i >= 0; i--)
+ if (sei_data_buf[i] != 0)
+ break;
+
+ hw->sei_data_len += i+1;
+ } else
+ dpb_print(DECODE_ID(hw),
+ PRINT_FLAG_ERROR,
+ "sei data size %d and more than left space: %d, discarded it\n",
+ hw->sei_itu_data_len,
+ left_len);
}
}
- WRITE_VREG(AV_SCRATCH_G, 0);
+ WRITE_VREG(DPB_STATUS_REG, H264_SEI_DATA_DONE);
+
return IRQ_HANDLED;
}
@@ -6019,10 +6281,22 @@ static s32 vh264_init(struct vdec_h264_hw_s *hw)
hw->aux_addr = NULL;
return -1;
}
+
+ hw->sei_data_buf = kmalloc(SEI_DATA_SIZE, GFP_KERNEL);
+ if (hw->sei_data_buf == NULL) {
+ pr_err("%s: failed to alloc sei itu data buffer\n",
+ __func__);
+ return -1;
+ }
+
hw->sei_itu_data_buf = kmalloc(SEI_ITU_DATA_SIZE, GFP_KERNEL);
if (hw->sei_itu_data_buf == NULL) {
pr_err("%s: failed to alloc sei itu data buffer\n",
__func__);
+ kfree(hw->aux_addr);
+ hw->aux_addr = NULL;
+ kfree(hw->sei_data_buf);
+ hw->sei_data_buf = NULL;
return -1;
}
@@ -6032,6 +6306,13 @@ static s32 vh264_init(struct vdec_h264_hw_s *hw)
if (!hw->sei_user_data_buffer) {
pr_info("%s: Can not allocate sei_data_buffer\n",
__func__);
+ kfree(hw->aux_addr);
+ hw->aux_addr = NULL;
+ kfree(hw->sei_data_buf);
+ hw->sei_data_buf = NULL;
+ kfree(hw->sei_itu_data_buf);
+ hw->sei_itu_data_buf = NULL;
+
return -1;
}
hw->sei_user_data_wp = 0;
@@ -6100,6 +6381,10 @@ static int vh264_stop(struct vdec_h264_hw_s *hw)
kfree(hw->aux_addr);
hw->aux_addr = NULL;
}
+ if (hw->sei_data_buf != NULL) {
+ kfree(hw->sei_data_buf);
+ hw->sei_data_buf = NULL;
+ }
if (hw->sei_itu_data_buf != NULL) {
kfree(hw->sei_itu_data_buf);
hw->sei_itu_data_buf = NULL;
@@ -7354,6 +7639,7 @@ static void run(struct vdec_s *vdec, unsigned long mask,
config_decode_mode(hw);
vdec_enable_input(vdec);
WRITE_VREG(NAL_SEARCH_CTL, 0);
+ hw->sei_data_len = 0;
if (enable_itu_t35)
WRITE_VREG(NAL_SEARCH_CTL, READ_VREG(NAL_SEARCH_CTL) | 0x1);
if (!hw->init_flag) {
diff --git a/firmware/video_ucode.bin b/firmware/video_ucode.bin
index 8c84166..624c11e 100644
--- a/firmware/video_ucode.bin
+++ b/firmware/video_ucode.bin
@@ -1,1159 +1,7 @@
-Sա
-
-
-B<
-
- 
-?@ 
-C
-ɑ ~z I
-GL
-
-
-&x P 
-
-Sx   @Ox
-
-
-
-
-
-) 
-
- J@
-  J
-. 8 
-
-GI ,
-O
-I@
-I
-
-o
-I@
-=Lʀ
-I
- bp
- 
-
- 
-
-Q R P PC L
-
-@J
-A
-A
- &
-%
-(
-\
-! p! 
-
-J
-
-
-
-
-LJ
-  
-
-
-@x R
-a
-A
-
-@x J e
-B
-a
-x H
-:
- H  G
-G@
-`
- x ł`
-
-x
-
-x |G`
-@x
-y
- QL
-FL @LBLȂ@
-
-G
-
-
-q@
-
-
-
-
- 
- t
-
-
-
- 
-IJ
-Iʁ
-
-
-
-
-Lʥ
- %
-B@Ȃ
-
-
-
-
-
-
-
-
-G
-
-GI
-I
-d
-
-`
-
-
-$
-
-
-
-@x $@
-W(Ǥ
-*e@-UU 
- \! @x U@-U 
-¢V
-
-@TeP W| NB 
-EE@
-BV
-@@x AՀe
-& N U
-TeP W| NB 
-U@%$U@x $&)
-bV
-`aV0
-& N U ' $
-
-
-$`
-
-
-
-
- u V, E
-@
-
-
-B
-@A Ǡ
-
-A 
- 
-
-@@x
-N N N@
- 
-
-@ @ II24 A"
-
- Iɐ ɐ  @ I  
-
- I SI
-
-@ I@
-I
-
-K
-K
-<
-`
- x J
-
- x Iǀ!
-<
-J
-
-x J
-x J
-G2
-H"
-
-
-2
-x J
-3@
-G4
-
-
-~ $
-H
-!
-
-N,@x @
-
- @x
-
-c
- x .I,J)
-`
-,@
-I
-,@Ȅ@ -, -
-@Ǡ  A+,-
-
-
-G
-;H -%
-<
-@ I
-
-@  H
-H@a
-
- H
-
-;I
-
-
-
-
-GǑ@ʡ
-
-GH;ȡ@ʡ
-
-
-G @ @@
-
-G  
-
-G @ @
-
-G  @ 
-I ;
-B
- J
-J
-
-J9
-@b
-;
-
-
-
-
-!sstG
-@b
-
-GuuG
-
-@b
-
-x
-
-
-~ 
-
-
-o
-
-
-H
- $ɀ
-@Ip p  QIs Q #G)!D G)d
-
-P;!
-
-
-
-
-
-
-
-
-
-G," ,@a
-QI
-
-
-Q
-?
-R
-
-
-ȼo
-
-
-@
-G
- 
-
-
-+ 
-! *
-x ,!
-
-*I
-
- G#
-#
- q@) #q s 
- s s @
- '
-L! o
-!*!
-G) 
-))Wx  @Ix 
-))@%x   x
-G) 
-))Ox  Ax 
-))x  
-G$)
-
-
-$
-@o
-
-
-
-' x   'LI! & ' ( ) ) a '   'LI!      H$ a '   CI #x % > ?L> @
-#LGB0
-@
-@
-*
-
-
- @o
-I@
-((#LB0 o
-
- A R K
-(@x GB
-% B
-G
-H
-
-`
-x
-
-
-
-&x I*
-S@ & NI HB
- @
- N @o
- @ N @n
-$ m
-
-G$)
-
-'   
-' x   'LI! & ' ) a '   'LI!   H$ a '  #% $
-o
-
-!L"L%'L e! ,a
-*
-$ʀ
-
-
-
-(
-% & & & r ! G%@
-G
- 
-S&
-
-
-*
-
-$ @o
-&I@@s &@x * H"P ! & % 
-
-
-,
-
--x B
-
-G
-
--J
-Fa
-
-
-
-+
-
-
-g
-J+J
-  
-
-Q
-?
-R P 
- -L@ L+"
-@ #\ a
-L+L
-  A
-
-x ,
-I
-
- ,DŽP -Ʉ@  @
-I@ `
- @  I,D b
-@x
--J
-
- +-G%
-!
-
--J+
-
-x 
-!
- +
- @a
-
-x
- b@ʢ c
-$ "L2@
-
-
-
- CAL c
-AA K)`
-!
-
-
-@
- a  $a    '  
-    N,
-?G)á
-,@Ǡ  A+
-+?a Ǡ A+PCG
-
-
-
-ߏN LJ
-J2 x 
-@Ȇ
-
-0
-`
-
-
-
- 
-
-
-
-
-r
-`~ G@Q
- I
-
-
-B # G@H Q
-x H@B H@
-Q
-Q
-
-Q
-2 # 
-GG@Q
-@
- /
-B
- /
-
-% # G@Q
-
-;p ;
-
-GС@ʡ
-
-G@@!x 
-
-
-G
-!I@
-R B@h
- H
-H:  B G) 
-@!D #
-G
-G
- G
-GB G
-G
-@}
-x Q
-
-;Gp ;
-
-GБ@ʡ
-
- ;R` G)"j !  (! )I
-
-
-   @
-
-Aa a
-  
- @G1
-N
-
- I
-
-
-   @
-G
-Aa a
-@  
- @
-
-
-@}
- `
-x
-A
-b P L
-x G
-
-
-
-
-Gǡ@ʡ
-}  # +#L
-G@
-
- 
-/R
- 
-
-
-
-@x  
-
-
-
-Hƒ
-
-ta # sRP ` # tR` G)"j ! 
-
-
-
-B Y # BH
-sT # sRP G)"j ! 
-
-B 
- s@IGr @ G 
- H
-
- 
-a 
-G@GA
-I
-I
-
- @
- @B # "@
-@x "@
-
-
-G   @= # 
-
-G"@ 9 # @;
-
-
-
-
-
-
-
-
-
-
-
-
-B<
-
- 
-?@ 
-C
-ɑ ~z I
-GL
-
-
-&x P 
-
-Sx   @Ox
-
-
-
-
-
-) 
-
- J@
-  J
-. 8 
-
-GI ,
-O
-I@
-I
-
-o
-I@
-=Lʀ
-I
- bp
- 
-
- 
-
-Q R P PC L
-
-@J
-A
-A
- &
-%
-(
-\
-! p! 
-
-J
-
-
-
-
-LJ
-  @ k
-
-
-@x R
-a
-A
-
-@x J e
-B
-a
-x H
-9
- H  G
-G@
-`
- x ł`
-
-x
-
-x |G`
-@x
-y
- QL
-FL @LBLȂ@
-
-G
-
-
-q@
-
-
-
-
- 
- t
-
-
-
- 
-IJ
-Iʁ
-
-
-
-
-B@Ȃ
-
-
-
-
-
-
-
-
-G
-
-GI
-I
-d
-
-`
-
-
-$
-
-
-
-@x $@
-W(Ǥ
-*e@-UU 
- \! @x U@-U 
-¢V
-
-@TeP W| NB 
-EE@
-BV
-@@x AՀe
-& N U
-TeP W| NB 
-U@%$U@x $&)
-bV
-`aV0
-& N U ' $
-
-
-$`
-
-
-
-
- u V, E
-@
-
-
-B
-@A Ǡ
-
-A 
- 
-
-@@x
-N N N@
- 
-
-@ @ II24 A"
-
- Iɐ ɐ  @ I  
-
- I SI
-
-@ I@
-I
-
-K
-K
-<
-`
- x J
-
- x Iǀ!
-<
-J
-
-x J
-x J
-G2
-H"
-
-
-2
-x J
-3@
-G4
-
-
-~ $
-H
-!
-
-N,@x @
-
- @x
-
-c
- x .I,J)
-`
-,@
-I
-,@Ȅ@ -, -
-@Ǡ  A+,-
-@
-
-G
-;H -%
-<
-
-
-
-H@a
-
- H
-
-;I
-
-
-
-
-GǑ@ʡ
-
-GH;ȡ@ʡ
-
-
-G @ @
-
-G  
-
-G @ 
-
-G  @ 
-I ;
-B
- J
-J
-
-J9
-@b
-;
-
-
-
-
-!sstG
-@b
-
-GuuG
-
-@b
-
-x
-
-
-~ 
-
-~
-o
-
-
-H
- $ɀ
-@Ip p  QIs Q #G)!D G)d
-
-P;!
-
-
-
-
-
-~ 
-
-
-
-G," ,@a
-QI
-
-
-Q
-?
-R
-
-
-ȼo
-
-
-@
-G
- 
-
-
-+ 
-! *
-x ,!
-
-*I
-
- G#
-#
- q@) #q s 
- s s @
- '
-L! o
-!*!
-G) 
-))Wx  @Ix 
-))@%x   x
-G) 
-))Ox  Ax 
-))x  
-G$)
-
-
-$
-@o
-
-
-
-' x   'LI! & ' ( ) ) a '   'LI!      H$ a '   CI #x % > ?L> @
-#LGB0
-@
-@
-*
-
-
- @o
-I@
-((#LB0 o
-
- A R K
-(@x GB
-% B
-G
-H
-
-`
-x
-
-
-
-&x I*
-S@ & NI HB
- @
- N @o
- @ N @n
-$ m
-
-G$)
-
-'   
-' x   'LI! & ' ) a '   'LI!   H$ a '  #% $
-o
-
-!L"L%'L e! ,a
-*
-$ʀ
-
-
-(
-% & & & r ! G%@
-G
- 
-S&
-@l
-
-*
-
-$ @o
-&I@r &@x * H"P ! & % 
-
-
-,
-
--x B
-
-G
-
--J
-Fa
-
-
-
-+
-
-
-g
-J+J
-  
-
-Q
-?
-R P 
- -L@ L+"
-@ #\ a
-L+L
-  @
-
-x ,
-I
-
- ,DŽP -Ʉ@  @
-I@ `
-  I,D b
-@x
--J
-
- +-G%
-!
-
--J+
-
-x 
-!
- +
- @a
-
-x
- b@ʢ c
-$ "L2@
-
-
-
- CAL c
-AA K)`
-!
-
-
-@
- a  $a    '  
-    N,
-?G)á
-,@Ǡ  A+
-+?a Ǡ A+PCG
-
-
-
-ߏN LJ
-J2 x 
-@Ȇ
-
-0
-`
-
-
-
- 
-
-
-
-
-r
-`~ G@Q
- I
-
-
-B # G@H Q
-x H@B H@
-Q
-Q
-
-Q
-2 # 
-GG@Q
-@
- /
-B
- /
-
-% # G@Q
-
-;p ;
-
-GС@ʡ
-
-G@@!x 
-
-
-G
-!I@
-R B@h
- H
-H:  B G) 
-@!D #
-G
-G
- G
-GB G
-G
-@}
-x Q
-
-;Gp ;
-
-GБ@ʡ
-
- ;R` G)"j !  (! )I
-
-
-   @
-
-Aa a
-  
- @G1
-N
-
- I
-
-
-   @
-G
-Aa a
-@  
- @
-
-
-@}
- `
-x
-A
-b P L
-x G
-
-
-
-
-Gǡ@ʡ
-}  # +#L
-G@
-
- 
-/R
- 
-
-
-
-@x  
-
-
-
-Hƒ
-
-ta # sRP ` # tR` G)"j ! 
-
-
-
-B Y # BH
-sT # sRP G)"j ! 
-
-B 
- H
-
- 
-a 
-G@GA
-I
-I
-
- @
- @B # "@
-@x "@
-
-
-G   @= # 
-
-G"@ 9 # @;
+<~5!˅#k9wt3h^D:<Ci$=v
+Am| hkQ%vmqrO]F<Lx!Sn]yvyѢAK3]i'?0ٕ d
+Z1 )9x<E b/Yul_@|#+7D jEݫsPțq?|6́n&!<X~F%E+sS~g
+@+@
@@ -15868,4 +14716,1122 @@ D@ @
@x HR& b@I"@J@Hb
-
+
+
+
+
+
+
+B<
+
+ 
+?@ 
+C
+ɑ ~z I
+GL
+
+
+&x P 
+
+Sx   @Ox
+
+
+
+
+
+) 
+
+ J@
+  J
+. 8 
+
+GI ,
+O
+I@
+I
+
+o
+I@
+=Lʀ
+I
+ bp
+ 
+
+ 
+
+Q R P PC L
+
+@J
+A
+A
+ &
+%
+(
+\
+! p! 
+
+J
+
+
+
+
+LJ
+  @ k
+
+
+@x R
+a
+A
+
+@x J e
+B
+a
+x H
+9
+ H  G
+G@
+`
+ x ǂ`
+
+x
+
+x }G`
+@x
+y
+ QL
+FL @LBLȂ@
+
+G
+
+
+q@
+
+
+
+
+ 
+ t
+
+
+
+ 
+IJ
+Iʁ
+
+
+
+
+B@Ȃ
+
+
+
+
+
+
+
+
+G
+
+GI
+I
+d
+
+`
+
+
+$
+
+
+
+@x $@
+W(Ǥ
+*e@-UU 
+ \! @x U@-U 
+¢V
+
+@TeP W| NB 
+EE@
+BV
+@@x AՀe
+& N U
+TeP W| NB 
+U@%$U@x $&)
+bV
+`aV0
+& N U ' $
+
+
+$`
+
+
+
+
+ u V, E
+@
+
+
+B
+@A Ǡ
+
+A 
+ 
+
+@@x
+N N N@
+ 
+
+@ @ II24 A"
+
+ Iɐ ɐ  @ I  
+
+ I SI
+
+@ I@
+I
+
+K
+K
+<
+`
+ x J
+
+ x Iǀ!
+<
+J
+
+x J
+x J
+G2
+H"
+
+
+2
+x J
+3@
+G4
+
+
+~ $
+H
+!
+
+N,@x @
+
+ @x
+
+c
+ x .I,J)
+`
+,@
+I
+,@Ȅ@ -, -
+@Ǡ  A+,-
+@
+
+G
+;H -%
+<
+
+
+
+H@a
+
+ H
+
+;I
+
+
+
+
+GǑ@ʡ
+
+GH;ȡ@ʡ
+
+
+G @ @
+
+G  
+
+G @ 
+
+G  @ 
+I ;
+B
+ J
+J
+
+J9
+@b
+;
+
+
+
+
+!sstG
+@b
+
+GuuG
+
+@b
+
+x
+
+
+~ 
+
+~
+o
+
+
+H
+ $ɀ
+@Ip p  QIs Q #G)!D G)d
+
+P;!
+
+
+
+
+
+~ 
+
+
+
+G," ,@a
+QI
+
+
+Q
+?
+R
+
+
+ȼo
+
+
+@
+G
+ 
+
+
++ 
+! *
+x ,!
+
+*I
+
+ G#
+#
+ q@) #q s 
+ s s @
+ '
+L! o
+!*!
+G) 
+))Wx  @Ix 
+))@%x   x
+G) 
+))Ox  Ax 
+))x  
+G$)
+
+
+$
+@o
+
+
+
+' x   'LI! & ' ( ) ) a '   'LI!      H$ a '   CI #x % > ?L> @
+#LGB0
+@
+@
+*
+
+
+ @o
+I@
+((#LB0 o
+
+ A R K
+(@x GB
+% B
+G
+H
+
+`
+x
+
+
+
+&x I*
+S@ & NI HB
+ @
+ N @o
+ @ N @n
+$ m
+
+G$)
+
+'   
+' x   'LI! & ' ) a '   'LI!   H$ a '  #% $
+o
+
+!L"L%'L e! ,a
+*
+$ʀ
+
+
+
+(
+% & & & r ! G%@
+G
+ 
+S&
+@l
+
+*
+
+$ @o
+&I@r &@x * H"P ! & % 
+
+
+,
+
+-x B
+
+G
+
+-J
+Fa
+
+
+
++
+
+
+g
+J+J
+  
+
+Q
+?
+R P 
+ -L@ L+"
+@ #\ a
+L+L
+  @
+
+x ,
+I
+
+ ,DŽP -Ʉ@  @
+I@ `
+  I,D b
+@x
+-J
+
+ +-G%
+!
+
+-J+
+
+x 
+!
+ +
+ @a
+
+x
+ b@ʢ c
+$ "L2@
+
+
+
+ CAL c
+AA K)`
+!
+
+
+@
+ a  $a    '  
+    N,
+?G)á
+,@Ǡ  A+
++?a Ǡ A+PCG
+
+
+
+ߏN LJ
+J2 x 
+@Ȇ
+
+0
+`
+
+
+
+ 
+
+
+
+
+r
+`~ G@Q
+ I
+
+
+B # G@H Q
+x H@B H@
+Q
+Q
+
+Q
+2 # 
+GG@Q
+@
+ /
+B @
+ //G@Q
+
+
+
+;p ;
+
+GС@ʡ
+
+G@@!x 
+
+
+G
+!I@
+R B@h
+ H
+H:  B G) 
+@!D #
+G
+G
+ G
+GB G
+G
+}
+x Q
+
+;Gp ;
+
+GБ@ʡ
+
+ ;R` G)"j !  (! )I
+
+
+   @
+
+Aa a
+  
+ @G1
+N
+
+ I
+
+
+   @
+G
+Aa a
+@  
+ @
+
+
+
+@x  
+
+
+
+Hƒ
+
+ta # sRP ` # tR` G)"j ! 
+
+
+
+B Y # BH
+sT # sRP G)"j ! 
+
+B 
+ H
+
+ 
+a 
+G@GA
+I
+I
+
+ @
+ @B # "@
+@x "@
+
+
+G   @= # 
+
+G"@ 9 # @;
+
+
+
+
+
+
+
+
+
+B<
+
+ 
+?@ 
+C
+ɑ ~z I
+GL
+
+
+&x P 
+
+Sx   @Ox
+
+
+
+
+
+) 
+
+ J@
+  J
+. 8 
+
+GI ,
+O
+I@
+I
+
+o
+I@
+=Lʀ
+I
+ bp
+ 
+
+ 
+
+Q R P PC L
+
+@J
+A
+A
+ &
+%
+(
+\
+! p! 
+
+J
+
+
+
+
+LJ
+  
+
+
+@x R
+a
+A
+
+@x J e
+B
+a
+x H
+:
+ H  G
+G@
+`
+ x ǂ`
+
+x
+
+x }G`
+@x
+y
+ QL
+FL @LBLȂ@
+
+G
+
+
+q@
+
+
+
+
+ 
+ t
+
+
+
+ 
+IJ
+Iʁ
+
+
+
+
+Lʥ
+ %
+B@Ȃ
+
+
+
+
+
+
+
+
+G
+
+GI
+I
+d
+
+`
+
+
+$
+
+
+
+@x $@
+W(Ǥ
+*e@-UU 
+ \! @x U@-U 
+¢V
+
+@TeP W| NB 
+EE@
+BV
+@@x AՀe
+& N U
+TeP W| NB 
+U@%$U@x $&)
+bV
+`aV0
+& N U ' $
+
+
+$`
+
+
+
+
+ u V, E
+@
+
+
+B
+@A Ǡ
+
+A 
+ 
+
+@@x
+N N N@
+ 
+
+@ @ II24 A"
+
+ Iɐ ɐ  @ I  
+
+ I SI
+
+@ I@
+I
+
+K
+K
+<
+`
+ x J
+
+ x Iǀ!
+<
+J
+
+x J
+x J
+G2
+H"
+
+
+2
+x J
+3@
+G4
+
+
+~ $
+H
+!
+
+N,@x @
+
+ @x
+
+c
+ x .I,J)
+`
+,@
+I
+,@Ȅ@ -, -
+@Ǡ  A+,-
+
+
+G
+;H -%
+<
+@ I
+
+@  H
+H@a
+
+ H
+
+;I
+
+
+
+
+GǑ@ʡ
+
+GH;ȡ@ʡ
+
+
+G @ @@
+
+G  
+
+G @ @
+
+G  @ 
+I ;
+B
+ J
+J
+
+J9
+@b
+;
+
+
+
+
+!sstG
+@b
+
+GuuG
+
+@b
+
+x
+
+
+~ 
+
+
+o
+
+
+H
+ $ɀ
+@Ip p  QIs Q #G)!D G)d
+
+P;!
+
+
+
+
+
+
+
+
+
+G," ,@a
+QI
+
+
+Q
+?
+R
+
+
+ȼo
+
+
+@
+G
+ 
+
+
++ 
+! *
+x ,!
+
+*I
+
+ G#
+#
+ q@) #q s 
+ s s @
+ '
+L! o
+!*!
+G) 
+))Wx  @Ix 
+))@%x   x
+G) 
+))Ox  Ax 
+))x  
+G$)
+
+
+$
+@o
+
+
+
+' x   'LI! & ' ( ) ) a '   'LI!      H$ a '   CI #x % > ?L> @
+#LGB0
+@
+@
+*
+
+
+ @o
+I@
+((#LB0 o
+
+ A R K
+(@x GB
+% B
+G
+H
+
+`
+x
+
+
+
+&x I*
+S@ & NI HB
+ @
+ N @o
+ @ N @n
+$ m
+
+G$)
+
+'   
+' x   'LI! & ' ) a '   'LI!   H$ a '  #% $
+o
+
+!L"L%'L e! ,a
+*
+$ʀ
+
+
+
+(
+% & & & r ! G%@
+G
+ 
+S&
+
+
+*
+
+$ @o
+&I@@s &@x * H"P ! & % 
+
+
+,
+
+-x B
+
+G
+
+-J
+Fa
+
+
+
++
+
+
+g
+J+J
+  
+
+Q
+?
+R P 
+ -L@ L+"
+@ #\ a
+L+L
+  A
+
+x ,
+I
+
+ ,DŽP -Ʉ@  @
+I@ `
+ @  I,D b
+@x
+-J
+
+ +-G%
+!
+
+-J+
+
+x 
+!
+ +
+ @a
+
+x
+ b@ʢ c
+$ "L2@
+
+
+
+ CAL c
+AA K)`
+!
+
+
+@
+ a  $a    '  
+    N,
+?G)á
+,@Ǡ  A+
++?a Ǡ A+PCG
+
+
+
+ߏN LJ
+J2 x 
+@Ȇ
+
+0
+`
+
+
+
+ 
+
+
+
+
+r
+`~ G@Q
+ I
+
+
+B # G@H Q
+x H@B H@
+Q
+Q
+
+Q
+2 # 
+GG@Q
+@
+ /
+B @
+ //G@Q
+
+
+
+;p ;
+
+GС@ʡ
+
+G@@!x 
+
+
+G
+!I@
+R B@h
+ H
+H:  B G) 
+@!D #
+G
+G
+ G
+GB G
+G
+}
+x Q
+
+;Gp ;
+
+GБ@ʡ
+
+ ;R` G)"j !  (! )I
+
+
+   @
+
+Aa a
+  
+ @G1
+N
+
+ I
+
+
+   @
+G
+Aa a
+@  
+ @
+
+
+
+
+@x  
+
+
+
+Hƒ
+
+ta # sRP ` # tR` G)"j ! 
+
+
+
+B Y # BH
+sT # sRP G)"j ! 
+
+B 
+ s@IGr @ G 
+ H
+
+ 
+a 
+G@GA
+I
+I
+
+ @
+ @B # "@
+@x "@
+
+
+G   @= # 
+
+G"@ 9 # @;