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