tng_yuv_processor.c revision 56ada57fd5c4a41fbf281589526d47850bed05fd
1/*
2 * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3 * Copyright (c) Imagination Technologies Limited, UK
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sub license, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial portions
15 * of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26/*
27 * Authors:
28 *    Li Zeng <li.zeng@intel.com>
29 */
30
31#include "tng_vld_dec.h"
32#include "psb_drv_debug.h"
33#include "hwdefs/dxva_fw_ctrl.h"
34#include "hwdefs/reg_io2.h"
35#include "hwdefs/msvdx_offsets.h"
36#include "hwdefs/msvdx_cmds_io2.h"
37
38static void tng_yuv_processor_QueryConfigAttributes(
39    VAProfile profile,
40    VAEntrypoint entrypoint,
41    VAConfigAttrib *attrib_list,
42    int num_attribs)
43{
44    /* No specific attributes */
45}
46
47static VAStatus tng_yuv_processor_ValidateConfig(
48    object_config_p obj_config)
49{
50    return VA_STATUS_SUCCESS;
51}
52
53static VAStatus tng_yuv_processor_CreateContext(
54    object_context_p obj_context,
55    object_config_p obj_config)
56{
57    VAStatus vaStatus = VA_STATUS_SUCCESS;
58    context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data;
59    context_yuv_processor_p ctx;
60
61    ctx = (context_yuv_processor_p) malloc(sizeof(struct context_yuv_processor_s));
62    if (NULL == ctx) {
63        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
64        DEBUG_FAILURE;
65        return vaStatus;
66    }
67    dec_ctx->yuv_ctx = ctx;
68
69    return vaStatus;
70}
71
72static void tng_yuv_processor_DestroyContext(
73    object_context_p obj_context)
74{
75    context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data;
76
77    free(dec_ctx->yuv_ctx);
78    dec_ctx->yuv_ctx = NULL;
79}
80
81static VAStatus tng_yuv_processor_BeginPicture(
82    object_context_p obj_context)
83{
84    return VA_STATUS_SUCCESS;
85}
86
87static void tng__yuv_processor_process(context_DEC_p dec_ctx)
88{
89    context_yuv_processor_p ctx = dec_ctx->yuv_ctx;
90    psb_cmdbuf_p cmdbuf = dec_ctx->obj_context->cmdbuf;
91    psb_surface_p target_surface = dec_ctx->obj_context->current_render_target->psb_surface;
92    psb_buffer_p buffer;
93    uint32_t reg_value;
94
95    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE));
96
97    reg_value = 0;
98    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_HEIGHT, (ctx->display_height) - 1);
99    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_WIDTH, (ctx->display_width) - 1);
100    psb_cmdbuf_rendec_write(cmdbuf, reg_value);
101
102    reg_value = 0;
103    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_HEIGHT, (ctx->coded_height) - 1);
104    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_WIDTH, (ctx->coded_width) - 1);
105    psb_cmdbuf_rendec_write(cmdbuf, reg_value);
106    psb_cmdbuf_rendec_end(cmdbuf);
107
108
109    /*TODO add stride and else there*/
110    reg_value = 0;
111    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CODEC_MODE, 3);
112    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, ASYNC_MODE, 1);
113    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CODEC_PROFILE, 1);
114    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CHROMA_FORMAT,	1);
115    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, ROW_STRIDE, target_surface->stride_mode);
116
117    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET( MSVDX_CMDS, OPERATING_MODE ));
118    psb_cmdbuf_rendec_write(cmdbuf, reg_value);
119    psb_cmdbuf_rendec_end(cmdbuf);
120
121    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES));
122    buffer = &target_surface->buf;
123    psb_cmdbuf_rendec_write_address(cmdbuf, buffer, buffer->buffer_ofs);
124    psb_cmdbuf_rendec_write_address(cmdbuf, buffer,
125                                    buffer->buffer_ofs +
126                                    target_surface->chroma_offset);
127    psb_cmdbuf_rendec_end(cmdbuf);
128
129    reg_value = 0;
130    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, CONSTRAINED_INTRA_PRED, 0 );
131    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, MODE_CONFIG, 0 );
132    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, DISABLE_DEBLOCK_FILTER_IDC, 1 );
133    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_ALPHA_CO_OFFSET_DIV2, 0 );
134    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_BETA_OFFSET_DIV2, 0 );
135    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_FIELD_TYPE, 2 );
136    REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_CODE_TYPE, 1 ); // P
137    *dec_ctx->p_slice_params = reg_value;
138
139    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET( MSVDX_CMDS, SLICE_PARAMS ) );
140    psb_cmdbuf_rendec_write(cmdbuf, reg_value);
141    psb_cmdbuf_rendec_end(cmdbuf);
142
143    vld_dec_setup_alternative_frame(dec_ctx->obj_context);
144
145    *cmdbuf->cmd_idx++ = CMD_DEBLOCK | CMD_DEBLOCK_TYPE_SKIP;
146    *cmdbuf->cmd_idx++ = 0;
147    *cmdbuf->cmd_idx++ = ctx->coded_width / 16;
148    *cmdbuf->cmd_idx++ = ctx->coded_height / 16;
149    *cmdbuf->cmd_idx++ = 0;
150    *cmdbuf->cmd_idx++ = 0;
151
152}
153
154static VAStatus tng__yuv_processor_execute(context_DEC_p dec_ctx, object_buffer_p obj_buffer)
155{
156    psb_surface_p target_surface = dec_ctx->obj_context->current_render_target->psb_surface;
157    context_yuv_processor_p ctx = dec_ctx->yuv_ctx;
158    uint32_t reg_value;
159    VAStatus vaStatus;
160
161    ASSERT(obj_buffer->type == YUVProcessorSurfaceType);
162    ASSERT(obj_buffer->num_elements == 1);
163    ASSERT(obj_buffer->size == sizeof(struct surface_param_s));
164    ASSERT(target_surface);
165
166    if ((obj_buffer->num_elements != 1) ||
167        (obj_buffer->size != sizeof(struct surface_param_s)) ||
168        (NULL == target_surface)) {
169        return VA_STATUS_ERROR_UNKNOWN;
170    }
171
172    surface_param_p surface_params = (surface_param_p) obj_buffer->buffer_data;
173    ctx->display_width = surface_params->display_width;
174    ctx->display_height = surface_params->display_height;
175    ctx->coded_width = surface_params->coded_width;
176    ctx->coded_height = surface_params->coded_height;
177    ctx->target_surface = target_surface;
178#ifdef ADNROID
179    LOGE("%s, %d %d %d %d***************************************************\n",
180		 __func__, ctx->display_width, ctx->display_height, ctx->coded_width, ctx->coded_height);
181#endif
182    vaStatus = VA_STATUS_SUCCESS;
183
184    if (psb_context_get_next_cmdbuf(dec_ctx->obj_context)) {
185        vaStatus = VA_STATUS_ERROR_UNKNOWN;
186        DEBUG_FAILURE;
187        return vaStatus;
188    }
189    /* ctx->begin_slice(ctx, slice_param); */
190    vld_dec_FE_state(dec_ctx->obj_context, NULL);
191
192    tng__yuv_processor_process(dec_ctx);
193    /* ctx->process_slice(ctx, slice_param); */
194    vld_dec_write_kick(dec_ctx->obj_context);
195
196    dec_ctx->obj_context->video_op = psb_video_vld;
197    dec_ctx->obj_context->flags = 0;
198
199    /* ctx->end_slice(ctx); */
200    dec_ctx->obj_context->flags = FW_VA_RENDER_IS_FIRST_SLICE | FW_VA_RENDER_IS_LAST_SLICE | FW_INTERNAL_CONTEXT_SWITCH;
201
202    if (psb_context_submit_cmdbuf(dec_ctx->obj_context)) {
203        vaStatus = VA_STATUS_ERROR_UNKNOWN;
204    }
205    return vaStatus;
206}
207
208static VAStatus tng_yuv_processor_process_buffer(
209    context_DEC_p dec_ctx,
210    object_buffer_p buffer)
211{
212    VAStatus vaStatus = VA_STATUS_SUCCESS;
213    object_buffer_p obj_buffer = buffer;
214
215    {
216        switch (obj_buffer->type) {
217        case YUVProcessorSurfaceType:
218            vaStatus = tng__yuv_processor_execute(dec_ctx, obj_buffer);
219            DEBUG_FAILURE;
220            break;
221
222        default:
223            vaStatus = VA_STATUS_ERROR_UNKNOWN;
224            DEBUG_FAILURE;
225        }
226    }
227
228    return vaStatus;
229}
230
231
232VAStatus tng_yuv_processor_RenderPicture(
233    object_context_p obj_context,
234    object_buffer_p *buffers,
235    int num_buffers)
236{
237    int i;
238    context_DEC_p ctx = (context_DEC_p) obj_context->format_data;
239    VAStatus vaStatus = VA_STATUS_SUCCESS;
240
241    for (i = 0; i < num_buffers; i++) {
242        object_buffer_p obj_buffer = buffers[i];
243
244        switch (obj_buffer->type) {
245
246        default:
247            vaStatus = tng_yuv_processor_process_buffer(ctx, obj_buffer);
248            DEBUG_FAILURE;
249        }
250        if (vaStatus != VA_STATUS_SUCCESS) {
251            break;
252        }
253    }
254
255    return vaStatus;
256}
257
258static VAStatus tng_yuv_processor_EndPicture(
259    object_context_p obj_context)
260{
261    //INIT_CONTEXT_YUV_PROCESSOR
262
263    if (psb_context_flush_cmdbuf(obj_context)) {
264        return VA_STATUS_ERROR_UNKNOWN;
265    }
266    return VA_STATUS_SUCCESS;
267}
268
269struct format_vtable_s tng_yuv_processor_vtable = {
270queryConfigAttributes:
271    tng_yuv_processor_QueryConfigAttributes,
272validateConfig:
273    tng_yuv_processor_ValidateConfig,
274createContext:
275    tng_yuv_processor_CreateContext,
276destroyContext:
277    tng_yuv_processor_DestroyContext,
278beginPicture:
279    tng_yuv_processor_BeginPicture,
280renderPicture:
281    tng_yuv_processor_RenderPicture,
282endPicture:
283    tng_yuv_processor_EndPicture
284};
285