rvcn_dec_message_drm_t *drm = NULL;
rvcn_dec_message_dynamic_dpb_t *dynamic_dpb = NULL;
rvcn_dec_message_dynamic_dpb_t2_t *dynamic_dpb_t2 = NULL;
-
+ bool dpb_resize = false;
header = dec->msg;
sizes += sizeof(rvcn_dec_message_header_t);
decode->bsd_size = align(dec->bs_size, 128);
- if (!dec->dpb.res && dec->dpb_type != DPB_DYNAMIC_TIER_2) {
+ if (dec->dpb_type != DPB_DYNAMIC_TIER_2) {
bool r;
- if (dec->dpb_size) {
+ if (!dec->dpb.res && dec->dpb_size) {
if (encrypted) {
r = si_vid_create_tmz_buffer(dec->screen, &dec->dpb, dec->dpb_size, PIPE_USAGE_DEFAULT);
} else {
return NULL;
}
si_vid_clear_buffer(dec->base.context, &dec->dpb);
+ } else if (dec->dpb_type == DPB_DYNAMIC_TIER_1 && dec->dpb.res &&
+ (dec->max_width < dec->base.width || dec->max_height < dec->base.height)) {
+ struct rvid_buf_offset_info buf_offset_info;
+
+ buf_offset_info.num_units = (NUM_VP9_REFS + 1);
+ buf_offset_info.old_offset = (align(dec->max_width, dec->db_alignment) *
+ align(dec->max_height, dec->db_alignment) * 3 / 2);
+ buf_offset_info.new_offset = (align(dec->base.width, dec->db_alignment) *
+ align(dec->base.height, dec->db_alignment) * 3 / 2);
+
+ dec->dpb_size = calc_dpb_size(dec);
+ r = si_vid_resize_buffer(dec->screen, &dec->cs, &dec->dpb, dec->dpb_size, &buf_offset_info);
+ if (!r) {
+ RVID_ERR("Can't resize dpb.\n");
+ return NULL;
+ }
+ dec->max_width = dec->base.width;
+ dec->max_height = dec->base.height;
+ dpb_resize = true;
}
}
}
if (dec->dpb_type == DPB_DYNAMIC_TIER_1) {
- decode->decode_flags = 1;
+ decode->decode_flags |= (RDECODE_FLAGS_USE_DYNAMIC_DPB_MASK | RDECODE_FLAGS_USE_PAL_MASK);
+ // Add decode flag for RESIZE_DPB ,when we do resize
+ if (dpb_resize == true)
+ decode->decode_flags |= RDECODE_FLAGS_DPB_RESIZE_MASK;
+
dynamic_dpb->dpbArraySize = NUM_VP9_REFS + 1;
- dynamic_dpb->dpbLumaPitch = align(decode->width_in_samples, dec->db_alignment);
- dynamic_dpb->dpbLumaAlignedHeight = align(decode->height_in_samples, dec->db_alignment);
+ dynamic_dpb->dpbLumaPitch = align(dec->max_width, dec->db_alignment);
+ dynamic_dpb->dpbLumaAlignedHeight = align(dec->max_height, dec->db_alignment);
dynamic_dpb->dpbLumaAlignedSize =
dynamic_dpb->dpbLumaPitch * dynamic_dpb->dpbLumaAlignedHeight;
dynamic_dpb->dpbChromaPitch = dynamic_dpb->dpbLumaPitch >> 1;
if (new_size > buf->res->buf->size) {
dec->ws->buffer_unmap(dec->ws, buf->res->buf);
dec->bs_ptr = NULL;
- if (!si_vid_resize_buffer(dec->screen, &dec->cs, buf, new_size)) {
+ if (!si_vid_resize_buffer(dec->screen, &dec->cs, buf, new_size, NULL)) {
RVID_ERR("Can't resize bitstream buffer!");
return;
}
dec->base.context = context;
dec->base.width = width;
dec->base.height = height;
-
+ dec->max_width = width;
+ dec->max_height = height;
dec->base.destroy = radeon_dec_destroy;
dec->base.begin_frame = radeon_dec_begin_frame;
dec->base.decode_macroblock = radeon_dec_decode_macroblock;
/* reallocate a buffer, preserving its content */
bool si_vid_resize_buffer(struct pipe_screen *screen, struct radeon_cmdbuf *cs,
- struct rvid_buffer *new_buf, unsigned new_size)
+ struct rvid_buffer *new_buf, unsigned new_size,
+ struct rvid_buf_offset_info *buf_ofst_info)
{
struct si_screen *sscreen = (struct si_screen *)screen;
struct radeon_winsys *ws = sscreen->ws;
if (!dst)
goto error;
- memcpy(dst, src, bytes);
- if (new_size > bytes) {
- new_size -= bytes;
- dst += bytes;
+ if (buf_ofst_info) {
memset(dst, 0, new_size);
+ for(int i =0; i < buf_ofst_info->num_units; i++) {
+ memcpy(dst, src, buf_ofst_info->old_offset);
+ dst += buf_ofst_info->new_offset;
+ src += buf_ofst_info->old_offset;
+ }
+ } else {
+ memcpy(dst, src, bytes);
+ if (new_size > bytes) {
+ new_size -= bytes;
+ dst += bytes;
+ memset(dst, 0, new_size);
+ }
}
ws->buffer_unmap(ws, new_buf->res->buf);
ws->buffer_unmap(ws, old_buf.res->buf);
struct si_resource *res;
};
+/* video buffer offset info representation */
+struct rvid_buf_offset_info {
+ unsigned num_units;
+ unsigned old_offset;
+ unsigned new_offset;
+};
+
/* generate an stream handle */
unsigned si_vid_alloc_stream_handle(void);
/* reallocate a buffer, preserving its content */
bool si_vid_resize_buffer(struct pipe_screen *screen, struct radeon_cmdbuf *cs,
- struct rvid_buffer *new_buf, unsigned new_size);
+ struct rvid_buffer *new_buf, unsigned new_size,
+ struct rvid_buf_offset_info *buf_ofst_info);
/* clear the buffer with zeros */
void si_vid_clear_buffer(struct pipe_context *context, struct rvid_buffer *buffer);