1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*-------------------------------------------------------------------------- 2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (c) 2010-2012, Code Aurora Forum. All rights reserved. 3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without 5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met: 6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * Redistributions of source code must retain the above copyright 7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev notice, this list of conditions and the following disclaimer. 8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * Redistributions in binary form must reproduce the above copyright 9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev notice, this list of conditions and the following disclaimer in the 10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev documentation and/or other materials provided with the distribution. 11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand * Neither the name of Code Aurora nor 12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev the names of its contributors may be used to endorse or promote 13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev products derived from this software without specific prior written 14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev permission. 15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/ 28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "extra_data_handler.h" 30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevextra_data_handler::extra_data_handler() 32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rbsp_buf = (OMX_U8 *) calloc(1,100); 34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(&frame_packing_arrangement,0,sizeof(frame_packing_arrangement)); 35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.cancel_flag = 1; 36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pack_sei = false; 37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sei_payload_type = -1; 38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevextra_data_handler::~extra_data_handler() 41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(rbsp_buf) { 43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(rbsp_buf); 44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rbsp_buf = NULL; 45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::d_u(OMX_U32 num_bits) 49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 rem_bits = num_bits, bins = 0, shift = 0; 51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(rem_bits >= bit_ptr) { 53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr, 54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_ptr, rbsp_buf[byte_ptr]); 55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bins <<= shift; 56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev shift = (8-bit_ptr); 57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bins |= ((rbsp_buf[byte_ptr] << shift) & 0xFF) >> shift; 58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rem_bits -= bit_ptr; 59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bit_ptr = 8; 60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_ptr ++; 61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr, 63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_ptr, rbsp_buf[byte_ptr]); 64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (rem_bits) { 66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bins <<= rem_bits; 67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bins |= ((rbsp_buf[byte_ptr] << (8-bit_ptr)) & 0xFF) >> (8-rem_bits); 68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bit_ptr -= rem_bits; 69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (bit_ptr == 0) { 70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bit_ptr = 8; 71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_ptr++; 72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr, 75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_ptr, rbsp_buf[byte_ptr]); 76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() bin/num_bits : %x/%d", __func__, bins, num_bits); 78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return bins; 79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::d_ue() 82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_S32 lead_zeros = -1; 84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 symbol, bit; 85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev do{ 86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bit = d_u(1); 87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev lead_zeros++; 88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }while (!bit); 89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev symbol = ((1 << lead_zeros) - 1) + d_u(lead_zeros); 91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() symbol : %d", __func__,symbol); 93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return symbol; 94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::parse_frame_pack(OMX_U32 payload_size) 97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.id = d_ue(); 99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.cancel_flag = d_u(1); 100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!frame_packing_arrangement.cancel_flag) { 101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.type = d_u(7); 102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.quincunx_sampling_flag = d_u(1); 103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.content_interpretation_type = d_u(6); 104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.spatial_flipping_flag = d_u(1); 105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.frame0_flipped_flag = d_u(1); 106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.field_views_flag = d_u(1); 107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.current_frame_is_frame0_flag = d_u(1); 108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.frame0_self_contained_flag = d_u(1); 109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.frame1_self_contained_flag = d_u(1); 110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!frame_packing_arrangement.quincunx_sampling_flag && 112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.type != 5) { 113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.frame0_grid_position_x = d_u(4); 114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.frame0_grid_position_y = d_u(4); 115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.frame1_grid_position_x = d_u(4); 116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.frame1_grid_position_y = d_u(4); 117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.reserved_byte = d_u(8); 119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.repetition_period = d_ue(); 120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.extension_flag = d_u(1); 122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 1; 124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_S32 extra_data_handler::parse_rbsp(OMX_U8 *buf, OMX_U32 len) 127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 i = 3, j=0, startcode; 129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 nal_unit_type, nal_ref_idc, forbidden_zero_bit; 130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bit_ptr = 8; 132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_ptr = 0; 133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev startcode = buf[0] << 16 | buf[1] <<8 | buf[2]; 135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (!startcode) { 137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev startcode |= buf[i++]; 138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(startcode != H264_START_CODE) { 140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: In %s() Start code not found", __func__); 141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev forbidden_zero_bit = (buf[i] & 0x80) >>7; 144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(forbidden_zero_bit) { 145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: In %s() Non-zero forbidden bit", __func__); 146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_ref_idc = (buf[i] & 0x60) >>5; 149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() nal_ref_idc ; %d", __func__, nal_ref_idc); 150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_unit_type = (buf[i++] & 0x1F); 152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(i<len) { 154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!(buf[i] + buf[i+1]) && (buf[i+2] == H264_EMULATION_BYTE) && 155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (i+2 < len)) { 156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rbsp_buf[j++] = buf[i++]; 157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rbsp_buf[j++] = buf[i++]; 158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev i++; 159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else 160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rbsp_buf[j++] = buf[i++]; 161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return nal_unit_type; 163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_S32 extra_data_handler::parse_sei(OMX_U8 *buffer, OMX_U32 buffer_length) 165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 nal_unit_type, payload_type = 0, payload_size = 0; 167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 marker = 0, pad = 0xFF; 168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nal_unit_type = parse_rbsp(buffer, buffer_length); 170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (nal_unit_type != NAL_TYPE_SEI) { 172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: In %s() - Non SEI NAL ", __func__); 173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(rbsp_buf[byte_ptr] == 0xFF) 177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev payload_type += rbsp_buf[byte_ptr++]; 178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev payload_type += rbsp_buf[byte_ptr++]; 179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() payload_type : %u", __func__, payload_type); 181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(rbsp_buf[byte_ptr] == 0xFF) 183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev payload_size += rbsp_buf[byte_ptr++]; 184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev payload_size += rbsp_buf[byte_ptr++]; 185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() payload_size : %u", __func__, payload_size); 187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev switch(payload_type) { 189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT: 190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() Frame Packing SEI ", __func__); 191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev parse_frame_pack(payload_size); 192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nINFO: In %s() Not Supported SEI NAL ", __func__); 195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev break; 196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(bit_ptr != 8) { 199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev marker = d_u(1); 200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(marker) { 201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(bit_ptr != 8) { 202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pad = d_u(bit_ptr); 203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pad) { 204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: In %s() padding Bits Error in SEI", 205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev __func__); 206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("\nERROR: In %s() Marker Bit Error in SEI", 211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev __func__); 212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\nIn %s() payload_size : %u/%u", __func__, 216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev payload_size, byte_ptr); 217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 1; 218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*====================================================================== 220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev Slice Information will be available as below (each line is of 4 bytes) 221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev | number of slices | 222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev | 1st slice offset | 223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev | 1st slice size | 224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev | .. | 225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev | Nth slice offset | 226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev | Nth slice size | 227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev======================================================================*/ 228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_S32 extra_data_handler::parse_sliceinfo( 229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_BUFFERHEADERTYPE *pBufHdr, OMX_OTHER_EXTRADATATYPE *pExtra) 230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 slice_offset = 0, slice_size = 0, total_size = 0; 232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *pBuffer = (OMX_U8 *)pBufHdr->pBuffer; 233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 *data = (OMX_U32 *)pExtra->data; 234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 num_slices = *data; 235dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand DEBUG_PRINT_HIGH("number of slices = %d", num_slices); 236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((4 + num_slices * 8) != (OMX_U32)pExtra->nDataSize) { 237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("unknown error in slice info extradata"); 238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for (int i = 0; i < num_slices; i++) { 241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev slice_offset = (OMX_U32)(*(data + (i*2 + 1))); 242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((*(pBuffer + slice_offset + 0) != 0x00) || 243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*(pBuffer + slice_offset + 1) != 0x00) || 244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*(pBuffer + slice_offset + 2) != 0x00) || 245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (*(pBuffer + slice_offset + 3) != H264_START_CODE)) { 246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("found 0x%x instead of start code at offset[%d] " 247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "for slice[%d]", (OMX_U32)(*(OMX_U32 *)(pBuffer + slice_offset)), 248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev slice_offset, i); 249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (slice_offset != total_size) { 252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("offset of slice number %d is not correct " 253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "or previous slice size is not correct", i); 254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev slice_size = (OMX_U32)(*(data + (i*2 + 2))); 257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev total_size += slice_size; 258dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand DEBUG_PRINT_HIGH("slice number %d offset/size = %d/%d", 259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev i, slice_offset, slice_size); 260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (pBufHdr->nFilledLen != total_size) { 262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_ERROR("frame_size[%d] is not equal to " 263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "total slices size[%d]", pBufHdr->nFilledLen, total_size); 264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return -1; 265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 0; 267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::parse_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr) 270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 271dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand OMX_OTHER_EXTRADATATYPE *extra_data = (OMX_OTHER_EXTRADATATYPE *) 272dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand ((unsigned)(buf_hdr->pBuffer + buf_hdr->nOffset + 273dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand buf_hdr->nFilledLen + 3)&(~3)); 274b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand 275dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand DEBUG_PRINT_LOW("\nIn %s() symbol : %u", __func__,buf_hdr->nFlags); 276b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand 277dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand if (buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA) { 278dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand while(extra_data && (OMX_U8*)extra_data < (buf_hdr->pBuffer + 279dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand buf_hdr->nAllocLen) && extra_data->eType != VDEC_EXTRADATA_NONE) { 280dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand DEBUG_PRINT_LOW("\nExtra data type(%x) Extra data size(%u)", 281dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand extra_data->eType, extra_data->nDataSize); 282dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand if (extra_data->eType == VDEC_EXTRADATA_SEI) { 283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev parse_sei(extra_data->data, extra_data->nDataSize); 284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (extra_data->eType == VEN_EXTRADATA_QCOMFILLER) { 286dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand DEBUG_PRINT_HIGH("Extradata Qcom Filler found, skip %d bytes", 287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data->nSize); 288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev else if (extra_data->eType == VEN_EXTRADATA_SLICEINFO) { 290dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand DEBUG_PRINT_HIGH("Extradata SliceInfo of size %d found, " 291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev "parsing it", extra_data->nDataSize); 292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev parse_sliceinfo(buf_hdr, extra_data); 293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) extra_data) + 295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev extra_data->nSize); 296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 1; 299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::get_frame_pack_data( 302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack) 303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n%s:%d get frame data", __func__, __LINE__); 305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(&frame_pack->id,&frame_packing_arrangement.id, 306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev FRAME_PACK_SIZE*sizeof(OMX_U32)); 307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 1; 308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::set_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT 311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *frame_pack) 312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n%s:%d set frame data", __func__, __LINE__); 314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(&frame_packing_arrangement.id, &frame_pack->id, 315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev FRAME_PACK_SIZE*sizeof(OMX_U32)); 316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pack_sei = true; 317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sei_payload_type = SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT; 318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 1; 319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::e_u(OMX_U32 symbol, OMX_U32 num_bits) 322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 rem_bits = num_bits, shift; 324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n%s bin : %x/%d", __func__, symbol, num_bits); 326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev while(rem_bits >= bit_ptr) { 328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev shift = rem_bits - bit_ptr; 329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rbsp_buf[byte_ptr] |= (symbol >> shift); 330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev symbol = (symbol << (32 - shift)) >> (32 - shift); 331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rem_bits -= bit_ptr; 332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n%sstream byte/rem_bits %x/%d", __func__, 333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rbsp_buf[byte_ptr], rem_bits); 334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_ptr ++; 335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bit_ptr = 8; 336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(rem_bits) { 339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev shift = bit_ptr - rem_bits; 340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rbsp_buf[byte_ptr] |= (symbol << shift); 341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bit_ptr -= rem_bits; 342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n%s 2 stream byte/rem_bits %x", __func__, 343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev rbsp_buf[byte_ptr], rem_bits); 344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(bit_ptr == 0) { 345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bit_ptr = 8; 346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_ptr++; 347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 1; 350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::e_ue(OMX_U32 symbol) 353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 i, sym_len, sufix_len, info; 355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 nn =(symbol + 1) >> 1; 356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n%s bin : %x", __func__, symbol); 358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i=0; i < 33 && nn != 0; i++) 360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev nn >>= 1; 361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sym_len = ((i << 1) + 1); 363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev info = symbol + 1 - (1 << i); 364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sufix_len = (1 << (sym_len >>1)); 365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev info = sufix_len | (info & (sufix_len - 1)); 366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(info, sym_len); 367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 1; 368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::create_frame_pack() 371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_ue(frame_packing_arrangement.id); 373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.cancel_flag, 1); 374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!frame_packing_arrangement.cancel_flag) { 375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.type, 7); 376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.quincunx_sampling_flag, 1); 377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.content_interpretation_type, 6); 378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.spatial_flipping_flag, 1); 379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.frame0_flipped_flag, 1); 380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.field_views_flag, 1); 381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.current_frame_is_frame0_flag, 1); 382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.frame0_self_contained_flag, 1); 383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.frame1_self_contained_flag, 1); 384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!frame_packing_arrangement.quincunx_sampling_flag && 385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev frame_packing_arrangement.type != 5) { 386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.frame0_grid_position_x, 4); 387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.frame0_grid_position_y, 4); 388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.frame1_grid_position_x, 4); 389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.frame1_grid_position_y, 4); 390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.reserved_byte, 8); 392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_ue(frame_packing_arrangement.repetition_period); 393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(frame_packing_arrangement.extension_flag, 1); 395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 1; 396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_S32 extra_data_handler::create_rbsp(OMX_U8 *buf, OMX_U32 nalu_type) 399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 i, j = 7; 401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i = 0;i < 3;i++) 402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *buf++ = 0x00; 403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *buf++ = H264_START_CODE; 404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *buf++ = nalu_type; 405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *buf++ = (sei_payload_type & 0x000000FF); 406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *buf++ = byte_ptr - 1; //payload will contain 1 byte of rbsp_trailing_bits 407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //that shouldn't be taken into account 408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev for(i = 0;i < byte_ptr ;i += 2) { 410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *buf++ = rbsp_buf[i]; 411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev j++; 412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(i+1 < byte_ptr) { 413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *buf++ = rbsp_buf[i+1]; 414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev j++; 415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(!(rbsp_buf[i] + rbsp_buf[i+1])) { 416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *buf++ = H264_EMULATION_BYTE; 417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev j++; 418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n%s rbsp length %d", __func__, j); 423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return j; 424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::create_sei(OMX_U8 *buffer) 427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 i, ret_val = 0; 429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev byte_ptr = 0; 431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev bit_ptr = 8; 432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(sei_payload_type == SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT) { 434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev create_frame_pack(); 435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(bit_ptr != 8) { 437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(1,1); 438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(bit_ptr != 8) 439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(0,bit_ptr); 440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //Payload will have been byte aligned by now, 443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //insert the rbsp trailing bits 444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(1, 1); 445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev e_u(0, 7); 446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev ret_val = create_rbsp(buffer, NAL_TYPE_SEI); 448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pack_sei = false; 451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sei_payload_type = -1; 452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return ret_val; 454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 extra_data_handler::create_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr) 457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buffer = (OMX_U8 *) ((unsigned)(buf_hdr->pBuffer + 459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_hdr->nOffset + buf_hdr->nFilledLen)); 460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 msg_size; 461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 462dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand DEBUG_PRINT_LOW("\n filled_len/orig_len %d/%d", buf_hdr->nFilledLen, 463dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand buf_hdr->nAllocLen); 464dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(buf_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("\n%s:%d create extra data with config", __func__, 467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev __LINE__); 468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if(pack_sei) { 469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev msg_size = create_sei(buffer); 470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if( msg_size > 0) 471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_hdr->nFilledLen += msg_size; 472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 474dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand DEBUG_PRINT_LOW("\n filled_len/orig_len %d/%d", buf_hdr->nFilledLen, 475dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand buf_hdr->nAllocLen); 476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return 1; 477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 479