Home | History | Annotate | Download | only in encoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 
     21 /*****************************************************************************/
     22 /* File Includes                                                             */
     23 /*****************************************************************************/
     24 
     25 /* System include files */
     26 #include <stdlib.h>
     27 #include <stdio.h>
     28 #include <assert.h>
     29 #include <string.h>
     30 
     31 /* User include files */
     32 #include "ih264_typedefs.h"
     33 #include "iv2.h"
     34 #include "ive2.h"
     35 #include "ih264e.h"
     36 #include "app.h"
     37 
     38 /*****************************************************************************/
     39 /* Constant Macros                                                           */
     40 /*****************************************************************************/
     41 
     42 
     43 /*****************************************************************************/
     44 /*  Macros                                                                   */
     45 /*****************************************************************************/
     46 
     47 
     48 /*****************************************************************************/
     49 /*  Function Definitions                                                     */
     50 /*****************************************************************************/
     51 
     52 IV_STATUS_T read_pic_info(app_ctxt_t *ps_app_ctxt, void *pv_pic_info)
     53 {
     54     IV_STATUS_T ret = IV_SUCCESS;
     55     WORD32 size, bytes;
     56 
     57     switch(ps_app_ctxt->u4_pic_info_type)
     58     {
     59         case 1:
     60             size = sizeof(ih264e_pic_info1_t);
     61             ps_app_ctxt->u4_pic_info_size = sizeof(ih264e_pic_info1_t);
     62             break;
     63         case 2:
     64             size = sizeof(ih264e_pic_info2_t);
     65             ps_app_ctxt->u4_pic_info_size = sizeof(ih264e_pic_info2_t);
     66             break;
     67         default:
     68             size = 0;
     69             break;
     70     }
     71 
     72     bytes = fread(pv_pic_info, 1, size, ps_app_ctxt->fp_pic_info);
     73     if(bytes != size)
     74         ret = IV_FAIL;
     75 
     76     return ret;
     77 }
     78 
     79 IV_STATUS_T read_mb_info(app_ctxt_t *ps_app_ctxt, void *pv_mb_info)
     80 {
     81     IV_STATUS_T ret = IV_SUCCESS;
     82     WORD32 num_mbs;
     83     WORD32 size;
     84     WORD32 bytes;
     85 
     86     num_mbs = ALIGN16(ps_app_ctxt->u4_wd) *  ALIGN16(ps_app_ctxt->u4_ht);
     87     num_mbs /= 256;
     88 
     89     switch(ps_app_ctxt->u4_mb_info_type)
     90     {
     91         case 1:
     92             size = sizeof(ih264e_mb_info1_t) * num_mbs;
     93             ps_app_ctxt->u4_mb_info_size = sizeof(ih264e_mb_info1_t);
     94             break;
     95         case 2:
     96             size = sizeof(ih264e_mb_info2_t) * num_mbs;
     97             ps_app_ctxt->u4_mb_info_size = sizeof(ih264e_mb_info2_t);
     98             break;
     99         case 3:
    100             size = sizeof(ih264e_mb_info3_t) * num_mbs;
    101             ps_app_ctxt->u4_mb_info_size = sizeof(ih264e_mb_info3_t);
    102             break;
    103         case 4:
    104             size = sizeof(ih264e_mb_info4_t) * num_mbs;
    105             ps_app_ctxt->u4_mb_info_size = sizeof(ih264e_mb_info4_t);
    106             break;
    107         default:
    108             size = 0;
    109             break;
    110     }
    111 
    112     bytes = fread(pv_mb_info, 1, size, ps_app_ctxt->fp_mb_info);
    113     if(bytes != size)
    114         ret = IV_FAIL;
    115 
    116     return ret;
    117 }
    118 
    119 IV_STATUS_T read_input(FILE *fp, iv_raw_buf_t *ps_raw_buf)
    120 {
    121     WORD32 bytes;
    122     WORD32 wd, ht, strd;
    123     UWORD8 *pu1_buf;
    124     WORD32 i;
    125     WORD32 comp;
    126     WORD32 num_comp;
    127 
    128     if (IV_YUV_422ILE == ps_raw_buf->e_color_fmt)
    129     {
    130         wd = ps_raw_buf->au4_wd[0];
    131         ht = ps_raw_buf->au4_ht[0];
    132         strd = ps_raw_buf->au4_strd[0];
    133         pu1_buf = ps_raw_buf->apv_bufs[0];
    134 
    135         for(i = 0; i < ht; i++)
    136         {
    137             bytes = fread(pu1_buf, sizeof(UWORD8), wd, fp);
    138             if(bytes != wd )
    139             {
    140                 return(IV_FAIL);
    141             }
    142             pu1_buf += strd;
    143         }
    144     }
    145     else
    146     {
    147         num_comp = 2;
    148 
    149         if(IV_YUV_420P == ps_raw_buf->e_color_fmt)
    150             num_comp = 3;
    151 
    152         for(comp = 0; comp < num_comp; comp++)
    153         {
    154             wd = ps_raw_buf->au4_wd[comp];
    155             ht = ps_raw_buf->au4_ht[comp];
    156             strd = ps_raw_buf->au4_strd[comp];
    157             pu1_buf = ps_raw_buf->apv_bufs[comp];
    158 
    159             for(i = 0; i < ht; i++)
    160             {
    161                 bytes = fread(pu1_buf, sizeof(UWORD8), wd, fp);
    162                 if(bytes != wd)
    163                 {
    164                     return(IV_FAIL);
    165                 }
    166                 pu1_buf += strd;
    167             }
    168         }
    169     }
    170     return IV_SUCCESS;
    171 }
    172 
    173 
    174 IV_STATUS_T dump_input(FILE *fp, iv_raw_buf_t *ps_raw_buf)
    175 {
    176     WORD32 bytes;
    177     WORD32 wd, ht, strd;
    178     UWORD8 *pu1_buf;
    179     WORD32 i;
    180     WORD32 comp;
    181     WORD32 num_comp;
    182 
    183     if (IV_YUV_422ILE == ps_raw_buf->e_color_fmt)
    184     {
    185         wd = ps_raw_buf->au4_wd[0];
    186         ht = ps_raw_buf->au4_ht[0];
    187         strd = ps_raw_buf->au4_strd[0];
    188         pu1_buf = ps_raw_buf->apv_bufs[0];
    189 
    190         for(i = 0; i < ht; i++)
    191         {
    192             bytes = fwrite(pu1_buf, sizeof(UWORD8), wd, fp);
    193             if(bytes != wd )
    194             {
    195                 return(IV_FAIL);
    196             }
    197             pu1_buf += strd;
    198         }
    199     }
    200     else
    201     {
    202         num_comp = 2;
    203 
    204         if(IV_YUV_420P == ps_raw_buf->e_color_fmt)
    205             num_comp = 3;
    206 
    207         for(comp = 0; comp < num_comp; comp++)
    208         {
    209             wd = ps_raw_buf->au4_wd[comp];
    210             ht = ps_raw_buf->au4_ht[comp];
    211             strd = ps_raw_buf->au4_strd[comp];
    212             pu1_buf = ps_raw_buf->apv_bufs[comp];
    213 
    214             for(i = 0; i < ht; i++)
    215             {
    216                 bytes = fwrite(pu1_buf, sizeof(UWORD8), wd, fp);
    217                 if(bytes != wd)
    218                 {
    219                     return(IV_FAIL);
    220                 }
    221                 pu1_buf += strd;
    222             }
    223         }
    224     }
    225     return IV_SUCCESS;
    226 }
    227 
    228 void allocate_input(app_ctxt_t *ps_app_ctxt)
    229 {
    230 
    231     WORD32 num_bufs;
    232     WORD32 pic_size;
    233     WORD32 luma_size;
    234     WORD32 chroma_size;
    235     WORD32 num_mbs;
    236     WORD32 i;
    237     UWORD8 *pu1_buf[3];
    238 
    239     ih264e_ctl_getbufinfo_op_t *ps_get_buf_info_op = &ps_app_ctxt->s_get_buf_info_op;
    240 
    241     num_bufs = MAX(DEFAULT_NUM_INPUT_BUFS, ps_get_buf_info_op->s_ive_op.u4_min_inp_bufs);
    242     num_bufs = MIN(DEFAULT_MAX_INPUT_BUFS, num_bufs);
    243 
    244     /* Size of buffer */
    245     luma_size = ps_app_ctxt->u4_wd * ps_app_ctxt->u4_ht;
    246     chroma_size = luma_size >> 1;
    247     pic_size = luma_size + chroma_size;
    248 
    249     num_mbs = ALIGN16(ps_app_ctxt->u4_max_wd) *  ALIGN16(ps_app_ctxt->u4_max_ht);
    250     num_mbs /= 256;
    251 
    252     /* Memset the input buffer array to set is_free to 0 */
    253     memset(ps_app_ctxt->as_input_buf, 0, sizeof(input_buf_t) * DEFAULT_MAX_INPUT_BUFS);
    254 
    255     for(i = 0; i < num_bufs; i++)
    256     {
    257         pu1_buf[0] = (UWORD8 *)ih264a_aligned_malloc(16, pic_size);
    258         if(NULL == pu1_buf[0])
    259         {
    260             CHAR ac_error[STRLENGTH];
    261             sprintf(ac_error, "Allocation failed for input buffer of size %d\n",
    262                     pic_size);
    263             codec_exit(ac_error);
    264         }
    265         ps_app_ctxt->as_input_buf[i].pu1_buf = pu1_buf[0];
    266 
    267         pu1_buf[0] = (UWORD8 *)ih264a_aligned_malloc(16, num_mbs * sizeof(ih264e_mb_info_t));
    268         if(NULL == pu1_buf[0])
    269         {
    270             CHAR ac_error[STRLENGTH];
    271             sprintf(ac_error, "Allocation failed for mb info buffer of size %d\n",
    272                     (WORD32)(num_mbs * sizeof(ih264e_mb_info_t)));
    273             codec_exit(ac_error);
    274         }
    275         ps_app_ctxt->as_input_buf[i].pv_mb_info = pu1_buf[0];
    276         pu1_buf[0] = (UWORD8 *)ih264a_aligned_malloc(16, sizeof(ih264e_pic_info2_t));
    277         if(NULL == pu1_buf[0])
    278         {
    279             CHAR ac_error[STRLENGTH];
    280             sprintf(ac_error, "Allocation failed for pic info buffer of size %d\n",
    281                    (WORD32) sizeof(ih264e_pic_info2_t));
    282             codec_exit(ac_error);
    283         }
    284         ps_app_ctxt->as_input_buf[i].pv_pic_info = pu1_buf[0];
    285         ps_app_ctxt->as_input_buf[i].u4_buf_size = pic_size;
    286         ps_app_ctxt->as_input_buf[i].u4_is_free = 1;
    287     }
    288     return;
    289 }
    290 
    291 
    292 void free_input(app_ctxt_t *ps_app_ctxt)
    293 {
    294 
    295     WORD32 num_bufs;
    296     WORD32 i;
    297 
    298     num_bufs = MAX(DEFAULT_NUM_INPUT_BUFS, ps_app_ctxt->s_get_buf_info_op.s_ive_op.u4_min_inp_bufs);
    299     num_bufs = MIN(DEFAULT_MAX_INPUT_BUFS, num_bufs);
    300 
    301     for(i = 0; i < num_bufs; i++)
    302     {
    303         ih264a_aligned_free(ps_app_ctxt->as_input_buf[i].pu1_buf);
    304         ih264a_aligned_free(ps_app_ctxt->as_input_buf[i].pv_mb_info);
    305         ih264a_aligned_free(ps_app_ctxt->as_input_buf[i].pv_pic_info);
    306     }
    307     return;
    308 }
    309 
    310