Home | History | Annotate | Download | only in mrst
      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  * Authors:
     26  *    Zeng Li <zeng.li (at) intel.com>
     27  *    Shengquan Yuan  <shengquan.yuan (at) intel.com>
     28  *    Binglin Chen <binglin.chen (at) intel.com>
     29  *
     30  */
     31 
     32 #include "psb_def.h"
     33 #include "psb_surface.h"
     34 #include "psb_cmdbuf.h"
     35 #include "lnc_H263ES.h"
     36 #include "lnc_hostheader.h"
     37 #include "lnc_hostcode.h"
     38 #include "psb_drv_debug.h"
     39 
     40 #include <stdlib.h>
     41 #include <stdint.h>
     42 #include <string.h>
     43 
     44 
     45 #define TOPAZ_H263_MAX_BITRATE 16000000
     46 
     47 #define INIT_CONTEXT_H263ES    context_ENC_p ctx = (context_ENC_p) (obj_context->format_data)
     48 #define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
     49 #define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &ctx->obj_context->driver_data->buffer_heap, id ))
     50 
     51 
     52 static void lnc_H263ES_QueryConfigAttributes(
     53     VAProfile profile,
     54     VAEntrypoint entrypoint,
     55     VAConfigAttrib *attrib_list,
     56     int num_attribs)
     57 {
     58     int i;
     59     drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_QueryConfigAttributes\n");
     60 
     61     /* RateControl attributes */
     62     for (i = 0; i < num_attribs; i++) {
     63         switch (attrib_list[i].type) {
     64         case VAConfigAttribRTFormat:
     65             break;
     66 
     67         case VAConfigAttribRateControl:
     68             attrib_list[i].value = VA_RC_NONE | VA_RC_CBR | VA_RC_VBR;
     69             break;
     70 #if 0
     71         case VAConfigAttribEncMaxSliceSize:
     72             attrib_list[i].value = 0;
     73             break;
     74 #endif
     75         default:
     76             attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
     77             break;
     78         }
     79     }
     80 
     81 }
     82 
     83 
     84 static VAStatus lnc_H263ES_ValidateConfig(
     85     object_config_p obj_config)
     86 {
     87     int i;
     88     /* Check all attributes */
     89     for (i = 0; i < obj_config->attrib_count; i++) {
     90         switch (obj_config->attrib_list[i].type) {
     91         case VAConfigAttribRTFormat:
     92             /* Ignore */
     93             break;
     94         case VAConfigAttribRateControl:
     95             break;
     96         default:
     97             return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
     98         }
     99     }
    100 
    101     return VA_STATUS_SUCCESS;
    102 }
    103 
    104 
    105 static VAStatus lnc_H263ES_CreateContext(
    106     object_context_p obj_context,
    107     object_config_p obj_config)
    108 {
    109     VAStatus vaStatus = VA_STATUS_SUCCESS;
    110     unsigned int eRCmode;
    111     context_ENC_p ctx;
    112     int i;
    113 
    114     drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_CreateContext\n");
    115 
    116     vaStatus = lnc_CreateContext(obj_context, obj_config);/* alloc context_ENC_s and BO */
    117 
    118     if (VA_STATUS_SUCCESS != vaStatus)
    119         return VA_STATUS_ERROR_ALLOCATION_FAILED;
    120 
    121     ctx = (context_ENC_p) obj_context->format_data;
    122 
    123     ctx->max_slice_size = 0;
    124     eRCmode = VA_RC_NONE;
    125 
    126     for (i = 0; i < obj_config->attrib_count; i++) {
    127 #if 0
    128         if (obj_config->attrib_list[i].type == VAConfigAttribEncMaxSliceSize)
    129             ctx->max_slice_size = obj_config->attrib_list[i].value;
    130         else if (obj_config->attrib_list[i].type == VAConfigAttribRateControl)
    131             eRCmode = obj_config->attrib_list[i].value;
    132 #else
    133         if (obj_config->attrib_list[i].type == VAConfigAttribRateControl)
    134             eRCmode = obj_config->attrib_list[i].value;
    135 #endif
    136     }
    137 
    138     if (eRCmode == VA_RC_VBR) {
    139         ctx->eCodec = IMG_CODEC_H263_VBR;
    140         ctx->sRCParams.RCEnable = IMG_TRUE;
    141     } else if (eRCmode == VA_RC_CBR) {
    142         ctx->eCodec = IMG_CODEC_H263_CBR;
    143         ctx->sRCParams.RCEnable = IMG_TRUE;
    144     } else if (eRCmode == VA_RC_NONE) {
    145         ctx->eCodec = IMG_CODEC_H263_NO_RC;
    146         ctx->sRCParams.RCEnable = IMG_FALSE;
    147     } else
    148         return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
    149     ctx->eFormat = IMG_CODEC_PL12;
    150 
    151     ctx->IPEControl = lnc__get_ipe_control(ctx->eCodec);
    152 
    153     ctx->OptionalCustomPCF = 0;
    154 
    155     return vaStatus;
    156 
    157 
    158 }
    159 
    160 
    161 static void lnc_H263ES_DestroyContext(
    162     object_context_p obj_context)
    163 {
    164 
    165     drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_DestroyContext\n");
    166 
    167     lnc_DestroyContext(obj_context);
    168 }
    169 
    170 static VAStatus lnc_H263ES_BeginPicture(
    171     object_context_p obj_context)
    172 {
    173     VAStatus vaStatus = VA_STATUS_SUCCESS;
    174 
    175     INIT_CONTEXT_H263ES;
    176 
    177     drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_BeginPicture\n");
    178 
    179     vaStatus = lnc_BeginPicture(ctx);
    180 
    181     return vaStatus;
    182 }
    183 
    184 
    185 static VAStatus lnc__H263ES_process_sequence_param(context_ENC_p ctx, object_buffer_p obj_buffer)
    186 {
    187     /*
    188      * process rate control parameters
    189      */
    190     VAEncSequenceParameterBufferH263 *pSequenceParams;
    191 
    192     ASSERT(obj_buffer->type == VAEncSequenceParameterBufferType);
    193     ASSERT(obj_buffer->num_elements == 1);
    194     ASSERT(obj_buffer->size == sizeof(VAEncSequenceParameterBufferH263));
    195 
    196     if ((obj_buffer->num_elements != 1) ||
    197         (obj_buffer->size != sizeof(VAEncSequenceParameterBufferH263))) {
    198         return VA_STATUS_ERROR_UNKNOWN;
    199     }
    200 
    201     pSequenceParams = (VAEncSequenceParameterBufferH263 *) obj_buffer->buffer_data;
    202     obj_buffer->buffer_data = NULL;
    203     obj_buffer->size = 0;
    204 
    205     if ((ctx->obj_context->frame_count != 0) &&
    206         (ctx->sRCParams.BitsPerSecond != pSequenceParams->bits_per_second))
    207         ctx->update_rc_control = 1;
    208 
    209     if (pSequenceParams->bits_per_second > TOPAZ_H263_MAX_BITRATE) {
    210         ctx->sRCParams.BitsPerSecond = TOPAZ_H263_MAX_BITRATE;
    211         drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \
    212 		the maximum bitrate, set it with %d\n",
    213                                  pSequenceParams->bits_per_second,
    214                                  TOPAZ_H263_MAX_BITRATE);
    215     } else
    216         ctx->sRCParams.BitsPerSecond = pSequenceParams->bits_per_second;
    217 
    218     if (pSequenceParams->initial_qp < 3)
    219         pSequenceParams->initial_qp = 3;
    220 
    221     ctx->sRCParams.FrameRate = pSequenceParams->frame_rate;
    222     ctx->sRCParams.InitialQp = pSequenceParams->initial_qp;
    223     ctx->sRCParams.MinQP = pSequenceParams->min_qp;
    224     ctx->sRCParams.BUSize = 0; /* default 0, and will be set in lnc__setup_busize */
    225 
    226 
    227     IMG_UINT16 MBRows = 0;
    228     if (ctx->Height <= 400)
    229         MBRows = 1;
    230     else if (ctx->Height < 800)
    231         MBRows = 2;
    232 
    233     ctx->sRCParams.Slices = (ctx->Height + 15) >> (4 + (MBRows >> 1));
    234 
    235     ctx->sRCParams.IntraFreq = pSequenceParams->intra_period;
    236 
    237     free(pSequenceParams);
    238     return VA_STATUS_SUCCESS;
    239 }
    240 
    241 
    242 /* Work done by the followinig funcs in testbench should be done here.
    243  * IMG_C_StartPicture()
    244  * IMG_C_InsertSync()
    245  * APP_H263_SendPictureHeader()
    246  * Frame skip must be taken into consideration
    247  * */
    248 static VAStatus lnc__H263ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer)
    249 {
    250     VAStatus vaStatus;
    251     VAEncPictureParameterBufferH263 *pBuffer;
    252     lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf;
    253     H263_SOURCE_FORMAT_TYPE SourceFormatType;
    254 
    255     ASSERT(obj_buffer->type == VAEncPictureParameterBufferType);
    256 
    257     if ((obj_buffer->num_elements != 1) ||
    258         (obj_buffer->size != sizeof(VAEncPictureParameterBufferH263))) {
    259         return VA_STATUS_ERROR_UNKNOWN;
    260     }
    261 
    262     /* Transfer ownership of VAEncPictureParameterBufferH263 data */
    263     pBuffer = (VAEncPictureParameterBufferH263 *) obj_buffer->buffer_data;
    264     obj_buffer->buffer_data = NULL;
    265     obj_buffer->size = 0;
    266 
    267     ctx->ref_surface = SURFACE(pBuffer->reference_picture);
    268     ctx->dest_surface = SURFACE(pBuffer->reconstructed_picture);
    269     ctx->coded_buf = BUFFER(pBuffer->coded_buf);
    270 
    271     ASSERT(ctx->Width == pBuffer->picture_width);
    272     ASSERT(ctx->Height == pBuffer->picture_height);
    273 
    274     /* Insert do_header command here */
    275 
    276     if ((ctx->Width == 128) && (ctx->Height == 96))
    277         SourceFormatType = _128x96_SubQCIF;
    278     else if ((ctx->Width == 176) && (ctx->Height == 144))
    279         SourceFormatType = _176x144_QCIF;
    280     else if ((ctx->Width == 352) && (ctx->Height == 288))
    281         SourceFormatType = _352x288_CIF;
    282     else if ((ctx->Width == 704) && (ctx->Height == 576))
    283         SourceFormatType = _704x576_4CIF;
    284     else if ((ctx->Width <= 720) && (ctx->Height <= 576))
    285         SourceFormatType = 7;
    286     else {
    287         drv_debug_msg(VIDEO_DEBUG_GENERAL, "Unsupported resolution!\n");
    288         return VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
    289     }
    290 
    291     /* save current cmdbuf write pointer for H263 frameskip redo
    292      * for H263, for a skipped frame, picture header/slice header both needn't
    293      */
    294     cmdbuf->cmd_idx_saved_frameskip = cmdbuf->cmd_idx;
    295     if (!(ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)) {
    296         lnc__H263_prepare_picture_header((IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->pic_header_ofs),
    297                                          ctx->obj_context->frame_count,
    298                                          pBuffer->picture_type,
    299                                          SourceFormatType,
    300                                          ctx->sRCParams.FrameRate,
    301                                          ctx->Width,
    302                                          ctx->Height,
    303                                          &ctx->OptionalCustomPCF);
    304 
    305         lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, 1);
    306         RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_header_ofs, &cmdbuf->header_mem);
    307     }
    308 
    309     vaStatus = lnc_RenderPictureParameter(ctx);
    310 
    311     free(pBuffer);
    312     return vaStatus;
    313 }
    314 
    315 
    316 static VAStatus lnc__H263ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer)
    317 {
    318     /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */
    319     VAEncSliceParameterBuffer *pBuffer;
    320     lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf;
    321     PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p);
    322     unsigned int i;
    323     int slice_param_idx;
    324 
    325     ASSERT(obj_buffer->type == VAEncSliceParameterBufferType);
    326 
    327     /* do nothing for skip frame if RC enabled */
    328     if ((ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)) {
    329         free(obj_buffer->buffer_data);
    330         obj_buffer->buffer_data = NULL;
    331         return VA_STATUS_SUCCESS;
    332     }
    333 
    334     /* Transfer ownership of VAEncPictureParameterBufferH263 data */
    335     pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data;
    336     obj_buffer->size = 0;
    337 
    338     if (0 == pBuffer->start_row_number) {
    339         if (pBuffer->slice_flags.bits.is_intra)
    340             RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_I);
    341         else
    342             RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_P);
    343     }
    344 
    345     /*In case the slice number changes*/
    346     if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) {
    347         drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n",
    348                                  ctx->slice_param_num, obj_buffer->num_elements);
    349         free(ctx->slice_param_cache);
    350         ctx->slice_param_cache = NULL;
    351         ctx->slice_param_num = 0;
    352     }
    353 
    354     if (NULL == ctx->slice_param_cache) {
    355         ctx->slice_param_num = obj_buffer->num_elements;
    356         drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num);
    357         ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer));
    358         if (NULL == ctx->slice_param_cache) {
    359             drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n");
    360             free(obj_buffer->buffer_data);
    361             return VA_STATUS_ERROR_ALLOCATION_FAILED;
    362         }
    363     }
    364 
    365     for (i = 0; i < obj_buffer->num_elements; i++) {
    366         /*Todo list:
    367              *1.Insert Do header command
    368              *2.setup InRowParams
    369              *3.setup Slice params
    370              *4.Insert Do slice command
    371              * */
    372 
    373         /* Insert Do Header command, relocation is needed */
    374         if (ctx->obj_context->slice_count) {  /*First slice of a frame need not slice header*/
    375             lnc__H263_prepare_GOBslice_header(
    376                 (IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE),
    377                 ctx->obj_context->slice_count,
    378                 ctx->obj_context->frame_count);
    379 
    380             lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, (ctx->obj_context->slice_count << 2) | 2);
    381             RELOC_CMDBUF(cmdbuf->cmd_idx++,
    382                          ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE,
    383                          &cmdbuf->header_mem);
    384         }
    385 
    386         if ((ctx->obj_context->frame_count == 0) && (pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra)
    387             lnc_reset_encoder_params(ctx);
    388 
    389         /*The corresponding slice buffer cache*/
    390         slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i;
    391 
    392         if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) {
    393             /* cache current param parameters */
    394             memcpy(&ctx->slice_param_cache[slice_param_idx],
    395                    pBuffer, sizeof(VAEncSliceParameterBuffer));
    396 
    397             /* Setup InParams value*/
    398             lnc_setup_slice_params(ctx,
    399                                    pBuffer->start_row_number * 16,
    400                                    pBuffer->slice_height * 16,
    401                                    pBuffer->slice_flags.bits.is_intra,
    402                                    ctx->obj_context->frame_count > 0,
    403                                    psPicParams->sInParams.SeInitQP);
    404         }
    405 
    406         /* Insert do slice command and setup related buffer value */
    407         lnc__send_encode_slice_params(ctx,
    408                                       pBuffer->slice_flags.bits.is_intra,
    409                                       pBuffer->start_row_number * 16,
    410                                       0, /* no deblock for H263 */
    411                                       ctx->obj_context->frame_count,
    412                                       pBuffer->slice_height * 16,
    413                                       ctx->obj_context->slice_count,
    414                                       ctx->max_slice_size);
    415 
    416         drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n",
    417                                  ctx->obj_context->frame_count, ctx->obj_context->slice_count);
    418 
    419         ctx->obj_context->slice_count++;
    420         pBuffer++;        /*Move to the next buffer*/
    421 
    422         ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE);
    423     }
    424 
    425     free(obj_buffer->buffer_data);
    426     obj_buffer->buffer_data = NULL;
    427     return VA_STATUS_SUCCESS;
    428 }
    429 
    430 static VAStatus lnc__H263ES_process_misc_param(context_ENC_p ctx, object_buffer_p obj_buffer)
    431 {
    432     /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */
    433     VAEncMiscParameterBuffer *pBuffer;
    434     VAEncMiscParameterRateControl *rate_control_param;
    435     VAEncMiscParameterAIR *air_param;
    436     VAEncMiscParameterMaxSliceSize *max_slice_size_param;
    437     VAEncMiscParameterFrameRate *frame_rate_param;
    438 
    439     VAStatus vaStatus = VA_STATUS_SUCCESS;
    440 
    441     ASSERT(obj_buffer->type == VAEncMiscParameterBufferType);
    442 
    443     pBuffer = (VAEncMiscParameterBuffer *) obj_buffer->buffer_data;
    444     obj_buffer->size = 0;
    445 
    446     switch (pBuffer->type) {
    447     case VAEncMiscParameterTypeFrameRate:
    448         frame_rate_param = (VAEncMiscParameterFrameRate *)pBuffer->data;
    449         drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: frame rate changed to %d\n",
    450                                  frame_rate_param->framerate);
    451         break;
    452 
    453     case VAEncMiscParameterTypeRateControl:
    454         rate_control_param = (VAEncMiscParameterRateControl *)pBuffer->data;
    455 
    456         drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: bit rate changed to %d\n",
    457                                  rate_control_param->bits_per_second);
    458 
    459         if (rate_control_param->bits_per_second == ctx->sRCParams.BitsPerSecond)
    460             break;
    461         else
    462             ctx->update_rc_control = 1;
    463 
    464         if (rate_control_param->bits_per_second > TOPAZ_H263_MAX_BITRATE) {
    465             ctx->sRCParams.BitsPerSecond = TOPAZ_H263_MAX_BITRATE;
    466             drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \
    467 		the maximum bitrate, set it with %d\n",
    468                                      rate_control_param->bits_per_second,
    469                                      TOPAZ_H263_MAX_BITRATE);
    470         } else
    471             ctx->sRCParams.BitsPerSecond = rate_control_param->bits_per_second;
    472 
    473         break;
    474 
    475     case VAEncMiscParameterTypeMaxSliceSize:
    476         max_slice_size_param = (VAEncMiscParameterMaxSliceSize *)pBuffer->data;
    477 
    478         if (ctx->max_slice_size == max_slice_size_param->max_slice_size)
    479             break;
    480 
    481         drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: max slice size changed to %d\n",
    482                                  max_slice_size_param->max_slice_size);
    483 
    484         ctx->max_slice_size = max_slice_size_param->max_slice_size;
    485 
    486         break;
    487 
    488     case VAEncMiscParameterTypeAIR:
    489         air_param = (VAEncMiscParameterAIR *)pBuffer->data;
    490 
    491         drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: air slice size changed to num_air_mbs %d "
    492                                  "air_threshold %d, air_auto %d\n",
    493                                  air_param->air_num_mbs, air_param->air_threshold,
    494                                  air_param->air_auto);
    495 
    496         ctx->num_air_mbs = air_param->air_num_mbs;
    497         ctx->air_threshold = air_param->air_threshold;
    498         ctx->autotune_air_flag = air_param->air_auto;
    499 
    500         break;
    501 
    502     default:
    503         vaStatus = VA_STATUS_ERROR_UNKNOWN;
    504         DEBUG_FAILURE;
    505         break;
    506     }
    507 
    508     free(obj_buffer->buffer_data);
    509     obj_buffer->buffer_data = NULL;
    510 
    511     return VA_STATUS_SUCCESS;
    512 }
    513 
    514 static VAStatus lnc_H263ES_RenderPicture(
    515     object_context_p obj_context,
    516     object_buffer_p *buffers,
    517     int num_buffers)
    518 {
    519     int i;
    520     INIT_CONTEXT_H263ES;
    521     VAStatus vaStatus = VA_STATUS_SUCCESS;
    522 
    523     drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_RenderPicture\n");
    524 
    525     for (i = 0; i < num_buffers; i++) {
    526         object_buffer_p obj_buffer = buffers[i];
    527 
    528         switch (obj_buffer->type) {
    529         case VAEncSequenceParameterBufferType:
    530             drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263_RenderPicture got VAEncSequenceParameterBufferType\n");
    531             vaStatus = lnc__H263ES_process_sequence_param(ctx, obj_buffer);
    532             DEBUG_FAILURE;
    533             break;
    534 
    535         case VAEncPictureParameterBufferType:
    536             drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263_RenderPicture got VAEncPictureParameterBuffer\n");
    537             vaStatus = lnc__H263ES_process_picture_param(ctx, obj_buffer);
    538             DEBUG_FAILURE;
    539             break;
    540 
    541         case VAEncSliceParameterBufferType:
    542             drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263_RenderPicture got VAEncSliceParameterBufferType\n");
    543             vaStatus = lnc__H263ES_process_slice_param(ctx, obj_buffer);
    544             DEBUG_FAILURE;
    545             break;
    546 
    547         case VAEncMiscParameterBufferType:
    548             drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_RenderPicture got VAEncMiscParameterBufferType\n");
    549             vaStatus = lnc__H263ES_process_misc_param(ctx, obj_buffer);
    550             DEBUG_FAILURE;
    551             break;
    552 
    553         default:
    554             vaStatus = VA_STATUS_ERROR_UNKNOWN;
    555             DEBUG_FAILURE;
    556         }
    557         if (vaStatus != VA_STATUS_SUCCESS) {
    558             break;
    559         }
    560     }
    561 
    562 
    563     return vaStatus;
    564 }
    565 
    566 static VAStatus lnc_H263ES_EndPicture(
    567     object_context_p obj_context)
    568 {
    569     VAStatus vaStatus = VA_STATUS_SUCCESS;
    570     INIT_CONTEXT_H263ES;
    571 
    572     drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_EndPicture\n");
    573 
    574     vaStatus = lnc_EndPicture(ctx);
    575 
    576     return vaStatus;
    577 }
    578 
    579 
    580 struct format_vtable_s lnc_H263ES_vtable = {
    581 queryConfigAttributes:
    582     lnc_H263ES_QueryConfigAttributes,
    583 validateConfig:
    584     lnc_H263ES_ValidateConfig,
    585 createContext:
    586     lnc_H263ES_CreateContext,
    587 destroyContext:
    588     lnc_H263ES_DestroyContext,
    589 beginPicture:
    590     lnc_H263ES_BeginPicture,
    591 renderPicture:
    592     lnc_H263ES_RenderPicture,
    593 endPicture:
    594     lnc_H263ES_EndPicture
    595 };
    596