1/*-------------------------------------------------------------------------- 2Copyright (c) 2010 - 2017, The Linux Foundation. All rights reserved. 3 4 Redistribution and use in source and binary forms, with or without 5 modification, are permitted provided that the following conditions 6 are met: 7 8 * Redistributions of source code must retain the above copyright 9 notice, this list of conditions and the following disclaimer. 10 * Redistributions in binary form must reproduce the above 11 copyright notice, this list of conditions and the following 12 disclaimer in the documentation and/or other materials provided 13 with the distribution. 14 * Neither the name of The Linux Foundation nor the names of its 15 contributors may be used to endorse or promote products derived 16 from this software without specific prior written permission. 17 18THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 19WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 20MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 21ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 22BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 25BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 27OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 28IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29--------------------------------------------------------------------------*/ 30#ifndef __OMX_VDEC_H__ 31#define __OMX_VDEC_H__ 32/*============================================================================ 33 O p e n M A X Component 34 Video Decoder 35 36*//** @file comx_vdec.h 37 This module contains the class definition for openMAX decoder component. 38 39*//*========================================================================*/ 40 41////////////////////////////////////////////////////////////////////////////// 42// Include Files 43////////////////////////////////////////////////////////////////////////////// 44 45#include <stdlib.h> 46#include <stdio.h> 47#include <string.h> 48#include <inttypes.h> 49#include <cstddef> 50#include <cutils/atomic.h> 51#include <qdMetaData.h> 52#include <color_metadata.h> 53#include "VideoAPI.h" 54#include "HardwareAPI.h" 55#include <unordered_map> 56#include <media/msm_media_info.h> 57 58#include "C2DColorConverter.h" 59 60static ptrdiff_t x; 61 62extern "C" { 63#include <utils/Log.h> 64} 65 66#ifdef _ANDROID_ 67#undef LOG_TAG 68#define LOG_TAG "OMX-VDEC-1080P" 69 70#ifdef USE_ION 71#include <linux/msm_ion.h> 72//#include <binder/MemoryHeapIon.h> 73//#else 74#endif 75#include <ui/ANativeObjectBase.h> 76#include <linux/videodev2.h> 77#define VALID_TS(ts) ((ts < LLONG_MAX)? true : false) 78#include <poll.h> 79#include "hevc_utils.h" 80#define TIMEOUT 5000 81#endif // _ANDROID_ 82 83#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 84#include <media/hardware/HardwareAPI.h> 85#endif 86 87#include <unistd.h> 88 89#if defined (_ANDROID_ICS_) 90#include <gralloc_priv.h> 91#endif 92 93#include <pthread.h> 94#ifndef PC_DEBUG 95#include <semaphore.h> 96#endif 97#include "OMX_Core.h" 98#include "OMX_QCOMExtns.h" 99#include "OMX_Skype_VideoExtensions.h" 100#include "OMX_VideoExt.h" 101#include "OMX_IndexExt.h" 102#include "qc_omx_component.h" 103#include <media/msm_vidc.h> 104#include "ts_parser.h" 105#include "vidc_debug.h" 106#include "vidc_vendor_extensions.h" 107#ifdef _ANDROID_ 108#include <cutils/properties.h> 109#else 110#define PROPERTY_VALUE_MAX 92 111#endif 112extern "C" { 113 OMX_API void * get_omx_component_factory_fn(void); 114} 115 116////////////////////////////////////////////////////////////////////////////// 117// Module specific globals 118////////////////////////////////////////////////////////////////////////////// 119#define OMX_SPEC_VERSION 0x00000101 120#define OMX_INIT_STRUCT(_s_, _name_) \ 121 memset((_s_), 0x0, sizeof(_name_)); \ 122(_s_)->nSize = sizeof(_name_); \ 123(_s_)->nVersion.nVersion = OMX_SPEC_VERSION \ 124 125 126////////////////////////////////////////////////////////////////////////////// 127// Macros 128////////////////////////////////////////////////////////////////////////////// 129#define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\ 130 (unsigned) bufHdr,\ 131 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\ 132 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\ 133 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp) 134 135// BitMask Management logic 136#define BITS_PER_INDEX 64 137#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX) 138#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX) 139#define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX)) 140#define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 141 &= ~(BITMASK_FLAG(mIndex)) 142#define BITMASK_SET(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 143 |= BITMASK_FLAG(mIndex) 144#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 145 & BITMASK_FLAG(mIndex)) 146#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 147 & BITMASK_FLAG(mIndex)) == 0x0) 148#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 149 & BITMASK_FLAG(mIndex)) 150#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 151 & BITMASK_FLAG(mIndex)) == 0x0) 152 153#define OMX_CORE_CONTROL_CMDQ_SIZE 100 154#define OMX_CORE_QCIF_HEIGHT 144 155#define OMX_CORE_QCIF_WIDTH 176 156#define OMX_CORE_VGA_HEIGHT 480 157#define OMX_CORE_VGA_WIDTH 640 158#define OMX_CORE_WVGA_HEIGHT 480 159#define OMX_CORE_WVGA_WIDTH 800 160#define OMX_CORE_FWVGA_HEIGHT 480 161#define OMX_CORE_FWVGA_WIDTH 864 162 163#define DESC_BUFFER_SIZE (8192 * 16) 164 165#ifdef _ANDROID_ 166#define MAX_NUM_INPUT_OUTPUT_BUFFERS 64 167#endif 168 169#define MIN_NUM_INPUT_OUTPUT_EXTRADATA_BUFFERS 32 // 32 (max cap when VPP enabled) 170 171#define OMX_FRAMEINFO_EXTRADATA 0x00010000 172#define OMX_INTERLACE_EXTRADATA 0x00020000 173#define OMX_TIMEINFO_EXTRADATA 0x00040000 174#define OMX_PORTDEF_EXTRADATA 0x00080000 175#define OMX_EXTNUSER_EXTRADATA 0x00100000 176#define OMX_FRAMEDIMENSION_EXTRADATA 0x00200000 177#define OMX_FRAMEPACK_EXTRADATA 0x00400000 178#define OMX_QP_EXTRADATA 0x00800000 179#define OMX_BITSINFO_EXTRADATA 0x01000000 180#define OMX_VQZIPSEI_EXTRADATA 0x02000000 181#define OMX_OUTPUTCROP_EXTRADATA 0x04000000 182#define OMX_MB_ERROR_MAP_EXTRADATA 0x08000000 183 184#define OMX_VUI_DISPLAY_INFO_EXTRADATA 0x08000000 185#define OMX_MPEG2_SEQDISP_INFO_EXTRADATA 0x10000000 186#define OMX_VPX_COLORSPACE_INFO_EXTRADATA 0x20000000 187#define OMX_VC1_SEQDISP_INFO_EXTRADATA 0x40000000 188#define OMX_DISPLAY_INFO_EXTRADATA 0x80000000 189#define OMX_HDR_COLOR_INFO_EXTRADATA 0x100000000 190#define DRIVER_EXTRADATA_MASK 0x0000FFFF 191 192#define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 193 sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3)) 194#define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 195 sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3)) 196#define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 197 sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3)) 198#define OMX_FRAMEDIMENSION_EXTRADATA_SIZE (sizeof(OMX_OTHER_EXTRADATATYPE) +\ 199 sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION) + 3)&(~3) 200#define OMX_FRAMEPACK_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 201 sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT) + 3)&(~3)) 202#define OMX_QP_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 203 sizeof(OMX_QCOM_EXTRADATA_QP) + 3)&(~3)) 204#define OMX_BITSINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 205 sizeof(OMX_QCOM_EXTRADATA_BITS_INFO) + 3)&(~3)) 206#define OMX_VQZIPSEI_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 207 sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + 3)&(~3)) 208#define OMX_USERDATA_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 209 + 3)&(~3)) 210#define OMX_OUTPUTCROP_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 211 sizeof(OMX_QCOM_OUTPUT_CROP) + 3)&(~3)) 212 213/* STATUS CODES */ 214/* Base value for status codes */ 215#define VDEC_S_BASE 0x40000000 216/* Success */ 217#define VDEC_S_SUCCESS (VDEC_S_BASE) 218/* General failure */ 219#define VDEC_S_EFAIL (VDEC_S_BASE + 1) 220/* Fatal irrecoverable failure. Need to tear down session. */ 221#define VDEC_S_EFATAL (VDEC_S_BASE + 2) 222/* Error with input bistream */ 223#define VDEC_S_INPUT_BITSTREAM_ERR (VDEC_S_BASE + 3) 224 225#define VDEC_MSG_BASE 0x0000000 226/* Codes to identify asynchronous message responses and events that driver 227 wants to communicate to the app.*/ 228#define VDEC_MSG_RESP_INPUT_BUFFER_DONE (VDEC_MSG_BASE + 1) 229#define VDEC_MSG_RESP_OUTPUT_BUFFER_DONE (VDEC_MSG_BASE + 2) 230#define VDEC_MSG_RESP_INPUT_FLUSHED (VDEC_MSG_BASE + 3) 231#define VDEC_MSG_RESP_OUTPUT_FLUSHED (VDEC_MSG_BASE + 4) 232#define VDEC_MSG_RESP_FLUSH_INPUT_DONE (VDEC_MSG_BASE + 5) 233#define VDEC_MSG_RESP_FLUSH_OUTPUT_DONE (VDEC_MSG_BASE + 6) 234#define VDEC_MSG_RESP_START_DONE (VDEC_MSG_BASE + 7) 235#define VDEC_MSG_RESP_STOP_DONE (VDEC_MSG_BASE + 8) 236#define VDEC_MSG_RESP_PAUSE_DONE (VDEC_MSG_BASE + 9) 237#define VDEC_MSG_RESP_RESUME_DONE (VDEC_MSG_BASE + 10) 238#define VDEC_MSG_EVT_CONFIG_CHANGED (VDEC_MSG_BASE + 11) 239#define VDEC_MSG_EVT_HW_ERROR (VDEC_MSG_BASE + 12) 240#define VDEC_MSG_EVT_INFO_FIELD_DROPPED (VDEC_MSG_BASE + 13) 241#define VDEC_MSG_EVT_HW_OVERLOAD (VDEC_MSG_BASE + 14) 242#define VDEC_MSG_EVT_MAX_CLIENTS (VDEC_MSG_BASE + 15) 243#define VDEC_MSG_EVT_HW_UNSUPPORTED (VDEC_MSG_BASE + 16) 244 245// Define next macro with required values to enable default extradata, 246// VDEC_EXTRADATA_MB_ERROR_MAP 247// OMX_INTERLACE_EXTRADATA 248// OMX_FRAMEINFO_EXTRADATA 249// OMX_TIMEINFO_EXTRADATA 250 251//#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA) 252 253using namespace android; 254 255enum port_indexes { 256 OMX_CORE_INPUT_PORT_INDEX =0, 257 OMX_CORE_OUTPUT_PORT_INDEX =1, 258 OMX_CORE_INPUT_EXTRADATA_INDEX =2, 259 OMX_CORE_OUTPUT_EXTRADATA_INDEX =3 260}; 261 262 263class perf_metrics 264{ 265 public: 266 perf_metrics() : 267 start_time(0), 268 proc_time(0), 269 active(false) { 270 }; 271 ~perf_metrics() {}; 272 void start(); 273 void stop(); 274 void end(OMX_U32 units_cntr = 0); 275 void reset(); 276 OMX_U64 processing_time_us(); 277 private: 278 inline OMX_U64 get_act_time(); 279 OMX_U64 start_time; 280 OMX_U64 proc_time; 281 bool active; 282}; 283 284enum vdec_codec { 285 VDEC_CODECTYPE_H264 = 0x1, 286 VDEC_CODECTYPE_H263 = 0x2, 287 VDEC_CODECTYPE_MPEG4 = 0x3, 288 VDEC_CODECTYPE_DIVX_3 = 0x4, 289 VDEC_CODECTYPE_DIVX_4 = 0x5, 290 VDEC_CODECTYPE_DIVX_5 = 0x6, 291 VDEC_CODECTYPE_DIVX_6 = 0x7, 292 VDEC_CODECTYPE_XVID = 0x8, 293 VDEC_CODECTYPE_MPEG1 = 0x9, 294 VDEC_CODECTYPE_MPEG2 = 0xa, 295 VDEC_CODECTYPE_VC1 = 0xb, 296 VDEC_CODECTYPE_VC1_RCV = 0xc, 297 VDEC_CODECTYPE_HEVC = 0xd, 298 VDEC_CODECTYPE_MVC = 0xe, 299 VDEC_CODECTYPE_VP8 = 0xf, 300 VDEC_CODECTYPE_VP9 = 0x10, 301}; 302 303enum vdec_output_format { 304 VDEC_YUV_FORMAT_NV12 = 0x1, 305 VDEC_YUV_FORMAT_TILE_4x2 = 0x2, 306 VDEC_YUV_FORMAT_NV12_UBWC = 0x3, 307 VDEC_YUV_FORMAT_NV12_TP10_UBWC = 0x4 308}; 309 310enum vdec_interlaced_format { 311 VDEC_InterlaceFrameProgressive = 0x1, 312 VDEC_InterlaceInterleaveFrameTopFieldFirst = 0x2, 313 VDEC_InterlaceInterleaveFrameBottomFieldFirst = 0x4, 314 VDEC_InterlaceFrameTopFieldFirst = 0x8, 315 VDEC_InterlaceFrameBottomFieldFirst = 0x10, 316}; 317 318enum vdec_output_order { 319 VDEC_ORDER_DISPLAY = 0x1, 320 VDEC_ORDER_DECODE = 0x2 321}; 322 323struct vdec_framesize { 324 uint32_t left; 325 uint32_t top; 326 uint32_t right; 327 uint32_t bottom; 328}; 329 330struct vdec_picsize { 331 uint32_t frame_width; 332 uint32_t frame_height; 333 uint32_t stride; 334 uint32_t scan_lines; 335}; 336 337enum vdec_buffer { 338 VDEC_BUFFER_TYPE_INPUT, 339 VDEC_BUFFER_TYPE_OUTPUT 340}; 341 342struct vdec_allocatorproperty { 343 enum vdec_buffer buffer_type; 344 uint32_t mincount; 345 uint32_t maxcount; 346 uint32_t actualcount; 347 size_t buffer_size; 348 uint32_t alignment; 349 uint32_t buf_poolid; 350 size_t meta_buffer_size; 351}; 352 353struct vdec_bufferpayload { 354 void *bufferaddr; 355 size_t buffer_len; 356 int pmem_fd; 357 size_t offset; 358 size_t mmaped_size; 359}; 360 361enum vdec_picture { 362 PICTURE_TYPE_I, 363 PICTURE_TYPE_P, 364 PICTURE_TYPE_B, 365 PICTURE_TYPE_BI, 366 PICTURE_TYPE_SKIP, 367 PICTURE_TYPE_IDR, 368 PICTURE_TYPE_UNKNOWN 369}; 370 371struct vdec_aspectratioinfo { 372 uint32_t aspect_ratio; 373 uint32_t par_width; 374 uint32_t par_height; 375}; 376 377struct vdec_sep_metadatainfo { 378 void *metabufaddr; 379 uint32_t size; 380 int fd; 381 int offset; 382 uint32_t buffer_size; 383}; 384 385struct vdec_misrinfo { 386 uint32_t misr_dpb_luma; 387 uint32_t misr_dpb_chroma; 388 uint32_t misr_opb_luma; 389 uint32_t misr_opb_chroma; 390}; 391 392struct vdec_output_frameinfo { 393 void *bufferaddr; 394 size_t offset; 395 size_t len; 396 uint32_t flags; 397 int64_t time_stamp; 398 enum vdec_picture pic_type; 399 void *client_data; 400 void *input_frame_clientdata; 401 struct vdec_picsize picsize; 402 struct vdec_framesize framesize; 403 enum vdec_interlaced_format interlaced_format; 404 struct vdec_aspectratioinfo aspect_ratio_info; 405 struct vdec_sep_metadatainfo metadata_info; 406 struct vdec_misrinfo misrinfo[2]; 407}; 408 409union vdec_msgdata { 410 struct vdec_output_frameinfo output_frame; 411 void *input_frame_clientdata; 412}; 413 414struct vdec_msginfo { 415 uint32_t status_code; 416 uint32_t msgcode; 417 union vdec_msgdata msgdata; 418 size_t msgdatasize; 419}; 420 421struct vdec_framerate { 422 unsigned long fps_denominator; 423 unsigned long fps_numerator; 424}; 425 426#ifdef USE_ION 427struct vdec_ion { 428 int ion_device_fd; 429 struct ion_fd_data fd_ion_data; 430 struct ion_allocation_data ion_alloc_data; 431}; 432#endif 433 434struct extradata_buffer_info { 435 unsigned long buffer_size; 436 char* uaddr; 437 int count; 438 int size; 439#ifdef USE_ION 440 struct vdec_ion ion; 441#endif 442}; 443 444struct video_driver_context { 445 int video_driver_fd; 446 enum vdec_codec decoder_format; 447 enum vdec_output_format output_format; 448 enum vdec_interlaced_format interlace; 449 enum vdec_output_order picture_order; 450 struct vdec_framesize frame_size; 451 struct vdec_picsize video_resolution; 452 struct vdec_allocatorproperty ip_buf; 453 struct vdec_allocatorproperty op_buf; 454 struct vdec_bufferpayload *ptr_inputbuffer; 455 struct vdec_bufferpayload *ptr_outputbuffer; 456 struct vdec_output_frameinfo *ptr_respbuffer; 457#ifdef USE_ION 458 struct vdec_ion *ip_buf_ion_info; 459 struct vdec_ion *op_buf_ion_info; 460 struct vdec_ion h264_mv; 461 struct vdec_ion meta_buffer; 462 struct vdec_ion meta_buffer_iommu; 463#endif 464 struct vdec_framerate frame_rate; 465 unsigned extradata; 466 bool timestamp_adjust; 467 char kind[128]; 468 bool idr_only_decoding; 469 unsigned disable_dmx; 470 struct extradata_buffer_info extradata_info; 471 int num_planes; 472}; 473 474struct video_decoder_capability { 475 unsigned int min_width; 476 unsigned int max_width; 477 unsigned int min_height; 478 unsigned int max_height; 479}; 480 481struct debug_cap { 482 bool in_buffer_log; 483 bool out_buffer_log; 484 bool out_meta_buffer_log; 485 char infile_name[PROPERTY_VALUE_MAX + 36]; 486 char outfile_name[PROPERTY_VALUE_MAX + 36]; 487 char out_ymetafile_name[PROPERTY_VALUE_MAX + 36]; 488 char out_uvmetafile_name[PROPERTY_VALUE_MAX + 36]; 489 char log_loc[PROPERTY_VALUE_MAX]; 490 FILE *infile; 491 FILE *outfile; 492 FILE *out_ymeta_file; 493 FILE *out_uvmeta_file; 494}; 495 496struct dynamic_buf_list { 497 long fd; 498 long dup_fd; 499 OMX_U32 offset; 500 OMX_U32 ref_count; 501 void *buffaddr; 502 long mapped_size; 503}; 504 505struct extradata_info { 506 OMX_BOOL output_crop_updated; 507 OMX_CONFIG_RECTTYPE output_crop_rect; 508 OMX_U32 output_width; 509 OMX_U32 output_height; 510 OMX_QCOM_MISR_INFO misr_info[2]; 511}; 512 513typedef std::unordered_map <int, int> ColorSubMapping; 514typedef std::unordered_map <int, ColorSubMapping> DecColorMapping; 515 516// OMX video decoder class 517class omx_vdec: public qc_omx_component 518{ 519 520 public: 521 omx_vdec(); // constructor 522 virtual ~omx_vdec(); // destructor 523 524 static int async_message_process (void *context, void* message); 525 static void process_event_cb(void *ctxt); 526 527 OMX_ERRORTYPE allocate_buffer( 528 OMX_HANDLETYPE hComp, 529 OMX_BUFFERHEADERTYPE **bufferHdr, 530 OMX_U32 port, 531 OMX_PTR appData, 532 OMX_U32 bytes 533 ); 534 535 536 OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp); 537 538 OMX_ERRORTYPE component_init(OMX_STRING role); 539 540 OMX_ERRORTYPE component_role_enum( 541 OMX_HANDLETYPE hComp, 542 OMX_U8 *role, 543 OMX_U32 index 544 ); 545 546 OMX_ERRORTYPE component_tunnel_request( 547 OMX_HANDLETYPE hComp, 548 OMX_U32 port, 549 OMX_HANDLETYPE peerComponent, 550 OMX_U32 peerPort, 551 OMX_TUNNELSETUPTYPE *tunnelSetup 552 ); 553 554 OMX_ERRORTYPE empty_this_buffer( 555 OMX_HANDLETYPE hComp, 556 OMX_BUFFERHEADERTYPE *buffer 557 ); 558 559 560 561 OMX_ERRORTYPE fill_this_buffer( 562 OMX_HANDLETYPE hComp, 563 OMX_BUFFERHEADERTYPE *buffer 564 ); 565 566 567 OMX_ERRORTYPE free_buffer( 568 OMX_HANDLETYPE hComp, 569 OMX_U32 port, 570 OMX_BUFFERHEADERTYPE *buffer 571 ); 572 573 OMX_ERRORTYPE get_component_version( 574 OMX_HANDLETYPE hComp, 575 OMX_STRING componentName, 576 OMX_VERSIONTYPE *componentVersion, 577 OMX_VERSIONTYPE *specVersion, 578 OMX_UUIDTYPE *componentUUID 579 ); 580 581 OMX_ERRORTYPE get_config( 582 OMX_HANDLETYPE hComp, 583 OMX_INDEXTYPE configIndex, 584 OMX_PTR configData 585 ); 586 587 OMX_ERRORTYPE get_extension_index( 588 OMX_HANDLETYPE hComp, 589 OMX_STRING paramName, 590 OMX_INDEXTYPE *indexType 591 ); 592 593 OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp, 594 OMX_INDEXTYPE paramIndex, 595 OMX_PTR paramData); 596 597 OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp, 598 OMX_STATETYPE *state); 599 600 601 602 OMX_ERRORTYPE send_command(OMX_HANDLETYPE hComp, 603 OMX_COMMANDTYPE cmd, 604 OMX_U32 param1, 605 OMX_PTR cmdData); 606 607 608 OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE hComp, 609 OMX_CALLBACKTYPE *callbacks, 610 OMX_PTR appData); 611 612 OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp, 613 OMX_INDEXTYPE configIndex, 614 OMX_PTR configData); 615 616 OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp, 617 OMX_INDEXTYPE paramIndex, 618 OMX_PTR paramData); 619 620 OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE hComp, 621 OMX_BUFFERHEADERTYPE **bufferHdr, 622 OMX_U32 port, 623 OMX_PTR appData, 624 OMX_U32 bytes, 625 OMX_U8 *buffer); 626 627 OMX_ERRORTYPE use_input_heap_buffers( 628 OMX_HANDLETYPE hComp, 629 OMX_BUFFERHEADERTYPE** bufferHdr, 630 OMX_U32 port, 631 OMX_PTR appData, 632 OMX_U32 bytes, 633 OMX_U8* buffer); 634 635 OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE hComp, 636 OMX_BUFFERHEADERTYPE **bufferHdr, 637 OMX_U32 port, 638 OMX_PTR appData, 639 void * eglImage); 640 void complete_pending_buffer_done_cbs(); 641 struct video_driver_context drv_ctx; 642 int m_poll_efd; 643 OMX_ERRORTYPE allocate_extradata(); 644 void free_extradata(); 645 int update_resolution(int width, int height, int stride, int scan_lines); 646 OMX_ERRORTYPE is_video_session_supported(); 647 Signal signal; 648 pthread_t msg_thread_id; 649 pthread_t async_thread_id; 650 bool is_component_secure(); 651 void buf_ref_add(int nPortIndex); 652 void buf_ref_remove(); 653 OMX_BUFFERHEADERTYPE* get_omx_output_buffer_header(int index); 654 OMX_ERRORTYPE set_dpb(bool is_split_mode, int dpb_color_format); 655 OMX_ERRORTYPE decide_dpb_buffer_mode(bool split_opb_dpb_with_same_color_fmt); 656 int dpb_bit_depth; 657 bool async_thread_force_stop; 658 volatile bool message_thread_stop; 659 struct extradata_info m_extradata_info; 660 int m_progressive; 661 662 enum dither_type { 663 DITHER_DISABLE = 0, 664 DITHER_COLORSPACE_EXCEPTBT2020, 665 DITHER_ALL_COLORSPACE 666 }; 667 enum dither_type m_dither_config; 668 669 enum color_space_type { 670 BT2020 = 0, 671 EXCEPT_BT2020, 672 UNKNOWN 673 }; 674 enum color_space_type m_color_space; 675 676 private: 677 // Bit Positions 678 enum flags_bit_positions { 679 // Defer transition to IDLE 680 OMX_COMPONENT_IDLE_PENDING =0x1, 681 // Defer transition to LOADING 682 OMX_COMPONENT_LOADING_PENDING =0x2, 683 // First Buffer Pending 684 OMX_COMPONENT_FIRST_BUFFER_PENDING =0x3, 685 // Second Buffer Pending 686 OMX_COMPONENT_SECOND_BUFFER_PENDING =0x4, 687 // Defer transition to Enable 688 OMX_COMPONENT_INPUT_ENABLE_PENDING =0x5, 689 // Defer transition to Enable 690 OMX_COMPONENT_OUTPUT_ENABLE_PENDING =0x6, 691 // Defer transition to Disable 692 OMX_COMPONENT_INPUT_DISABLE_PENDING =0x7, 693 // Defer transition to Disable 694 OMX_COMPONENT_OUTPUT_DISABLE_PENDING =0x8, 695 //defer flush notification 696 OMX_COMPONENT_OUTPUT_FLUSH_PENDING =0x9, 697 OMX_COMPONENT_INPUT_FLUSH_PENDING =0xA, 698 OMX_COMPONENT_PAUSE_PENDING =0xB, 699 OMX_COMPONENT_EXECUTE_PENDING =0xC, 700 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD, 701 OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE, 702 OMX_COMPONENT_FLUSH_DEFERRED = 0xF 703 }; 704 705 // Deferred callback identifiers 706 enum { 707 //Event Callbacks from the vdec component thread context 708 OMX_COMPONENT_GENERATE_EVENT = 0x1, 709 //Buffer Done callbacks from the vdec component thread context 710 OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2, 711 //Frame Done callbacks from the vdec component thread context 712 OMX_COMPONENT_GENERATE_FRAME_DONE = 0x3, 713 //Buffer Done callbacks from the vdec component thread context 714 OMX_COMPONENT_GENERATE_FTB = 0x4, 715 //Frame Done callbacks from the vdec component thread context 716 OMX_COMPONENT_GENERATE_ETB = 0x5, 717 //Command 718 OMX_COMPONENT_GENERATE_COMMAND = 0x6, 719 //Push-Pending Buffers 720 OMX_COMPONENT_PUSH_PENDING_BUFS = 0x7, 721 // Empty Buffer Done callbacks 722 OMX_COMPONENT_GENERATE_EBD = 0x8, 723 //Flush Event Callbacks from the vdec component thread context 724 OMX_COMPONENT_GENERATE_EVENT_FLUSH = 0x9, 725 OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A, 726 OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B, 727 OMX_COMPONENT_GENERATE_FBD = 0xc, 728 OMX_COMPONENT_GENERATE_START_DONE = 0xD, 729 OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE, 730 OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF, 731 OMX_COMPONENT_GENERATE_STOP_DONE = 0x10, 732 OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11, 733 OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12, 734 OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13, 735 OMX_COMPONENT_GENERATE_EOS_DONE = 0x14, 736 OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15, 737 OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16, 738 OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17, 739 OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x18, 740 OMX_COMPONENT_CLOSE_MSG = 0x19 741 }; 742 743 enum vc1_profile_type { 744 VC1_SP_MP_RCV = 1, 745 VC1_AP = 2 746 }; 747 748 enum v4l2_ports { 749 CAPTURE_PORT, 750 OUTPUT_PORT, 751 MAX_PORT 752 }; 753 754 struct omx_event { 755 unsigned long param1; 756 unsigned long param2; 757 unsigned long id; 758 }; 759 760 struct omx_cmd_queue { 761 omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE]; 762 unsigned long m_read; 763 unsigned long m_write; 764 unsigned long m_size; 765 766 omx_cmd_queue(); 767 ~omx_cmd_queue(); 768 bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id); 769 bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id); 770 // get msgtype of the first ele from the queue 771 unsigned get_q_msg_type(); 772 773 }; 774 struct v4l2_capability cap; 775#ifdef _ANDROID_ 776 struct ts_entry { 777 OMX_TICKS timestamp; 778 bool valid; 779 }; 780 781 struct ts_arr_list { 782 ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS]; 783 784 ts_arr_list(); 785 ~ts_arr_list(); 786 787 bool insert_ts(OMX_TICKS ts); 788 bool pop_min_ts(OMX_TICKS &ts); 789 bool reset_ts_list(); 790 }; 791#endif 792 793 struct desc_buffer_hdr { 794 OMX_U8 *buf_addr; 795 OMX_U32 desc_data_size; 796 }; 797 bool allocate_done(void); 798 bool allocate_input_done(void); 799 bool allocate_output_done(void); 800 bool allocate_output_extradata_done(void); 801 802 OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 803 OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex, 804 OMX_BUFFERHEADERTYPE *pmem_bufferHdr); 805 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 806 void free_output_buffer_header(); 807 void free_input_buffer_header(); 808 void free_output_extradata_buffer_header(); 809 810 OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 811 OMX_BUFFERHEADERTYPE **bufferHdr, 812 OMX_U32 port, 813 OMX_PTR appData, 814 OMX_U32 bytes); 815 816 817 OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE hComp, 818 OMX_BUFFERHEADERTYPE **bufferHdr, 819 OMX_U32 port, 820 OMX_PTR appData, 821 OMX_U32 bytes); 822 823 OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE hComp, 824 OMX_BUFFERHEADERTYPE **bufferHdr, 825 OMX_U32 port,OMX_PTR appData, 826 OMX_U32 bytes); 827 OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp, 828 OMX_BUFFERHEADERTYPE **bufferHdr, 829 OMX_U32 port, 830 OMX_PTR appData, 831 OMX_U32 bytes, 832 OMX_U8 *buffer); 833 OMX_ERRORTYPE use_client_output_extradata_buffer(OMX_HANDLETYPE hComp, 834 OMX_BUFFERHEADERTYPE **bufferHdr, 835 OMX_U32 port, 836 OMX_PTR appData, 837 OMX_U32 bytes, 838 OMX_U8 *buffer); 839 OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType); 840 841 OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index); 842 OMX_ERRORTYPE allocate_output_headers(); 843 OMX_ERRORTYPE allocate_client_output_extradata_headers(); 844 bool execute_omx_flush(OMX_U32); 845 bool execute_output_flush(); 846 bool execute_input_flush(); 847 OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp, 848 OMX_BUFFERHEADERTYPE * buffer); 849 850 OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp, 851 OMX_BUFFERHEADERTYPE * buffer); 852 OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp, 853 OMX_BUFFERHEADERTYPE *buffer); 854 855 OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp, 856 OMX_BUFFERHEADERTYPE *buffer); 857 bool release_done(); 858 859 bool release_output_done(); 860 bool release_input_done(); 861 bool release_output_extradata_done(); 862 OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop); 863 OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop); 864 OMX_ERRORTYPE start_port_reconfig(); 865 OMX_ERRORTYPE update_picture_resolution(); 866 int stream_off(OMX_U32 port); 867 void adjust_timestamp(OMX_S64 &act_timestamp); 868 void set_frame_rate(OMX_S64 act_timestamp); 869 void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr); 870 void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr); 871 void convert_color_space_info(OMX_U32 primaries, OMX_U32 range, 872 OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, 873 ColorAspects *aspects); 874 bool handle_color_space_info(void *data, 875 ColorSpace_t *color_space, 876 ColorMetaData* color_mdata, 877 bool& set_color_aspects_only); 878 void set_colorspace_in_handle(ColorSpace_t color, unsigned int buf_index); 879 void print_debug_color_aspects(ColorAspects *aspects, const char *prefix); 880 void print_debug_hdr_color_info(HDRStaticInfo *hdr_info, const char *prefix); 881 void print_debug_hdr_color_info_mdata(ColorMetaData* color_mdata); 882 bool handle_content_light_level_info(void* data, ContentLightLevel* light_level_mdata); 883 bool handle_mastering_display_color_info(void* data, MasteringDisplay* mastering_display_mdata); 884 void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra); 885 void set_colormetadata_in_handle(ColorMetaData *color_mdata, unsigned int buf_index); 886 void prepare_color_aspects_metadata(OMX_U32 primaries, OMX_U32 range, 887 OMX_U32 transfer, OMX_U32 matrix, 888 ColorMetaData *color_mdata); 889 void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 890 OMX_U32 interlaced_format_type); 891 OMX_ERRORTYPE enable_extradata(OMX_U64 requested_extradata, bool is_internal, 892 bool enable = true); 893 void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 894 OMX_U32 num_conceal_mb, 895 OMX_U32 recovery_sei_flag, 896 OMX_U32 picture_type, 897 OMX_U32 frame_rate, 898 OMX_TICKS time_stamp, 899 struct msm_vidc_panscan_window_payload *panscan_payload, 900 struct vdec_aspectratioinfo *aspect_ratio_info); 901 void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 902 OMX_U32 num_conceal_mb, 903 OMX_U32 recovery_sei_flag, 904 OMX_U32 picture_type, 905 OMX_S64 timestamp, 906 OMX_U32 frame_rate, 907 struct vdec_aspectratioinfo *aspect_ratio_info); 908 void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info, 909 OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info); 910 void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra); 911 OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn); 912 void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra); 913 void append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra); 914 void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn); 915 void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user); 916 void append_concealmb_extradata(OMX_OTHER_EXTRADATATYPE *extra, 917 OMX_OTHER_EXTRADATATYPE *p_concealmb, OMX_U8 *conceal_mb_data); 918 void append_outputcrop_extradata(OMX_OTHER_EXTRADATATYPE *extra, 919 struct msm_vidc_output_crop_payload *output_crop_payload); 920 void append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra, 921 struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload); 922 void append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra, 923 struct msm_vidc_frame_qp_payload *qp_payload); 924 void append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra, 925 struct msm_vidc_frame_bits_info_payload *bits_payload); 926 void append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra, 927 struct msm_vidc_vqzip_sei_payload *vqzip_payload); 928 void insert_demux_addr_offset(OMX_U32 address_offset); 929 void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr); 930 OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr); 931 OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra); 932 933 bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 934 OMX_U32 alignment); 935#ifdef USE_ION 936 int alloc_map_ion_memory(OMX_U32 buffer_size, 937 OMX_U32 alignment, struct ion_allocation_data *alloc_data, 938 struct ion_fd_data *fd_data,int flag); 939 void free_ion_memory(struct vdec_ion *buf_ion_info); 940#endif 941 942 943 OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE hComp, 944 OMX_COMMANDTYPE cmd, 945 OMX_U32 param1, 946 OMX_PTR cmdData); 947 bool post_event( unsigned long p1, 948 unsigned long p2, 949 unsigned long id 950 ); 951 inline int clip2(int x) { 952 x = x -1; 953 x = x | x >> 1; 954 x = x | x >> 2; 955 x = x | x >> 4; 956 x = x | x >> 16; 957 x = x + 1; 958 return x; 959 } 960 961 OMX_ERRORTYPE vdec_alloc_h264_mv(); 962 void vdec_dealloc_h264_mv(); 963 OMX_ERRORTYPE vdec_alloc_meta_buffers(); 964 void vdec_dealloc_meta_buffers(); 965 966 inline void omx_report_error () { 967 if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) { 968 DEBUG_PRINT_ERROR("ERROR: Sending OMX_ErrorHardware to Client"); 969 m_error_propogated = true; 970 m_cb.EventHandler(&m_cmp,m_app_data, 971 OMX_EventError,OMX_ErrorHardware,0,NULL); 972 } 973 } 974 975 inline void omx_report_unsupported_setting () { 976 if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) { 977 DEBUG_PRINT_ERROR( 978 "ERROR: Sending OMX_ErrorUnsupportedSetting to Client"); 979 m_error_propogated = true; 980 m_cb.EventHandler(&m_cmp, m_app_data, 981 OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 982 } 983 } 984 inline void omx_report_hw_overload () { 985 if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) { 986 DEBUG_PRINT_ERROR( 987 "ERROR: Sending OMX_ErrorInsufficientResources to Client"); 988 m_error_propogated = true; 989 m_cb.EventHandler(&m_cmp, m_app_data, 990 OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL); 991 } 992 } 993 994#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 995 OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data); 996#endif 997#if defined (_ANDROID_ICS_) 998 struct nativebuffer { 999 native_handle_t *nativehandle; 1000 private_handle_t *privatehandle; 1001 int inuse; 1002 }; 1003 nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS]; 1004#endif 1005 1006 //************************************************************* 1007 //*******************MEMBER VARIABLES ************************* 1008 //************************************************************* 1009 pthread_mutex_t m_lock; 1010 pthread_mutex_t c_lock; 1011 pthread_mutex_t buf_lock; 1012 //sem to handle the minimum procesing of commands 1013 sem_t m_cmd_lock; 1014 sem_t m_safe_flush; 1015 bool m_error_propogated; 1016 // compression format 1017 OMX_VIDEO_CODINGTYPE eCompressionFormat; 1018 // OMX State 1019 OMX_STATETYPE m_state; 1020 // Application data 1021 OMX_PTR m_app_data; 1022 // Application callbacks 1023 OMX_CALLBACKTYPE m_cb; 1024 OMX_PRIORITYMGMTTYPE m_priority_mgm ; 1025 OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier; 1026 // fill this buffer queue 1027 omx_cmd_queue m_ftb_q; 1028 // Command Q for rest of the events 1029 omx_cmd_queue m_cmd_q; 1030 omx_cmd_queue m_etb_q; 1031 // Input memory pointer 1032 OMX_BUFFERHEADERTYPE *m_inp_mem_ptr; 1033 // Output memory pointer 1034 OMX_BUFFERHEADERTYPE *m_out_mem_ptr; 1035 // Client extradata memory pointer 1036 OMX_BUFFERHEADERTYPE *m_client_output_extradata_mem_ptr; 1037 // number of input bitstream error frame count 1038 unsigned int m_inp_err_count; 1039#ifdef _ANDROID_ 1040 // Timestamp list 1041 ts_arr_list m_timestamp_list; 1042#endif 1043 1044 bool input_flush_progress; 1045 bool output_flush_progress; 1046 bool input_use_buffer; 1047 bool output_use_buffer; 1048 bool ouput_egl_buffers; 1049 OMX_BOOL m_use_output_pmem; 1050 OMX_BOOL m_out_mem_region_smi; 1051 OMX_BOOL m_out_pvt_entry_pmem; 1052 1053 int pending_input_buffers; 1054 int pending_output_buffers; 1055 // bitmask array size for output side 1056 uint64_t m_out_bm_count; 1057 // bitmask array size for input side 1058 uint64_t m_inp_bm_count; 1059 // bitmask array size for extradata 1060 uint64_t m_out_extradata_bm_count; 1061 //Input port Populated 1062 OMX_BOOL m_inp_bPopulated; 1063 //Output port Populated 1064 OMX_BOOL m_out_bPopulated; 1065 // encapsulate the waiting states. 1066 uint64_t m_flags; 1067 1068 // store I/P PORT state 1069 OMX_BOOL m_inp_bEnabled; 1070 // store O/P PORT state 1071 OMX_BOOL m_out_bEnabled; 1072 OMX_U32 m_in_alloc_cnt; 1073 OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE]; 1074 // Platform specific details 1075 OMX_QCOM_PLATFORM_PRIVATE_LIST *m_platform_list; 1076 OMX_QCOM_PLATFORM_PRIVATE_ENTRY *m_platform_entry; 1077 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info; 1078 // SPS+PPS sent as part of set_config 1079 OMX_VENDOR_EXTRADATATYPE m_vendor_config; 1080 1081 /*Variables for arbitrary Byte parsing support*/ 1082 1083 omx_cmd_queue m_input_pending_q; 1084 omx_cmd_queue m_input_free_q; 1085 bool arbitrary_bytes; 1086 OMX_BUFFERHEADERTYPE h264_scratch; 1087 OMX_BUFFERHEADERTYPE *psource_frame; 1088 OMX_BUFFERHEADERTYPE *pdest_frame; 1089 OMX_BUFFERHEADERTYPE *m_inp_heap_ptr; 1090 OMX_BUFFERHEADERTYPE **m_phdr_pmem_ptr; 1091 unsigned int m_heap_inp_bm_count; 1092 bool first_frame_meta; 1093 unsigned frame_count; 1094 unsigned nal_count; 1095 unsigned nal_length; 1096 bool look_ahead_nal; 1097 int first_frame; 1098 unsigned char *first_buffer; 1099 int first_frame_size; 1100 unsigned char m_hwdevice_name[80]; 1101 FILE *m_device_file_ptr; 1102 enum vc1_profile_type m_vc1_profile; 1103 OMX_S64 h264_last_au_ts; 1104 OMX_U32 h264_last_au_flags; 1105 OMX_U32 m_demux_offsets[8192]; 1106 OMX_U32 m_demux_entries; 1107 OMX_U32 m_disp_hor_size; 1108 OMX_U32 m_disp_vert_size; 1109 OMX_S64 prev_ts; 1110 OMX_S64 prev_ts_actual; 1111 bool rst_prev_ts; 1112 OMX_U32 frm_int; 1113 OMX_U32 m_fps_received; 1114 float m_fps_prev; 1115 bool m_drc_enable; 1116 1117 struct vdec_allocatorproperty op_buf_rcnfg; 1118 bool in_reconfig; 1119 OMX_NATIVE_WINDOWTYPE m_display_id; 1120 OMX_U32 client_extradata; 1121#ifdef _ANDROID_ 1122 bool m_debug_timestamp; 1123 bool perf_flag; 1124 OMX_U32 proc_frms, latency; 1125 perf_metrics fps_metrics; 1126 perf_metrics dec_time; 1127 bool m_reject_avc_1080p_mp; 1128 bool m_enable_android_native_buffers; 1129 bool m_use_android_native_buffers; 1130 bool m_debug_extradata; 1131 bool m_debug_concealedmb; 1132 bool m_disable_dynamic_buf_mode; 1133 OMX_U32 m_conceal_color; 1134#endif 1135 1136 1137 struct h264_mv_buffer { 1138 unsigned char* buffer; 1139 int size; 1140 int count; 1141 int pmem_fd; 1142 int offset; 1143 }; 1144 h264_mv_buffer h264_mv_buff; 1145 1146 struct meta_buffer { 1147 unsigned char* buffer; 1148 int size; 1149 int count; 1150 int pmem_fd; 1151 int pmem_fd_iommu; 1152 int offset; 1153 }; 1154 meta_buffer meta_buff; 1155 OMX_PARAM_PORTDEFINITIONTYPE m_port_def; 1156 OMX_QCOM_FRAME_PACK_ARRANGEMENT m_frame_pack_arrangement; 1157 omx_time_stamp_reorder time_stamp_dts; 1158 desc_buffer_hdr *m_desc_buffer_ptr; 1159 bool secure_mode; 1160 bool allocate_native_handle; 1161 bool external_meta_buffer; 1162 bool external_meta_buffer_iommu; 1163 OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata; 1164 OMX_OTHER_EXTRADATATYPE *m_other_extradata; 1165 bool codec_config_flag; 1166 int capture_capability; 1167 int output_capability; 1168 bool streaming[MAX_PORT]; 1169 OMX_FRAMESIZETYPE framesize; 1170 OMX_CONFIG_RECTTYPE rectangle; 1171 OMX_U32 prev_n_filled_len; 1172 bool is_down_scalar_enabled; 1173 bool m_force_down_scalar; 1174 struct custom_buffersize { 1175 OMX_U32 input_buffersize; 1176 } m_custom_buffersize; 1177 bool m_power_hinted; 1178 bool is_q6_platform; 1179 OMX_ERRORTYPE power_module_register(); 1180 OMX_ERRORTYPE power_module_deregister(); 1181 bool msg_thread_created; 1182 bool async_thread_created; 1183 1184 OMX_VIDEO_PARAM_PROFILELEVELTYPE m_profile_lvl; 1185 OMX_U32 m_profile; 1186 1187 //variables to handle dynamic buffer mode 1188 bool dynamic_buf_mode; 1189 struct dynamic_buf_list *out_dynamic_list; 1190 OMX_U32 m_reconfig_width; 1191 OMX_U32 m_reconfig_height; 1192 bool m_smoothstreaming_mode; 1193 bool m_decode_order_mode; 1194 1195 bool m_input_pass_buffer_fd; 1196 DescribeColorAspectsParams m_client_color_space; 1197 DescribeColorAspectsParams m_internal_color_space; 1198 1199 // HDRStaticInfo defined in HardwareAPI.h 1200 DescribeHDRStaticInfoParams m_client_hdr_info; 1201 DescribeHDRStaticInfoParams m_internal_hdr_info; 1202 bool m_change_client_hdr_info; 1203 pthread_mutex_t m_hdr_info_client_lock; 1204 ColorMetaData m_color_mdata; 1205 1206 OMX_U32 operating_frame_rate; 1207 1208 OMX_U32 m_smoothstreaming_width; 1209 OMX_U32 m_smoothstreaming_height; 1210 OMX_ERRORTYPE enable_smoothstreaming(); 1211 OMX_ERRORTYPE enable_adaptive_playback(unsigned long width, unsigned long height); 1212 bool is_thulium_v1; 1213 bool m_disable_ubwc_mode; 1214 bool m_disable_split_mode; 1215 bool m_enable_downscalar; 1216 OMX_U32 m_downscalar_width; 1217 OMX_U32 m_downscalar_height; 1218 int decide_downscalar(); 1219 int enable_downscalar(); 1220 int disable_downscalar(); 1221 1222 unsigned int m_fill_output_msg; 1223 bool client_set_fps; 1224 unsigned int stereo_output_mode; 1225 class allocate_color_convert_buf 1226 { 1227 public: 1228 allocate_color_convert_buf(); 1229 ~allocate_color_convert_buf() {}; 1230 void set_vdec_client(void *); 1231 void update_client(); 1232 bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format); 1233 bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format); 1234 bool update_buffer_req(); 1235 bool get_buffer_req(unsigned int &buffer_size); 1236 OMX_ERRORTYPE set_buffer_req(OMX_U32 buffer_size, OMX_U32 actual_count); 1237 OMX_BUFFERHEADERTYPE* get_il_buf_hdr(); 1238 OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr); 1239 OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr); 1240 OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header); 1241 OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header); 1242 OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 1243 OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData, 1244 OMX_U32 bytes); 1245 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 1246 bool is_color_conversion_enabled() {return enabled;} 1247 private: 1248#define MAX_COUNT MAX_NUM_INPUT_OUTPUT_BUFFERS 1249 omx_vdec *omx; 1250 bool enabled; 1251 OMX_COLOR_FORMATTYPE ColorFormat; 1252 void init_members(); 1253 bool color_convert_mode; 1254 ColorConvertFormat dest_format; 1255 ColorConvertFormat src_format; 1256 C2DColorConverter c2dcc; 1257 unsigned int allocated_count; 1258 unsigned int buffer_size_req; 1259 unsigned int buffer_alignment_req; 1260 OMX_U32 m_c2d_width; 1261 OMX_U32 m_c2d_height; 1262 OMX_QCOM_PLATFORM_PRIVATE_LIST m_platform_list_client[MAX_COUNT]; 1263 OMX_QCOM_PLATFORM_PRIVATE_ENTRY m_platform_entry_client[MAX_COUNT]; 1264 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT]; 1265 OMX_BUFFERHEADERTYPE m_out_mem_ptr_client[MAX_COUNT]; 1266 DecColorMapping mMapOutput2DriverColorFormat; 1267 ColorSubMapping mMapOutput2Convert; 1268#ifdef USE_ION 1269 struct vdec_ion op_buf_ion_info[MAX_COUNT]; 1270#endif 1271 unsigned char *pmem_baseaddress[MAX_COUNT]; 1272 int pmem_fd[MAX_COUNT]; 1273 OMX_ERRORTYPE cache_ops(unsigned int index, unsigned int cmd); 1274 inline OMX_ERRORTYPE cache_clean_buffer(unsigned int index) { 1275 return cache_ops(index, ION_IOC_CLEAN_CACHES); 1276 } 1277 OMX_ERRORTYPE cache_clean_invalidate_buffer(unsigned int index) { 1278 return cache_ops(index, ION_IOC_CLEAN_INV_CACHES); 1279 } 1280 }; 1281 allocate_color_convert_buf client_buffers; 1282 struct video_decoder_capability m_decoder_capability; 1283 struct debug_cap m_debug; 1284 int log_input_buffers(const char *, int); 1285 int log_output_buffers(OMX_BUFFERHEADERTYPE *); 1286 void send_codec_config(); 1287 OMX_TICKS m_last_rendered_TS; 1288 volatile int32_t m_queued_codec_config_count; 1289 OMX_U32 current_perf_level; 1290 bool secure_scaling_to_non_secure_opb; 1291 bool m_force_compressed_for_dpb; 1292 bool m_is_display_session; 1293 1294 static OMX_COLOR_FORMATTYPE getPreferredColorFormatNonSurfaceMode(OMX_U32 index) { 1295 //On Android, we default to standard YUV formats for non-surface use-cases 1296 //where apps prefer known color formats. 1297 OMX_COLOR_FORMATTYPE formatsNonSurfaceMode[] = { 1298 [0] = OMX_COLOR_FormatYUV420SemiPlanar, 1299 [1] = OMX_COLOR_FormatYUV420Planar, 1300 [2] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m, 1301 [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView, 1302 [4] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed, 1303 }; 1304 return (index < sizeof(formatsNonSurfaceMode) / sizeof(OMX_COLOR_FORMATTYPE)) ? 1305 formatsNonSurfaceMode[index] : OMX_COLOR_FormatMax; 1306 } 1307 1308 OMX_COLOR_FORMATTYPE getPreferredColorFormatDefaultMode(OMX_U32 index) { 1309 //for surface mode (normal playback), advertise native/accelerated formats first 1310 OMX_COLOR_FORMATTYPE format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1311 1312 if (!m_disable_ubwc_mode) { 1313 OMX_COLOR_FORMATTYPE formatsDefault[] = { 1314 [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed, 1315 [1] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m, 1316 [2] = OMX_COLOR_FormatYUV420SemiPlanar, 1317 [3] = OMX_COLOR_FormatYUV420Planar, 1318 [4] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView, 1319 }; 1320 format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ? 1321 formatsDefault[index] : OMX_COLOR_FormatMax; 1322 } else { 1323 OMX_COLOR_FORMATTYPE formatsDefault[] = { 1324 [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m, 1325 [1] = OMX_COLOR_FormatYUV420SemiPlanar, 1326 [2] = OMX_COLOR_FormatYUV420Planar, 1327 [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView, 1328 }; 1329 format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ? 1330 formatsDefault[index] : OMX_COLOR_FormatMax; 1331 } 1332 return format; 1333 } 1334 1335 static OMX_ERRORTYPE describeColorFormat(OMX_PTR params); 1336 void prefetchNewBuffers(); 1337 1338 class client_extradata_info { 1339 private: 1340 OMX_U32 size; // size of extradata of each frame 1341 OMX_U32 buffer_count; 1342 OMX_BOOL enable; 1343 1344 public: 1345 client_extradata_info() { 1346 size = VENUS_EXTRADATA_SIZE(4096, 2160);; 1347 buffer_count = 0; 1348 enable = OMX_FALSE; 1349 } 1350 1351 ~client_extradata_info() { 1352 } 1353 1354 bool set_extradata_info(OMX_U32 size, OMX_U32 buffer_count) { 1355 this->size = size; 1356 this->buffer_count = buffer_count; 1357 return true; 1358 } 1359 void enable_client_extradata(OMX_BOOL enable) { 1360 this->enable = enable; 1361 } 1362 bool is_client_extradata_enabled() { 1363 return enable; 1364 } 1365 OMX_U32 getSize() const { 1366 return size; 1367 } 1368 OMX_U32 getBufferCount() const { 1369 return buffer_count; 1370 } 1371 }; 1372 client_extradata_info m_client_out_extradata_info; 1373 1374 OMX_ERRORTYPE get_vendor_extension_config( 1375 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext); 1376 OMX_ERRORTYPE set_vendor_extension_config( 1377 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext); 1378 1379 void init_vendor_extensions (VendorExtensionStore&); 1380 1381 // list of extensions is not mutable after initialization 1382 const VendorExtensionStore mVendorExtensionStore; 1383}; 1384 1385enum instance_state { 1386 MSM_VIDC_CORE_UNINIT_DONE = 0x0001, 1387 MSM_VIDC_CORE_INIT, 1388 MSM_VIDC_CORE_INIT_DONE, 1389 MSM_VIDC_OPEN, 1390 MSM_VIDC_OPEN_DONE, 1391 MSM_VIDC_LOAD_RESOURCES, 1392 MSM_VIDC_LOAD_RESOURCES_DONE, 1393 MSM_VIDC_START, 1394 MSM_VIDC_START_DONE, 1395 MSM_VIDC_STOP, 1396 MSM_VIDC_STOP_DONE, 1397 MSM_VIDC_RELEASE_RESOURCES, 1398 MSM_VIDC_RELEASE_RESOURCES_DONE, 1399 MSM_VIDC_CLOSE, 1400 MSM_VIDC_CLOSE_DONE, 1401 MSM_VIDC_CORE_UNINIT, 1402}; 1403 1404enum vidc_resposes_id { 1405 MSM_VIDC_DECODER_FLUSH_DONE = 0x11, 1406 MSM_VIDC_DECODER_EVENT_CHANGE, 1407}; 1408 1409#endif // __OMX_VDEC_H__ 1410