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