• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

hardware/intel/intel-driver


コミットメタ情報

リビジョンe13af2d393f1a120e93c5134af393bd3a78399b0 (tree)
日時2016-01-06 11:13:06
作者Pengfei Qu <Pengfei.Qu@inte...>
コミッターXiang, Haihao

ログメッセージ

VP9HWDEC:fix vp9 hw decoder issue

v2:
codes change according to haihao's comments

v1:
1. fix one segmentent fault issue
2. change and optimize the mv bufffer update the logic
3. fix one segment feature issue
4. fix one issue when loopfilter level is zero.

Signed-off-by: Pengfei Qu <Pengfei.Qu@intel.com>

変更サマリ

差分

--- a/src/gen9_mfd.c
+++ b/src/gen9_mfd.c
@@ -982,23 +982,44 @@ out:
982982 #define VP9_PROB_BUFFER_RESTORED_SECNE_2 2
983983 #define VP9_PROB_BUFFER_RESTORED_SECNE_MAX (VP9_PROB_BUFFER_RESTORED_SECNE_2 + 1)
984984
985-static void vp9_update_segmentId_buffer(VADriverContextP ctx,
985+#define ALLOC_MV_BUFFER(gen_buffer, string, size,width,height) \
986+ do { \
987+ dri_bo_unreference(gen_buffer->bo); \
988+ gen_buffer->bo = dri_bo_alloc(i965->intel.bufmgr, \
989+ string, \
990+ size, \
991+ 0x1000); \
992+ assert(gen_buffer->bo); \
993+ gen_buffer->frame_width = width ; \
994+ gen_buffer->frame_height = height; \
995+ } while (0)
996+
997+static void
998+vp9_update_segmentId_buffer(VADriverContextP ctx,
986999 struct decode_state *decode_state,
987- struct gen9_hcpd_context *gen9_hcpd_context, uint8_t isScaling)
1000+ struct gen9_hcpd_context *gen9_hcpd_context)
9881001 {
1002+ struct i965_driver_data *i965 = i965_driver_data(ctx);
9891003 VADecPictureParameterBufferVP9 *pic_param;
9901004
1005+ int size = 0;
1006+ int is_scaling = 0;
9911007 assert(decode_state->pic_param && decode_state->pic_param->buffer);
9921008 pic_param = (VADecPictureParameterBufferVP9 *)decode_state->pic_param->buffer;
9931009
994- int size = 0;
1010+ size = gen9_hcpd_context->picture_width_in_ctbs * gen9_hcpd_context->picture_height_in_ctbs * 1 ;
1011+ size <<= 6;
1012+ if (gen9_hcpd_context->vp9_segment_id_buffer.bo == NULL || pic_param->frame_width > gen9_hcpd_context->last_frame.frame_width || pic_param->frame_height > gen9_hcpd_context->last_frame.frame_height)
1013+ {
1014+ ALLOC_GEN_BUFFER((&gen9_hcpd_context->vp9_segment_id_buffer), "vp9 segment id buffer", size);
1015+ }
1016+
1017+ is_scaling = (pic_param->frame_width != gen9_hcpd_context->last_frame.frame_width) || (pic_param->frame_height != gen9_hcpd_context->last_frame.frame_height);
9951018
9961019 if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME) ||
9971020 pic_param->pic_fields.bits.error_resilient_mode ||
998- pic_param->pic_fields.bits.intra_only || isScaling) {
1021+ pic_param->pic_fields.bits.intra_only || is_scaling) {
9991022
1000- size = (gen9_hcpd_context->picture_width_in_min_cb_minus1+2)*(gen9_hcpd_context->picture_height_in_min_cb_minus1 + 2) * 1;
1001- size<<=6;
10021023 //VP9 Segment ID buffer needs to be zero
10031024 dri_bo_map(gen9_hcpd_context->vp9_segment_id_buffer.bo,1);
10041025 memset((unsigned char *)gen9_hcpd_context->vp9_segment_id_buffer.bo->virtual,0, size);
@@ -1007,6 +1028,31 @@ static void vp9_update_segmentId_buffer(VADriverContextP ctx,
10071028 }
10081029
10091030 static void
1031+vp9_update_mv_temporal_buffer(VADriverContextP ctx,
1032+ struct decode_state *decode_state,
1033+ struct gen9_hcpd_context *gen9_hcpd_context)
1034+{
1035+ struct i965_driver_data *i965 = i965_driver_data(ctx);
1036+ VADecPictureParameterBufferVP9 *pic_param;
1037+ int size = 0;
1038+
1039+ assert(decode_state->pic_param && decode_state->pic_param->buffer);
1040+ pic_param = (VADecPictureParameterBufferVP9 *)decode_state->pic_param->buffer;
1041+
1042+ size = gen9_hcpd_context->picture_width_in_ctbs * gen9_hcpd_context->picture_height_in_ctbs * 9 ;
1043+ size <<= 6; //CL aligned
1044+ if (gen9_hcpd_context->vp9_mv_temporal_buffer_curr.bo == NULL || pic_param->frame_width > gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_width || pic_param->frame_height > gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_height)
1045+ {
1046+ ALLOC_MV_BUFFER((&gen9_hcpd_context->vp9_mv_temporal_buffer_curr), "vp9 curr mv temporal buffer", size,pic_param->frame_width,pic_param->frame_height);
1047+ }
1048+ if (gen9_hcpd_context->vp9_mv_temporal_buffer_last.bo == NULL)
1049+ {
1050+ ALLOC_MV_BUFFER((&gen9_hcpd_context->vp9_mv_temporal_buffer_last), "vp9 last mv temporal buffer", size,pic_param->frame_width,pic_param->frame_height);
1051+ }
1052+
1053+}
1054+
1055+static void
10101056 vp9_gen_default_probabilities(VADriverContextP ctx, struct gen9_hcpd_context *gen9_hcpd_context)
10111057 {
10121058 int i = 0;
@@ -1103,7 +1149,7 @@ vp9_update_probabilities(VADriverContextP ctx,
11031149 }
11041150 }else if(gen9_hcpd_context->last_frame.prob_buffer_saved_flag == VP9_PROB_BUFFER_SAVED_SECNE_2)
11051151 {
1106- if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME) ||pic_param->pic_fields.bits.intra_only|pic_param->pic_fields.bits.error_resilient_mode)
1152+ if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME) ||pic_param->pic_fields.bits.intra_only||pic_param->pic_fields.bits.error_resilient_mode)
11071153 {
11081154 temp_frame_ctx_id = 0;
11091155 }
@@ -1130,7 +1176,7 @@ vp9_update_probabilities(VADriverContextP ctx,
11301176 }
11311177 }
11321178 //first part buffer update: Case 1)Reset all 4 probablity buffers
1133- if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME) ||pic_param->pic_fields.bits.intra_only|pic_param->pic_fields.bits.error_resilient_mode)
1179+ if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME) ||pic_param->pic_fields.bits.intra_only||pic_param->pic_fields.bits.error_resilient_mode)
11341180 {
11351181 if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME) ||
11361182 (pic_param->pic_fields.bits.reset_frame_context == 3)||
@@ -1265,9 +1311,7 @@ gen9_hcpd_init_vp9_surface(VADriverContextP ctx,
12651311 struct object_surface *obj_surface,
12661312 struct gen9_hcpd_context *gen9_hcpd_context)
12671313 {
1268- struct i965_driver_data *i965 = i965_driver_data(ctx);
12691314 GenVP9Surface *gen9_vp9_surface;
1270- uint32_t size=0;
12711315
12721316 if (!obj_surface)
12731317 return;
@@ -1282,16 +1326,6 @@ gen9_hcpd_init_vp9_surface(VADriverContextP ctx,
12821326 obj_surface->private_data = gen9_vp9_surface;
12831327 }
12841328
1285- //Super block size in VP9 is 64x64, size in SBs
1286- size = gen9_hcpd_context->picture_width_in_ctbs * gen9_hcpd_context->picture_height_in_ctbs * 9 ;
1287- size<<=6; //CL aligned
1288-
1289- if (gen9_vp9_surface->motion_vector_temporal_bo == NULL) {
1290- gen9_vp9_surface->motion_vector_temporal_bo = dri_bo_alloc(i965->intel.bufmgr,
1291- "current motion vector temporal buffer",
1292- size,
1293- 0x1000);
1294- }
12951329 gen9_vp9_surface->frame_width = pic_param->frame_width;
12961330 gen9_vp9_surface->frame_height = pic_param->frame_height;
12971331
@@ -1374,10 +1408,6 @@ gen9_hcpd_vp9_decode_init(VADriverContextP ctx,
13741408 size<<=6;
13751409 ALLOC_GEN_BUFFER((&gen9_hcpd_context->vp9_probability_buffer), "vp9 probability buffer", size);
13761410
1377- size = (gen9_hcpd_context->picture_width_in_min_cb_minus1+2)*(gen9_hcpd_context->picture_height_in_min_cb_minus1 + 2) * 1;
1378- size<<=6;
1379- ALLOC_GEN_BUFFER((&gen9_hcpd_context->vp9_segment_id_buffer), "vp9 segment id buffer", size);
1380-
13811411 gen9_hcpd_context->first_inter_slice_collocated_ref_idx = 0;
13821412 gen9_hcpd_context->first_inter_slice_collocated_from_l0_flag = 0;
13831413 gen9_hcpd_context->first_inter_slice_valid = 0;
@@ -1451,7 +1481,6 @@ gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
14511481 {
14521482 struct intel_batchbuffer *batch = gen9_hcpd_context->base.batch;
14531483 struct object_surface *obj_surface;
1454- GenVP9Surface *gen9_vp9_surface;
14551484 int i=0;
14561485
14571486 BEGIN_BCS_BATCH(batch, 95);
@@ -1460,8 +1489,6 @@ gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
14601489
14611490 obj_surface = decode_state->render_object;
14621491 assert(obj_surface && obj_surface->bo);
1463- gen9_vp9_surface = obj_surface->private_data;
1464- assert(gen9_vp9_surface && gen9_vp9_surface->motion_vector_temporal_bo);
14651492
14661493 OUT_BUFFER_MA_TARGET(obj_surface->bo); /* DW 1..3 */
14671494 OUT_BUFFER_MA_TARGET(gen9_hcpd_context->deblocking_filter_line_buffer.bo);/* DW 4..6 */
@@ -1473,7 +1500,7 @@ gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
14731500 OUT_BUFFER_MA_TARGET(NULL); /* DW 22..24, ignore for VP9 */
14741501 OUT_BUFFER_MA_TARGET(NULL); /* DW 25..27, ignore for VP9 */
14751502 OUT_BUFFER_MA_TARGET(NULL); /* DW 28..30, ignore for VP9 */
1476- OUT_BUFFER_MA_TARGET(gen9_vp9_surface->motion_vector_temporal_bo); /* DW 31..33 */
1503+ OUT_BUFFER_MA_TARGET(gen9_hcpd_context->vp9_mv_temporal_buffer_curr.bo); /* DW 31..33 */
14771504
14781505 OUT_BUFFER_MA_TARGET(NULL); /* DW 34..36, reserved */
14791506
@@ -1503,7 +1530,7 @@ gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
15031530 /* DW 66..81 - for 8 Collocated motion vectors */
15041531 for (i = 0; i < 1; i++)
15051532 {
1506- OUT_BUFFER_NMA_REFERENCE(gen9_hcpd_context->last_frame.mv_temporal_buffer_bo);
1533+ OUT_BUFFER_NMA_REFERENCE(gen9_hcpd_context->vp9_mv_temporal_buffer_last.bo);
15071534 }
15081535 for (; i < ARRAY_ELEMS(gen9_hcpd_context->reference_surfaces); i++)
15091536 {
@@ -1518,7 +1545,6 @@ gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
15181545 OUT_BUFFER_MA_TARGET(gen9_hcpd_context->hvd_tile_rowstore_buffer.bo);/* DW 92..94, VP9 HVD Tile Rowstore buffer */
15191546
15201547 ADVANCE_BCS_BATCH(batch);
1521- gen9_hcpd_context->last_frame.mv_temporal_buffer_bo = gen9_vp9_surface->motion_vector_temporal_bo;
15221548 }
15231549
15241550 static inline int
@@ -1719,16 +1745,25 @@ gen9_hcpd_vp9_segment_state(VADriverContextP ctx,
17191745 seg_param->segment_flags.fields.segment_reference_enabled << 3 |
17201746 seg_param->segment_flags.fields.segment_reference << 1 |
17211747 seg_param->segment_flags.fields.segment_reference_skipped <<0 ); /* DW 2 */
1722- OUT_BCS_BATCH(batch,
1723- seg_param->filter_level[1][1] << 24 | //FilterLevelRef1Mode1
1724- seg_param->filter_level[1][0] << 16 | //FilterLevelRef1Mode0
1725- seg_param->filter_level[0][1] << 8 | //FilterLevelRef0Mode1
1726- seg_param->filter_level[0][0] << 0 ); //FilterLevelRef0Mode0 /* DW 3 */
1727- OUT_BCS_BATCH(batch,
1728- seg_param->filter_level[3][1] << 24 | //FilterLevelRef3Mode1
1729- seg_param->filter_level[3][0] << 16 | //FilterLevelRef3Mode0
1730- seg_param->filter_level[2][1] << 8 | //FilterLevelRef2Mode1
1731- seg_param->filter_level[2][0] << 0 ); //FilterLevelRef2Mode0 /* DW 4 */
1748+ if(pic_param->filter_level)
1749+ {
1750+ OUT_BCS_BATCH(batch,
1751+ seg_param->filter_level[1][1] << 24 | //FilterLevelRef1Mode1
1752+ seg_param->filter_level[1][0] << 16 | //FilterLevelRef1Mode0
1753+ seg_param->filter_level[0][1] << 8 | //FilterLevelRef0Mode1
1754+ seg_param->filter_level[0][0] << 0 ); //FilterLevelRef0Mode0 /* DW 3 */
1755+ OUT_BCS_BATCH(batch,
1756+ seg_param->filter_level[3][1] << 24 | //FilterLevelRef3Mode1
1757+ seg_param->filter_level[3][0] << 16 | //FilterLevelRef3Mode0
1758+ seg_param->filter_level[2][1] << 8 | //FilterLevelRef2Mode1
1759+ seg_param->filter_level[2][0] << 0 ); //FilterLevelRef2Mode0 /* DW 4 */
1760+ }else
1761+ {
1762+ OUT_BCS_BATCH(batch,
1763+ 0 ); /* DW 3 */
1764+ OUT_BCS_BATCH(batch,
1765+ 0 ); /* DW 4 */
1766+ }
17321767 OUT_BCS_BATCH(batch,
17331768 seg_param->luma_ac_quant_scale << 16 |
17341769 seg_param->luma_dc_quant_scale << 0 ); /* DW 5 */
@@ -1766,39 +1801,35 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP ctx,
17661801 struct decode_state *decode_state,
17671802 struct gen9_hcpd_context *gen9_hcpd_context)
17681803 {
1769- VAStatus vaStatus;
1804+ VAStatus vaStatus = VA_STATUS_SUCCESS;
17701805 struct i965_driver_data *i965 = i965_driver_data(ctx);
17711806 struct intel_batchbuffer *batch = gen9_hcpd_context->base.batch;
17721807 VADecPictureParameterBufferVP9 *pic_param;
17731808 VASliceParameterBufferVP9 *slice_param;
17741809 dri_bo *slice_data_bo;
1775- int i = 0, num_segments=0, isScaling=0;
1776- struct object_surface *obj_surface;
1777- GenVP9Surface *gen9_vp9_surface;
1778- vaStatus = gen9_hcpd_vp9_decode_init(ctx, decode_state, gen9_hcpd_context);
1779-
1780- if (vaStatus != VA_STATUS_SUCCESS)
1781- goto out;
1810+ dri_bo *tmp_bo;
1811+ uint16_t tmp;
1812+ int i = 0, num_segments=0;
17821813
17831814 assert(decode_state->pic_param && decode_state->pic_param->buffer);
1815+ assert(decode_state->slice_params && decode_state->slice_params[0]->buffer);
1816+ slice_param = (VASliceParameterBufferVP9 *)decode_state->slice_params[0]->buffer;
17841817 pic_param = (VADecPictureParameterBufferVP9 *)decode_state->pic_param->buffer;
17851818
1786- //****And set the isScaling value accordingly******
1787- isScaling = 0;
1788- for(i = 0; i < 3; i++)
1819+ if(slice_param->slice_data_size == 1)
17891820 {
1790- obj_surface = gen9_hcpd_context->reference_surfaces[i].obj_surface;
1791- gen9_vp9_surface = NULL;
1792- if (obj_surface && obj_surface->private_data)
1793- {
1794- gen9_vp9_surface = obj_surface->private_data;
1795- isScaling |= (gen9_vp9_surface->frame_width == pic_param->frame_width &&
1796- gen9_vp9_surface->frame_height == pic_param->frame_height)? 0:1;
1797- }
1821+ goto out;
17981822 }
17991823
1824+ vaStatus = gen9_hcpd_vp9_decode_init(ctx, decode_state, gen9_hcpd_context);
1825+
1826+ if (vaStatus != VA_STATUS_SUCCESS)
1827+ goto out;
1828+
18001829 //Update segment id buffer if needed
1801- vp9_update_segmentId_buffer(ctx, decode_state, gen9_hcpd_context, isScaling);
1830+ vp9_update_segmentId_buffer(ctx, decode_state, gen9_hcpd_context);
1831+ //Update mv buffer if needed
1832+ vp9_update_mv_temporal_buffer(ctx, decode_state, gen9_hcpd_context);
18021833 //Update probability buffer if needed
18031834 vp9_update_probabilities(ctx, decode_state, gen9_hcpd_context);
18041835
@@ -1813,8 +1844,6 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP ctx,
18131844 gen9_hcpd_vp9_surface_state(ctx, decode_state, gen9_hcpd_context);
18141845
18151846 //Only one VASliceParameterBufferVP9 should be sent per frame
1816- assert(decode_state->slice_params && decode_state->slice_params[0]->buffer);
1817- slice_param = (VASliceParameterBufferVP9 *)decode_state->slice_params[0]->buffer;
18181847 slice_data_bo = decode_state->slice_datas[0]->bo;
18191848
18201849 gen9_hcpd_ind_obj_base_addr_state(ctx, slice_data_bo, gen9_hcpd_context);
@@ -1836,6 +1865,9 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP ctx,
18361865
18371866 gen9_hcpd_vp9_bsd_object(ctx, pic_param, slice_param, gen9_hcpd_context);
18381867
1868+ intel_batchbuffer_end_atomic(batch);
1869+ intel_batchbuffer_flush(batch);
1870+
18391871 // keep track of the last frame status
18401872 gen9_hcpd_context->last_frame.frame_width = pic_param->frame_width;
18411873 gen9_hcpd_context->last_frame.frame_height = pic_param->frame_height;
@@ -1845,11 +1877,23 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP ctx,
18451877 gen9_hcpd_context->last_frame.frame_context_idx = pic_param->pic_fields.bits.frame_context_idx;
18461878 gen9_hcpd_context->last_frame.intra_only = pic_param->pic_fields.bits.intra_only;
18471879
1848- // update prob buffer to vp9_fc;
1880+ // switch mv buffer
1881+ if(pic_param->pic_fields.bits.frame_type != HCP_VP9_KEY_FRAME)
1882+ {
1883+ tmp_bo = gen9_hcpd_context->vp9_mv_temporal_buffer_last.bo;
1884+ gen9_hcpd_context->vp9_mv_temporal_buffer_last.bo = gen9_hcpd_context->vp9_mv_temporal_buffer_curr.bo;
1885+ gen9_hcpd_context->vp9_mv_temporal_buffer_curr.bo = tmp_bo;
18491886
1850- intel_batchbuffer_end_atomic(batch);
1851- intel_batchbuffer_flush(batch);
1887+ tmp = gen9_hcpd_context->vp9_mv_temporal_buffer_last.frame_width;
1888+ gen9_hcpd_context->vp9_mv_temporal_buffer_last.frame_width = gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_width;
1889+ gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_width = tmp;
1890+
1891+ tmp = gen9_hcpd_context->vp9_mv_temporal_buffer_last.frame_height;
1892+ gen9_hcpd_context->vp9_mv_temporal_buffer_last.frame_height = gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_height;
1893+ gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_height = tmp;
18521894
1895+
1896+ }
18531897 //update vp9_frame_ctx according to frame_context_id
18541898 if (pic_param->pic_fields.bits.refresh_frame_context)
18551899 {
@@ -1920,6 +1964,8 @@ gen9_hcpd_context_destroy(void *hw_context)
19201964 FREE_GEN_BUFFER((&gen9_hcpd_context->hvd_tile_rowstore_buffer));
19211965 FREE_GEN_BUFFER((&gen9_hcpd_context->vp9_probability_buffer));
19221966 FREE_GEN_BUFFER((&gen9_hcpd_context->vp9_segment_id_buffer));
1967+ dri_bo_unreference(gen9_hcpd_context->vp9_mv_temporal_buffer_curr.bo);
1968+ dri_bo_unreference(gen9_hcpd_context->vp9_mv_temporal_buffer_last.bo);
19231969
19241970 intel_batchbuffer_free(gen9_hcpd_context->base.batch);
19251971 free(gen9_hcpd_context);
@@ -1936,17 +1982,19 @@ static void
19361982 gen9_hcpd_vp9_context_init(VADriverContextP ctx,
19371983 struct gen9_hcpd_context *gen9_hcpd_context)
19381984 {
1939- int default_value = 255;
19401985
19411986 gen9_hcpd_context->last_frame.frame_height = 0;
19421987 gen9_hcpd_context->last_frame.show_frame = 0;
19431988 gen9_hcpd_context->last_frame.frame_type = 0;
1944- gen9_hcpd_context->last_frame.refresh_frame_context = default_value;
1945- gen9_hcpd_context->last_frame.frame_context_idx = default_value;
1989+ gen9_hcpd_context->last_frame.refresh_frame_context = 0;
1990+ gen9_hcpd_context->last_frame.frame_context_idx = 0;
19461991 gen9_hcpd_context->last_frame.intra_only = 0;
19471992 gen9_hcpd_context->last_frame.prob_buffer_saved_flag = 0;
19481993 gen9_hcpd_context->last_frame.prob_buffer_restored_flag = 0;
1949- gen9_hcpd_context->last_frame.mv_temporal_buffer_bo = NULL;
1994+
1995+ //Super block in VP9 is 64x64
1996+ gen9_hcpd_context->ctb_size = 64;
1997+ gen9_hcpd_context->min_cb_size = 8; //Min block size is 8
19501998
19511999 vp9_gen_default_probabilities(ctx, gen9_hcpd_context);
19522000 }
--- a/src/gen9_mfd.h
+++ b/src/gen9_mfd.h
@@ -49,9 +49,15 @@ typedef struct vp9_frame_status
4949 uint8_t intra_only;
5050 uint8_t prob_buffer_saved_flag;
5151 uint8_t prob_buffer_restored_flag;
52- dri_bo * mv_temporal_buffer_bo;
5352 }vp9_last_frame_status;
5453
54+typedef struct vp9_mv_temporal_buffer
55+{
56+ dri_bo *bo;
57+ uint16_t frame_width;
58+ uint16_t frame_height;
59+}VP9_MV_BUFFER;
60+
5561 struct gen9_hcpd_context
5662 {
5763 struct hw_context base;
@@ -84,6 +90,8 @@ struct gen9_hcpd_context
8490 GenBuffer hvd_tile_rowstore_buffer;
8591 GenBuffer vp9_probability_buffer;
8692 GenBuffer vp9_segment_id_buffer;
93+ VP9_MV_BUFFER vp9_mv_temporal_buffer_curr;
94+ VP9_MV_BUFFER vp9_mv_temporal_buffer_last;
8795
8896 unsigned short first_inter_slice_collocated_ref_idx;
8997 unsigned short first_inter_slice_collocated_from_l0_flag;
--- a/src/intel_media_common.c
+++ b/src/intel_media_common.c
@@ -123,9 +123,6 @@ void gen_free_vp9_surface(void **data)
123123 return;
124124 }
125125
126- dri_bo_unreference(vp9_surface->motion_vector_temporal_bo);
127- vp9_surface->motion_vector_temporal_bo = NULL;
128-
129126 free(vp9_surface);
130127 *data = NULL;
131128