147e37c4428509524ee576920a98381f3e4872493Nick Pelly/*--------------------------------------------------------------------------
2826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCopyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
347e37c4428509524ee576920a98381f3e4872493Nick Pelly
447e37c4428509524ee576920a98381f3e4872493Nick PellyRedistribution and use in source and binary forms, with or without
547e37c4428509524ee576920a98381f3e4872493Nick Pellymodification, are permitted provided that the following conditions are met:
647e37c4428509524ee576920a98381f3e4872493Nick Pelly    * Redistributions of source code must retain the above copyright
747e37c4428509524ee576920a98381f3e4872493Nick Pelly      notice, this list of conditions and the following disclaimer.
847e37c4428509524ee576920a98381f3e4872493Nick Pelly    * Redistributions in binary form must reproduce the above copyright
947e37c4428509524ee576920a98381f3e4872493Nick Pelly      notice, this list of conditions and the following disclaimer in the
1047e37c4428509524ee576920a98381f3e4872493Nick Pelly      documentation and/or other materials provided with the distribution.
1147e37c4428509524ee576920a98381f3e4872493Nick Pelly    * Neither the name of Code Aurora nor
1247e37c4428509524ee576920a98381f3e4872493Nick Pelly      the names of its contributors may be used to endorse or promote
1347e37c4428509524ee576920a98381f3e4872493Nick Pelly      products derived from this software without specific prior written
1447e37c4428509524ee576920a98381f3e4872493Nick Pelly      permission.
1547e37c4428509524ee576920a98381f3e4872493Nick Pelly
1647e37c4428509524ee576920a98381f3e4872493Nick PellyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1747e37c4428509524ee576920a98381f3e4872493Nick PellyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1847e37c4428509524ee576920a98381f3e4872493Nick PellyIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1947e37c4428509524ee576920a98381f3e4872493Nick PellyNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2047e37c4428509524ee576920a98381f3e4872493Nick PellyCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2147e37c4428509524ee576920a98381f3e4872493Nick PellyEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2247e37c4428509524ee576920a98381f3e4872493Nick PellyPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2347e37c4428509524ee576920a98381f3e4872493Nick PellyOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2447e37c4428509524ee576920a98381f3e4872493Nick PellyWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2547e37c4428509524ee576920a98381f3e4872493Nick PellyOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2647e37c4428509524ee576920a98381f3e4872493Nick PellyADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2747e37c4428509524ee576920a98381f3e4872493Nick Pelly--------------------------------------------------------------------------*/
2847e37c4428509524ee576920a98381f3e4872493Nick Pelly/*============================================================================
2947e37c4428509524ee576920a98381f3e4872493Nick Pelly                    V E N C _ T E S T. C P P
3047e37c4428509524ee576920a98381f3e4872493Nick Pelly
3147e37c4428509524ee576920a98381f3e4872493Nick PellyDESCRIPTION
3247e37c4428509524ee576920a98381f3e4872493Nick Pelly
3347e37c4428509524ee576920a98381f3e4872493Nick Pelly This is the OMX test app .
3447e37c4428509524ee576920a98381f3e4872493Nick Pelly
3547e37c4428509524ee576920a98381f3e4872493Nick PellyREFERENCES
3647e37c4428509524ee576920a98381f3e4872493Nick Pelly
3747e37c4428509524ee576920a98381f3e4872493Nick Pelly============================================================================*/
3847e37c4428509524ee576920a98381f3e4872493Nick Pelly
3947e37c4428509524ee576920a98381f3e4872493Nick Pelly//usage
4047e37c4428509524ee576920a98381f3e4872493Nick Pelly// FILE QVGA MP4 24 384000 100 enc_qvga.yuv QVGA_24.m4v
4147e37c4428509524ee576920a98381f3e4872493Nick Pelly// FILE QCIF MP4 15 96000 0 foreman.qcif.yuv output_qcif.m4v
4247e37c4428509524ee576920a98381f3e4872493Nick Pelly// FILE VGA MP4 24 1200000 218 enc_vga.yuv vga_output.m4v
4347e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <sys/types.h>
4447e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <sys/stat.h>
4547e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <string.h>
4647e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <unistd.h>
4747e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <stdlib.h>
4847e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <stdio.h>
4947e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <pthread.h>
5047e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <fcntl.h>
5147e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <sys/mman.h>
5247e37c4428509524ee576920a98381f3e4872493Nick Pelly//#include <sys/time.h>
5347e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <time.h>
5447e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <sys/ioctl.h>
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h>
5647e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <string.h>
5747e37c4428509524ee576920a98381f3e4872493Nick Pelly//#include <sys/stat.h>
5847e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "OMX_QCOMExtns.h"
5947e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "OMX_Core.h"
6047e37c4428509524ee576920a98381f3e4872493Nick Pelly
6147e37c4428509524ee576920a98381f3e4872493Nick Pelly#define QCOM_EXT 1
6247e37c4428509524ee576920a98381f3e4872493Nick Pelly
6347e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "OMX_Core.h"
6447e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "OMX_Video.h"
6547e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "OMX_Component.h"
6647e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "camera_test.h"
6747e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "fb_test.h"
6847e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "venc_util.h"
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "extra_data_handler.h"
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
71278952ff92fab2da0c47b912daeb662130676be1Haynes Mathew George#include <linux/msm_ion.h>
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7347e37c4428509524ee576920a98381f3e4872493Nick Pelly
7447e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
7547e37c4428509524ee576920a98381f3e4872493Nick Pelly// MACROS
7647e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
7747e37c4428509524ee576920a98381f3e4872493Nick Pelly
7847e37c4428509524ee576920a98381f3e4872493Nick Pelly#define CHK(result) if (result != OMX_ErrorNone) { E("*************** error *************"); exit(0); }
7947e37c4428509524ee576920a98381f3e4872493Nick Pelly#define TEST_LOG
8047e37c4428509524ee576920a98381f3e4872493Nick Pelly#ifdef VENC_SYSLOG
8147e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "cutils/log.h"
8247e37c4428509524ee576920a98381f3e4872493Nick Pelly/// Debug message macro
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define D(fmt, ...) LOGE("venc_test Debug %s::%d "fmt"\n",              \
8447e37c4428509524ee576920a98381f3e4872493Nick Pelly                         __FUNCTION__, __LINE__,                        \
8547e37c4428509524ee576920a98381f3e4872493Nick Pelly                         ## __VA_ARGS__)
8647e37c4428509524ee576920a98381f3e4872493Nick Pelly
8747e37c4428509524ee576920a98381f3e4872493Nick Pelly/// Error message macro
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define E(fmt, ...) LOGE("venc_test Error %s::%d "fmt"\n",            \
8947e37c4428509524ee576920a98381f3e4872493Nick Pelly                         __FUNCTION__, __LINE__,                      \
9047e37c4428509524ee576920a98381f3e4872493Nick Pelly                         ## __VA_ARGS__)
9147e37c4428509524ee576920a98381f3e4872493Nick Pelly
9247e37c4428509524ee576920a98381f3e4872493Nick Pelly#else
9347e37c4428509524ee576920a98381f3e4872493Nick Pelly     #ifdef TEST_LOG
9447e37c4428509524ee576920a98381f3e4872493Nick Pelly       #define D(fmt, ...) fprintf(stderr, "venc_test Debug %s::%d "fmt"\n",   \
9547e37c4428509524ee576920a98381f3e4872493Nick Pelly                            __FUNCTION__, __LINE__,                     \
9647e37c4428509524ee576920a98381f3e4872493Nick Pelly                            ## __VA_ARGS__)
9747e37c4428509524ee576920a98381f3e4872493Nick Pelly
9847e37c4428509524ee576920a98381f3e4872493Nick Pelly     /// Error message macro
9947e37c4428509524ee576920a98381f3e4872493Nick Pelly      #define E(fmt, ...) fprintf(stderr, "venc_test Error %s::%d "fmt"\n", \
10047e37c4428509524ee576920a98381f3e4872493Nick Pelly                            __FUNCTION__, __LINE__,                   \
10147e37c4428509524ee576920a98381f3e4872493Nick Pelly                            ## __VA_ARGS__)
10247e37c4428509524ee576920a98381f3e4872493Nick Pelly     #else
10347e37c4428509524ee576920a98381f3e4872493Nick Pelly      #define D(fmt, ...)
10447e37c4428509524ee576920a98381f3e4872493Nick Pelly      #define E(fmt, ...)
10547e37c4428509524ee576920a98381f3e4872493Nick Pelly         #endif
10647e37c4428509524ee576920a98381f3e4872493Nick Pelly
10747e37c4428509524ee576920a98381f3e4872493Nick Pelly#endif
10847e37c4428509524ee576920a98381f3e4872493Nick Pelly
10947e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
11047e37c4428509524ee576920a98381f3e4872493Nick Pelly// CONSTANTS
11147e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
11247e37c4428509524ee576920a98381f3e4872493Nick Pellystatic const int MAX_MSG = 100;
11347e37c4428509524ee576920a98381f3e4872493Nick Pelly//#warning do not hardcode these use port definition
11447e37c4428509524ee576920a98381f3e4872493Nick Pellystatic const int PORT_INDEX_IN = 0;
11547e37c4428509524ee576920a98381f3e4872493Nick Pellystatic const int PORT_INDEX_OUT = 1;
11647e37c4428509524ee576920a98381f3e4872493Nick Pelly
11747e37c4428509524ee576920a98381f3e4872493Nick Pellystatic const int NUM_IN_BUFFERS = 10;
11847e37c4428509524ee576920a98381f3e4872493Nick Pellystatic const int NUM_OUT_BUFFERS = 10;
11947e37c4428509524ee576920a98381f3e4872493Nick Pelly
12047e37c4428509524ee576920a98381f3e4872493Nick Pellyunsigned int num_in_buffers = 0;
12147e37c4428509524ee576920a98381f3e4872493Nick Pellyunsigned int num_out_buffers = 0;
12247e37c4428509524ee576920a98381f3e4872493Nick Pelly
12347e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
12447e37c4428509524ee576920a98381f3e4872493Nick Pelly/* MPEG4 profile and level table*/
12547e37c4428509524ee576920a98381f3e4872493Nick Pellystatic const unsigned int mpeg4_profile_level_table[][5]=
12647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
12747e37c4428509524ee576920a98381f3e4872493Nick Pelly    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
12847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
13047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
13147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
13247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
13347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
13647e37c4428509524ee576920a98381f3e4872493Nick Pelly
137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
13947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
14047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
14147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
14247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
14447e37c4428509524ee576920a98381f3e4872493Nick Pelly};
14547e37c4428509524ee576920a98381f3e4872493Nick Pelly
14647e37c4428509524ee576920a98381f3e4872493Nick Pelly/* H264 profile and level table*/
14747e37c4428509524ee576920a98381f3e4872493Nick Pellystatic const unsigned int h264_profile_level_table[][5]=
14847e37c4428509524ee576920a98381f3e4872493Nick Pelly{
14947e37c4428509524ee576920a98381f3e4872493Nick Pelly     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
15047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
15147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
15247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
15347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},
15447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},
15547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},
15647e37c4428509524ee576920a98381f3e4872493Nick Pelly    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},
15747e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
15847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
15947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
16347e37c4428509524ee576920a98381f3e4872493Nick Pelly
16447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
16547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
16647e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},
16747e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},
16847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},
16947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},
17047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},
17147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
17247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
17347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0}
191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
19247e37c4428509524ee576920a98381f3e4872493Nick Pelly};
19347e37c4428509524ee576920a98381f3e4872493Nick Pelly
19447e37c4428509524ee576920a98381f3e4872493Nick Pelly/* H263 profile and level table*/
19547e37c4428509524ee576920a98381f3e4872493Nick Pellystatic const unsigned int h263_profile_level_table[][5]=
19647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
19747e37c4428509524ee576920a98381f3e4872493Nick Pelly    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
19847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
19947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
20047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},
20147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},
20247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},
20347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
20447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
20547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0}
20747e37c4428509524ee576920a98381f3e4872493Nick Pelly};
20847e37c4428509524ee576920a98381f3e4872493Nick Pelly
209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define FractionToQ16(q,num,den) { OMX_U32 power; Log2(den,power); q = num << (16 - power); }
211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
21247e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
21347e37c4428509524ee576920a98381f3e4872493Nick Pelly// TYPES
21447e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
21547e37c4428509524ee576920a98381f3e4872493Nick Pellystruct ProfileType
21647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
21747e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_VIDEO_CODINGTYPE eCodec;
21847e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_VIDEO_MPEG4LEVELTYPE eLevel;
21947e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_VIDEO_CONTROLRATETYPE eControlRate;
22047e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_VIDEO_AVCSLICEMODETYPE eSliceMode;
22147e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_U32 nFrameWidth;
22247e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_U32 nFrameHeight;
22347e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_U32 nFrameBytes;
224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef BADGER
225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_U32 nFramestride;
226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_U32 nFrameScanlines;
227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_U32 nFrameRead;
228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
22947e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_U32 nBitrate;
230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   float nFramerate;
23147e37c4428509524ee576920a98381f3e4872493Nick Pelly   char* cInFileName;
23247e37c4428509524ee576920a98381f3e4872493Nick Pelly   char* cOutFileName;
233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_U32 nUserProfile;
23447e37c4428509524ee576920a98381f3e4872493Nick Pelly};
23547e37c4428509524ee576920a98381f3e4872493Nick Pelly
23647e37c4428509524ee576920a98381f3e4872493Nick Pellyenum MsgId
23747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
23847e37c4428509524ee576920a98381f3e4872493Nick Pelly   MSG_ID_OUTPUT_FRAME_DONE,
23947e37c4428509524ee576920a98381f3e4872493Nick Pelly   MSG_ID_INPUT_FRAME_DONE,
24047e37c4428509524ee576920a98381f3e4872493Nick Pelly   MSG_ID_MAX
24147e37c4428509524ee576920a98381f3e4872493Nick Pelly};
24247e37c4428509524ee576920a98381f3e4872493Nick Pellyunion MsgData
24347e37c4428509524ee576920a98381f3e4872493Nick Pelly{
24447e37c4428509524ee576920a98381f3e4872493Nick Pelly   struct
24547e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
24647e37c4428509524ee576920a98381f3e4872493Nick Pelly      OMX_BUFFERHEADERTYPE* pBuffer;
24747e37c4428509524ee576920a98381f3e4872493Nick Pelly   } sBitstreamData;
24847e37c4428509524ee576920a98381f3e4872493Nick Pelly};
24947e37c4428509524ee576920a98381f3e4872493Nick Pellystruct Msg
25047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
25147e37c4428509524ee576920a98381f3e4872493Nick Pelly   MsgId id;
25247e37c4428509524ee576920a98381f3e4872493Nick Pelly   MsgData data;
25347e37c4428509524ee576920a98381f3e4872493Nick Pelly};
25447e37c4428509524ee576920a98381f3e4872493Nick Pellystruct MsgQ
25547e37c4428509524ee576920a98381f3e4872493Nick Pelly{
25647e37c4428509524ee576920a98381f3e4872493Nick Pelly   Msg q[MAX_MSG];
25747e37c4428509524ee576920a98381f3e4872493Nick Pelly   int head;
25847e37c4428509524ee576920a98381f3e4872493Nick Pelly   int size;
25947e37c4428509524ee576920a98381f3e4872493Nick Pelly};
26047e37c4428509524ee576920a98381f3e4872493Nick Pelly
26147e37c4428509524ee576920a98381f3e4872493Nick Pellyenum Mode
26247e37c4428509524ee576920a98381f3e4872493Nick Pelly{
26347e37c4428509524ee576920a98381f3e4872493Nick Pelly   MODE_PREVIEW,
26447e37c4428509524ee576920a98381f3e4872493Nick Pelly   MODE_DISPLAY,
26547e37c4428509524ee576920a98381f3e4872493Nick Pelly   MODE_PROFILE,
26647e37c4428509524ee576920a98381f3e4872493Nick Pelly   MODE_FILE_ENCODE,
26747e37c4428509524ee576920a98381f3e4872493Nick Pelly   MODE_LIVE_ENCODE
26847e37c4428509524ee576920a98381f3e4872493Nick Pelly};
26947e37c4428509524ee576920a98381f3e4872493Nick Pelly
270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevenum ResyncMarkerType
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   RESYNC_MARKER_NONE,     ///< No resync marker
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   RESYNC_MARKER_BYTE,     ///< BYTE Resync marker for MPEG4, H.264
274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   RESYNC_MARKER_MB,       ///< MB resync marker for MPEG4, H.264
275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   RESYNC_MARKER_GOB       ///< GOB resync marker for H.263
276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunion DynamicConfigData
279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_VIDEO_CONFIG_BITRATETYPE bitrate;
281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_CONFIG_FRAMERATETYPE framerate;
282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   QOMX_VIDEO_INTRAPERIODTYPE intraperiod;
283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_CONFIG_INTRAREFRESHVOPTYPE intravoprefresh;
284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_CONFIG_ROTATIONTYPE rotation;
285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   float f_framerate;
286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstruct DynamicConfig
289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   bool pending;
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   unsigned frame_num;
292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_INDEXTYPE config_param;
293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   union DynamicConfigData config_data;
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstruct enc_ion
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int ion_device_fd;
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   struct ion_allocation_data alloc_data;
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   struct ion_fd_data ion_alloc_fd;
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
30547e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
30647e37c4428509524ee576920a98381f3e4872493Nick Pelly// MODULE VARS
30747e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
30847e37c4428509524ee576920a98381f3e4872493Nick Pellystatic pthread_mutex_t m_mutex;
30947e37c4428509524ee576920a98381f3e4872493Nick Pellystatic pthread_cond_t m_signal;
31047e37c4428509524ee576920a98381f3e4872493Nick Pellystatic MsgQ m_sMsgQ;
31147e37c4428509524ee576920a98381f3e4872493Nick Pelly
31247e37c4428509524ee576920a98381f3e4872493Nick Pelly//#warning determine how many buffers we really have
31347e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_STATETYPE m_eState = OMX_StateInvalid;
31447e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_COMPONENTTYPE m_sComponent;
31547e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_HANDLETYPE m_hHandle = NULL;
31647e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_BUFFERHEADERTYPE* m_pOutBuffers[NUM_OUT_BUFFERS] = {NULL};
31747e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_BUFFERHEADERTYPE* m_pInBuffers[NUM_IN_BUFFERS] = {NULL};
31847e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_BOOL m_bInFrameFree[NUM_IN_BUFFERS];
31947e37c4428509524ee576920a98381f3e4872493Nick Pelly
32047e37c4428509524ee576920a98381f3e4872493Nick PellyProfileType m_sProfile;
32147e37c4428509524ee576920a98381f3e4872493Nick Pelly
32247e37c4428509524ee576920a98381f3e4872493Nick Pellystatic int m_nFramePlay = 0;
32347e37c4428509524ee576920a98381f3e4872493Nick Pellystatic int m_eMode = MODE_PREVIEW;
32447e37c4428509524ee576920a98381f3e4872493Nick Pellystatic int m_nInFd = -1;
32547e37c4428509524ee576920a98381f3e4872493Nick Pellystatic int m_nOutFd = -1;
32647e37c4428509524ee576920a98381f3e4872493Nick Pellystatic int m_nTimeStamp = 0;
32747e37c4428509524ee576920a98381f3e4872493Nick Pellystatic int m_nFrameIn = 0; // frames pushed to encoder
32847e37c4428509524ee576920a98381f3e4872493Nick Pellystatic int m_nFrameOut = 0; // frames returned by encoder
32947e37c4428509524ee576920a98381f3e4872493Nick Pellystatic int m_nAVCSliceMode = 0;
33047e37c4428509524ee576920a98381f3e4872493Nick Pellystatic bool m_bWatchDogKicked = false;
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE  *m_pDynConfFile = NULL;
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic struct DynamicConfig dynamic_config;
33347e37c4428509524ee576920a98381f3e4872493Nick Pelly
33447e37c4428509524ee576920a98381f3e4872493Nick Pelly/* Statistics Logging */
33547e37c4428509524ee576920a98381f3e4872493Nick Pellystatic long long tot_bufsize = 0;
33647e37c4428509524ee576920a98381f3e4872493Nick Pellyint ebd_cnt=0, fbd_cnt=0;
33747e37c4428509524ee576920a98381f3e4872493Nick Pelly
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const char* PMEM_DEVICE = "/dev/ion";
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_720P
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const char* PMEM_DEVICE = "/dev/pmem_adsp";
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P_EBI
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const char* PMEM_DEVICE  = "/dev/pmem_adsp";
344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif MAX_RES_1080P
345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const char* PMEM_DEVICE = "/dev/pmem_smipool";
346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#error PMEM_DEVICE cannot be determined.
348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstruct enc_ion ion_data;
352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
35347e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
35447e37c4428509524ee576920a98381f3e4872493Nick Pelly// MODULE FUNCTIONS
35547e37c4428509524ee576920a98381f3e4872493Nick Pelly//////////////////////////
35647e37c4428509524ee576920a98381f3e4872493Nick Pelly
35747e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid* PmemMalloc(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem, int nSize)
35847e37c4428509524ee576920a98381f3e4872493Nick Pelly{
35947e37c4428509524ee576920a98381f3e4872493Nick Pelly   void *pvirt = NULL;
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int rc = 0;
36147e37c4428509524ee576920a98381f3e4872493Nick Pelly
36247e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (!pMem)
36347e37c4428509524ee576920a98381f3e4872493Nick Pelly      return NULL;
36447e37c4428509524ee576920a98381f3e4872493Nick Pelly
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
366e1b75ccf790ae63be6a99f617a1927d1e003cac9Haynes Mathew George  ion_data.ion_device_fd = open (PMEM_DEVICE,O_RDONLY | O_DSYNC);
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(ion_data.ion_device_fd < 0)
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      E("\nERROR: ION Device open() Failed");
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return NULL;
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  nSize = (nSize + 4095) & (~4095);
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ion_data.alloc_data.len = nSize;
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ion_data.alloc_data.flags = 0x1 << ION_CP_MM_HEAP_ID;
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ion_data.alloc_data.align = 4096;
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(ion_data.ion_device_fd,ION_IOC_ALLOC,&ion_data.alloc_data);
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(rc || !ion_data.alloc_data.handle) {
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         E("\n ION ALLOC memory failed ");
380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ion_data.alloc_data.handle=NULL;
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return NULL;
382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  ion_data.ion_alloc_fd.handle = ion_data.alloc_data.handle;
385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(ion_data.ion_device_fd,ION_IOC_MAP,&ion_data.ion_alloc_fd);
386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(rc) {
387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        E("\n ION MAP failed ");
388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ion_data.ion_alloc_fd.fd =-1;
389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ion_data.ion_alloc_fd.fd =-1;
390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return NULL;
391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pMem->pmem_fd = ion_data.ion_alloc_fd.fd;
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pMem->pmem_fd = open(PMEM_DEVICE, O_RDWR);
39547e37c4428509524ee576920a98381f3e4872493Nick Pelly   if ((int)(pMem->pmem_fd) < 0)
39647e37c4428509524ee576920a98381f3e4872493Nick Pelly      return NULL;
39747e37c4428509524ee576920a98381f3e4872493Nick Pelly   nSize = (nSize + 4095) & (~4095);
398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
39947e37c4428509524ee576920a98381f3e4872493Nick Pelly   pMem->offset = 0;
40047e37c4428509524ee576920a98381f3e4872493Nick Pelly   pvirt = mmap(NULL, nSize,
40147e37c4428509524ee576920a98381f3e4872493Nick Pelly                PROT_READ | PROT_WRITE,
40247e37c4428509524ee576920a98381f3e4872493Nick Pelly                MAP_SHARED, pMem->pmem_fd, pMem->offset);
40347e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (pvirt == (void*) MAP_FAILED)
40447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
40547e37c4428509524ee576920a98381f3e4872493Nick Pelly      close(pMem->pmem_fd);
406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pMem->pmem_fd = -1;
407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ioctl(ion_data.ion_device_fd,ION_IOC_FREE,
409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       &ion_data.alloc_data.handle)) {
410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      E("ion recon buffer free failed");
411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_data.alloc_data.handle = NULL;
413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_data.ion_alloc_fd.fd =-1;
414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(ion_data.ion_device_fd);
415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    ion_data.ion_device_fd =-1;
416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return NULL;
41847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
41947e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("allocated pMem->fd = %d pvirt=0x%x, pMem->phys=0x%x, size = %d", pMem->pmem_fd,
42047e37c4428509524ee576920a98381f3e4872493Nick Pelly       pvirt, pMem->offset, nSize);
42147e37c4428509524ee576920a98381f3e4872493Nick Pelly   return pvirt;
42247e37c4428509524ee576920a98381f3e4872493Nick Pelly}
42347e37c4428509524ee576920a98381f3e4872493Nick Pelly
42447e37c4428509524ee576920a98381f3e4872493Nick Pellyint PmemFree(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem, void* pvirt, int nSize)
42547e37c4428509524ee576920a98381f3e4872493Nick Pelly{
42647e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (!pMem || !pvirt)
42747e37c4428509524ee576920a98381f3e4872493Nick Pelly      return -1;
42847e37c4428509524ee576920a98381f3e4872493Nick Pelly
42947e37c4428509524ee576920a98381f3e4872493Nick Pelly   nSize = (nSize + 4095) & (~4095);
43047e37c4428509524ee576920a98381f3e4872493Nick Pelly   munmap(pvirt, nSize);
43147e37c4428509524ee576920a98381f3e4872493Nick Pelly   close(pMem->pmem_fd);
43247e37c4428509524ee576920a98381f3e4872493Nick Pelly   pMem->pmem_fd = -1;
433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if(ioctl(ion_data.ion_device_fd,ION_IOC_FREE,
435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         &ion_data.alloc_data.handle)) {
436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        E("ion recon buffer free failed");
437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ion_data.alloc_data.handle = NULL;
439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ion_data.ion_alloc_fd.fd =-1;
440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   close(ion_data.ion_device_fd);
441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   ion_data.ion_device_fd =-1;
442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
44347e37c4428509524ee576920a98381f3e4872493Nick Pelly   return 0;
44447e37c4428509524ee576920a98381f3e4872493Nick Pelly}
445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid PrintFramePackArrangement(OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement)
446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("id (%d)\n",
448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           framePackingArrangement.id);
449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("cancel_flag (%d)\n",
450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           framePackingArrangement.cancel_flag);
451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("type (%d)\n",
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           framePackingArrangement.type);
453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    printf("quincunx_sampling_flag (%d)\n",
454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           framePackingArrangement.quincunx_sampling_flag);
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("content_interpretation_type (%d)\n",
456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.content_interpretation_type);
457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("spatial_flipping_flag (%d)\n",
458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.spatial_flipping_flag);
459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame0_flipped_flag (%d)\n",
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame0_flipped_flag);
461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("field_views_flag (%d)\n",
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.field_views_flag);
463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("current_frame_is_frame0_flag (%d)\n",
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.current_frame_is_frame0_flag);
465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame0_self_contained_flag (%d)\n",
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame0_self_contained_flag);
467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame1_self_contained_flag (%d)\n",
468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame1_self_contained_flag);
469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame0_grid_position_x (%d)\n",
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame0_grid_position_x);
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame0_grid_position_y (%d)\n",
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame0_grid_position_y);
473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame1_grid_position_x (%d)\n",
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame1_grid_position_x);
475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("frame1_grid_position_y (%d)\n",
476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.frame1_grid_position_y);
477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("reserved_byte (%d)\n",
478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.reserved_byte);
479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("repetition_period (%d)\n",
480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.repetition_period);
481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   printf("extension_flag (%d)\n",
482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          framePackingArrangement.extension_flag);
483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
48447e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid SetState(OMX_STATETYPE eState)
48547e37c4428509524ee576920a98381f3e4872493Nick Pelly{
48647e37c4428509524ee576920a98381f3e4872493Nick Pelly#define GOTO_STATE(eState)                      \
48747e37c4428509524ee576920a98381f3e4872493Nick Pelly   case eState:                                 \
48847e37c4428509524ee576920a98381f3e4872493Nick Pelly      {                                         \
48947e37c4428509524ee576920a98381f3e4872493Nick Pelly         D("Going to state " # eState"...");            \
49047e37c4428509524ee576920a98381f3e4872493Nick Pelly         OMX_SendCommand(m_hHandle,                     \
49147e37c4428509524ee576920a98381f3e4872493Nick Pelly                         OMX_CommandStateSet,           \
49247e37c4428509524ee576920a98381f3e4872493Nick Pelly                         (OMX_U32) eState,              \
49347e37c4428509524ee576920a98381f3e4872493Nick Pelly                         NULL);                         \
49447e37c4428509524ee576920a98381f3e4872493Nick Pelly         while (m_eState != eState)                     \
49547e37c4428509524ee576920a98381f3e4872493Nick Pelly         {                                              \
49647e37c4428509524ee576920a98381f3e4872493Nick Pelly            sleep(1);                               \
49747e37c4428509524ee576920a98381f3e4872493Nick Pelly         }                                              \
49847e37c4428509524ee576920a98381f3e4872493Nick Pelly         D("Now in state " # eState);                   \
49947e37c4428509524ee576920a98381f3e4872493Nick Pelly         break;                                         \
50047e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
50147e37c4428509524ee576920a98381f3e4872493Nick Pelly
50247e37c4428509524ee576920a98381f3e4872493Nick Pelly   switch (eState)
50347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
50447e37c4428509524ee576920a98381f3e4872493Nick Pelly      GOTO_STATE(OMX_StateLoaded);
50547e37c4428509524ee576920a98381f3e4872493Nick Pelly      GOTO_STATE(OMX_StateIdle);
50647e37c4428509524ee576920a98381f3e4872493Nick Pelly      GOTO_STATE(OMX_StateExecuting);
50747e37c4428509524ee576920a98381f3e4872493Nick Pelly      GOTO_STATE(OMX_StateInvalid);
50847e37c4428509524ee576920a98381f3e4872493Nick Pelly      GOTO_STATE(OMX_StateWaitForResources);
50947e37c4428509524ee576920a98381f3e4872493Nick Pelly      GOTO_STATE(OMX_StatePause);
51047e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
51147e37c4428509524ee576920a98381f3e4872493Nick Pelly}
51247e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
51347e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_ERRORTYPE ConfigureEncoder()
51447e37c4428509524ee576920a98381f3e4872493Nick Pelly{
51547e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_ERRORTYPE result = OMX_ErrorNone;
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   unsigned const int *profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
51747e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_U32 mb_per_sec, mb_per_frame;
51847e37c4428509524ee576920a98381f3e4872493Nick Pelly   bool profile_level_found = false;
51947e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_U32 eProfile,eLevel;
52047e37c4428509524ee576920a98381f3e4872493Nick Pelly
52147e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_PARAM_PORTDEFINITIONTYPE portdef; // OMX_IndexParamPortDefinition
52247e37c4428509524ee576920a98381f3e4872493Nick Pelly#ifdef QCOM_EXT
52347e37c4428509524ee576920a98381f3e4872493Nick Pelly      OMX_QCOM_PARAM_PORTDEFINITIONTYPE qPortDefnType;
52447e37c4428509524ee576920a98381f3e4872493Nick Pelly#endif
52547e37c4428509524ee576920a98381f3e4872493Nick Pelly   portdef.nPortIndex = (OMX_U32) 0; // input
52647e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_GetParameter(m_hHandle,
52747e37c4428509524ee576920a98381f3e4872493Nick Pelly                             OMX_IndexParamPortDefinition,
52847e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &portdef);
52947e37c4428509524ee576920a98381f3e4872493Nick Pelly   E("\n OMX_IndexParamPortDefinition Get Paramter on input port");
53047e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
53147e37c4428509524ee576920a98381f3e4872493Nick Pelly   portdef.format.video.nFrameWidth = m_sProfile.nFrameWidth;
53247e37c4428509524ee576920a98381f3e4872493Nick Pelly   portdef.format.video.nFrameHeight = m_sProfile.nFrameHeight;
53347e37c4428509524ee576920a98381f3e4872493Nick Pelly
53447e37c4428509524ee576920a98381f3e4872493Nick Pelly   E ("\n Height %d width %d bit rate %d",portdef.format.video.nFrameHeight
53547e37c4428509524ee576920a98381f3e4872493Nick Pelly      ,portdef.format.video.nFrameWidth,portdef.format.video.nBitrate);
53647e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_SetParameter(m_hHandle,
53747e37c4428509524ee576920a98381f3e4872493Nick Pelly                             OMX_IndexParamPortDefinition,
53847e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &portdef);
53947e37c4428509524ee576920a98381f3e4872493Nick Pelly   E("\n OMX_IndexParamPortDefinition Set Paramter on input port");
54047e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   // once more to get proper buffer size
542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   result = OMX_GetParameter(m_hHandle,
543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             OMX_IndexParamPortDefinition,
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             &portdef);
545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   E("\n OMX_IndexParamPortDefinition Get Paramter on input port, 2nd pass");
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   CHK(result);
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   // update size accordingly
548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_sProfile.nFrameBytes = portdef.nBufferSize;
54947e37c4428509524ee576920a98381f3e4872493Nick Pelly   portdef.nPortIndex = (OMX_U32) 1; // output
55047e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_GetParameter(m_hHandle,
55147e37c4428509524ee576920a98381f3e4872493Nick Pelly                             OMX_IndexParamPortDefinition,
55247e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &portdef);
55347e37c4428509524ee576920a98381f3e4872493Nick Pelly   E("\n OMX_IndexParamPortDefinition Get Paramter on output port");
55447e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
55547e37c4428509524ee576920a98381f3e4872493Nick Pelly   portdef.format.video.nFrameWidth = m_sProfile.nFrameWidth;
55647e37c4428509524ee576920a98381f3e4872493Nick Pelly   portdef.format.video.nFrameHeight = m_sProfile.nFrameHeight;
55747e37c4428509524ee576920a98381f3e4872493Nick Pelly   portdef.format.video.nBitrate = m_sProfile.nBitrate;
558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   FractionToQ16(portdef.format.video.xFramerate,(int) (m_sProfile.nFramerate * 2),2);
55947e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_SetParameter(m_hHandle,
56047e37c4428509524ee576920a98381f3e4872493Nick Pelly                             OMX_IndexParamPortDefinition,
56147e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &portdef);
56247e37c4428509524ee576920a98381f3e4872493Nick Pelly   E("\n OMX_IndexParamPortDefinition Set Paramter on output port");
56347e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
56447e37c4428509524ee576920a98381f3e4872493Nick Pelly
56547e37c4428509524ee576920a98381f3e4872493Nick Pelly#ifdef QCOM_EXT
56647e37c4428509524ee576920a98381f3e4872493Nick Pelly
56747e37c4428509524ee576920a98381f3e4872493Nick PellyqPortDefnType.nPortIndex = PORT_INDEX_IN;
56847e37c4428509524ee576920a98381f3e4872493Nick PellyqPortDefnType.nMemRegion = OMX_QCOM_MemRegionEBI1;
56947e37c4428509524ee576920a98381f3e4872493Nick PellyqPortDefnType.nSize = sizeof(OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
57047e37c4428509524ee576920a98381f3e4872493Nick Pelly
57147e37c4428509524ee576920a98381f3e4872493Nick Pellyresult = OMX_SetParameter(m_hHandle,
57247e37c4428509524ee576920a98381f3e4872493Nick Pelly                             (OMX_INDEXTYPE)OMX_QcomIndexPortDefn,
57347e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &qPortDefnType);
57447e37c4428509524ee576920a98381f3e4872493Nick Pelly
57547e37c4428509524ee576920a98381f3e4872493Nick Pelly#endif
576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (!m_sProfile.nUserProfile) // profile not set by user, go ahead with table calculation
577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
57847e37c4428509524ee576920a98381f3e4872493Nick Pelly   //validate the ht,width,fps,bitrate and set the appropriate profile and level
57947e37c4428509524ee576920a98381f3e4872493Nick Pelly   if(m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
58047e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
58147e37c4428509524ee576920a98381f3e4872493Nick Pelly     profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
58247e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
58347e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if(m_sProfile.eCodec == OMX_VIDEO_CodingAVC)
58447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
58547e37c4428509524ee576920a98381f3e4872493Nick Pelly     profile_tbl = (unsigned int const *)h264_profile_level_table;
58647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
58747e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if(m_sProfile.eCodec == OMX_VIDEO_CodingH263)
58847e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
58947e37c4428509524ee576920a98381f3e4872493Nick Pelly     profile_tbl = (unsigned int const *)h263_profile_level_table;
59047e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
59147e37c4428509524ee576920a98381f3e4872493Nick Pelly
59247e37c4428509524ee576920a98381f3e4872493Nick Pelly   mb_per_frame = ((m_sProfile.nFrameHeight+15)>>4)*
59347e37c4428509524ee576920a98381f3e4872493Nick Pelly                ((m_sProfile.nFrameWidth+15)>>4);
59447e37c4428509524ee576920a98381f3e4872493Nick Pelly
59547e37c4428509524ee576920a98381f3e4872493Nick Pelly   mb_per_sec = mb_per_frame*(m_sProfile.nFramerate);
59647e37c4428509524ee576920a98381f3e4872493Nick Pelly
59747e37c4428509524ee576920a98381f3e4872493Nick Pelly   do{
59847e37c4428509524ee576920a98381f3e4872493Nick Pelly      if(mb_per_frame <= (int)profile_tbl[0])
59947e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
60047e37c4428509524ee576920a98381f3e4872493Nick Pelly          if(mb_per_sec <= (int)profile_tbl[1])
60147e37c4428509524ee576920a98381f3e4872493Nick Pelly          {
60247e37c4428509524ee576920a98381f3e4872493Nick Pelly            if(m_sProfile.nBitrate <= (int)profile_tbl[2])
60347e37c4428509524ee576920a98381f3e4872493Nick Pelly            {
60447e37c4428509524ee576920a98381f3e4872493Nick Pelly              eLevel = (int)profile_tbl[3];
60547e37c4428509524ee576920a98381f3e4872493Nick Pelly              eProfile = (int)profile_tbl[4];
606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              E("\n profile/level found: %d/%d\n",eProfile/eLevel);
60747e37c4428509524ee576920a98381f3e4872493Nick Pelly              profile_level_found = true;
60847e37c4428509524ee576920a98381f3e4872493Nick Pelly              break;
60947e37c4428509524ee576920a98381f3e4872493Nick Pelly            }
61047e37c4428509524ee576920a98381f3e4872493Nick Pelly          }
61147e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
61247e37c4428509524ee576920a98381f3e4872493Nick Pelly      profile_tbl = profile_tbl + 5;
61347e37c4428509524ee576920a98381f3e4872493Nick Pelly   }while(profile_tbl[0] != 0);
61447e37c4428509524ee576920a98381f3e4872493Nick Pelly
61547e37c4428509524ee576920a98381f3e4872493Nick Pelly   if ( profile_level_found != true )
61647e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
61747e37c4428509524ee576920a98381f3e4872493Nick Pelly     E("\n Error: Unsupported profile/level\n");
61847e37c4428509524ee576920a98381f3e4872493Nick Pelly     return OMX_ErrorNone;
61947e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else // Profile set by user!
622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eProfile = m_sProfile.nUserProfile;
624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eLevel = 0;
625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
62647e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_sProfile.eCodec == OMX_VIDEO_CodingH263)
62747e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
62847e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("Configuring H263...");
62947e37c4428509524ee576920a98381f3e4872493Nick Pelly
63047e37c4428509524ee576920a98381f3e4872493Nick Pelly      OMX_VIDEO_PARAM_H263TYPE h263;
63147e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_GetParameter(m_hHandle,
63247e37c4428509524ee576920a98381f3e4872493Nick Pelly                                OMX_IndexParamVideoH263,
63347e37c4428509524ee576920a98381f3e4872493Nick Pelly                                &h263);
63447e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
63547e37c4428509524ee576920a98381f3e4872493Nick Pelly      h263.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
63647e37c4428509524ee576920a98381f3e4872493Nick Pelly      h263.nPFrames = m_sProfile.nFramerate * 2 - 1; // intra period
63747e37c4428509524ee576920a98381f3e4872493Nick Pelly      h263.nBFrames = 0;
63847e37c4428509524ee576920a98381f3e4872493Nick Pelly      h263.eProfile = (OMX_VIDEO_H263PROFILETYPE)eProfile;
63947e37c4428509524ee576920a98381f3e4872493Nick Pelly      h263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel;
64047e37c4428509524ee576920a98381f3e4872493Nick Pelly      h263.bPLUSPTYPEAllowed = OMX_FALSE;
64147e37c4428509524ee576920a98381f3e4872493Nick Pelly      h263.nAllowedPictureTypes = 2;
642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h263.bForceRoundingTypeToZero = OMX_TRUE;
643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h263.nPictureHeaderRepetition = 0;
644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      h263.nGOBHeaderInterval = 1;
64547e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_SetParameter(m_hHandle,
64647e37c4428509524ee576920a98381f3e4872493Nick Pelly                                OMX_IndexParamVideoH263,
64747e37c4428509524ee576920a98381f3e4872493Nick Pelly                                &h263);
64847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
64947e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
65047e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
65147e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("Configuring MP4/H264...");
65247e37c4428509524ee576920a98381f3e4872493Nick Pelly
65347e37c4428509524ee576920a98381f3e4872493Nick Pelly      OMX_VIDEO_PARAM_PROFILELEVELTYPE profileLevel; // OMX_IndexParamVideoProfileLevelCurrent
654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
65547e37c4428509524ee576920a98381f3e4872493Nick Pelly      profileLevel.eProfile = eProfile;
65647e37c4428509524ee576920a98381f3e4872493Nick Pelly      profileLevel.eLevel =  eLevel;
65747e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_SetParameter(m_hHandle,
65847e37c4428509524ee576920a98381f3e4872493Nick Pelly                                OMX_IndexParamVideoProfileLevelCurrent,
65947e37c4428509524ee576920a98381f3e4872493Nick Pelly                                &profileLevel);
66047e37c4428509524ee576920a98381f3e4872493Nick Pelly      E("\n OMX_IndexParamVideoProfileLevelCurrent Set Paramter port");
66147e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
66247e37c4428509524ee576920a98381f3e4872493Nick Pelly      //profileLevel.eLevel = (OMX_U32) m_sProfile.eLevel;
66347e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_GetParameter(m_hHandle,
66447e37c4428509524ee576920a98381f3e4872493Nick Pelly                                OMX_IndexParamVideoProfileLevelCurrent,
66547e37c4428509524ee576920a98381f3e4872493Nick Pelly                                &profileLevel);
66647e37c4428509524ee576920a98381f3e4872493Nick Pelly      E("\n OMX_IndexParamVideoProfileLevelCurrent Get Paramter port");
66747e37c4428509524ee576920a98381f3e4872493Nick Pelly      D ("\n Profile = %d level = %d",profileLevel.eProfile,profileLevel.eLevel);
66847e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
66947e37c4428509524ee576920a98381f3e4872493Nick Pelly
670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_VIDEO_PARAM_MPEG4TYPE mp4; // OMX_IndexParamVideoMpeg4
673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       result = OMX_GetParameter(m_hHandle,
674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 OMX_IndexParamVideoMpeg4,
675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 &mp4);
676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       CHK(result);
677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       mp4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       mp4.nTimeIncRes = 1000;
679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       result = OMX_SetParameter(m_hHandle,
680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 OMX_IndexParamVideoMpeg4,
681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                 &mp4);
682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       CHK(result);
683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
68447e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
68547e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)
68647e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 1
688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/////////////C A B A C ///A N D/////D E B L O C K I N G /////////////////
689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_AVCTYPE avcdata;
691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      avcdata.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
69247e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_GetParameter(m_hHandle,
693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_IndexParamVideoAvc,
694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                &avcdata);
69547e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// TEST VALUES (CHANGE FOR DIFF CONFIG's)
697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//      avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterDisable;
699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//    avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterDisableSliceBoundary;
700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   avcdata.bEntropyCodingCABAC = OMX_FALSE;
701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//   avcdata.bEntropyCodingCABAC = OMX_TRUE;
702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   avcdata.nCabacInitIdc = 1;
703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev///////////////////////////////////////////////
70447e37c4428509524ee576920a98381f3e4872493Nick Pelly
70547e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_SetParameter(m_hHandle,
706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                OMX_IndexParamVideoAvc,
707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                &avcdata);
70847e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/////////////C A B A C ///A N D/////D E B L O C K I N G /////////////////
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
71247e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
71347e37c4428509524ee576920a98381f3e4872493Nick Pelly
71447e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_VIDEO_PARAM_BITRATETYPE bitrate; // OMX_IndexParamVideoBitrate
71547e37c4428509524ee576920a98381f3e4872493Nick Pelly   bitrate.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
71647e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_GetParameter(m_hHandle,
71747e37c4428509524ee576920a98381f3e4872493Nick Pelly                             OMX_IndexParamVideoBitrate,
71847e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &bitrate);
71947e37c4428509524ee576920a98381f3e4872493Nick Pelly   E("\n OMX_IndexParamVideoBitrate Get Paramter port");
72047e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
72147e37c4428509524ee576920a98381f3e4872493Nick Pelly   bitrate.eControlRate = m_sProfile.eControlRate;
72247e37c4428509524ee576920a98381f3e4872493Nick Pelly   bitrate.nTargetBitrate = m_sProfile.nBitrate;
72347e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_SetParameter(m_hHandle,
72447e37c4428509524ee576920a98381f3e4872493Nick Pelly                             OMX_IndexParamVideoBitrate,
72547e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &bitrate);
72647e37c4428509524ee576920a98381f3e4872493Nick Pelly   E("\n OMX_IndexParamVideoBitrate Set Paramter port");
72747e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
72847e37c4428509524ee576920a98381f3e4872493Nick Pelly
72947e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_VIDEO_PARAM_PORTFORMATTYPE framerate; // OMX_IndexParamVidePortFormat
73047e37c4428509524ee576920a98381f3e4872493Nick Pelly   framerate.nPortIndex = 0;
73147e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_GetParameter(m_hHandle,
73247e37c4428509524ee576920a98381f3e4872493Nick Pelly                             OMX_IndexParamVideoPortFormat,
73347e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &framerate);
73447e37c4428509524ee576920a98381f3e4872493Nick Pelly   E("\n OMX_IndexParamVideoPortFormat Get Paramter port");
73547e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   FractionToQ16(framerate.xFramerate,(int) (m_sProfile.nFramerate * 2),2);
73747e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_SetParameter(m_hHandle,
73847e37c4428509524ee576920a98381f3e4872493Nick Pelly                             OMX_IndexParamVideoPortFormat,
73947e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &framerate);
74047e37c4428509524ee576920a98381f3e4872493Nick Pelly   E("\n OMX_IndexParamVideoPortFormat Set Paramter port");
74147e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
74247e37c4428509524ee576920a98381f3e4872493Nick Pelly
74347e37c4428509524ee576920a98381f3e4872493Nick Pelly#if 1
744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev///////////////////I N T R A P E R I O D ///////////////////
745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      QOMX_VIDEO_INTRAPERIODTYPE intra;
747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      intra.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      result = OMX_GetConfig(m_hHandle,
750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod,
751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             (OMX_PTR) &intra);
752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (result == OMX_ErrorNone)
754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         intra.nPFrames = (OMX_U32) (2 * m_sProfile.nFramerate - 1); //setting I
756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                                     //frame interval to
757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                                     //2 x framerate
758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         intra.nIDRPeriod = 1; //every I frame is an IDR
759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         intra.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         result = OMX_SetConfig(m_hHandle,
761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod,
762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                (OMX_PTR) &intra);
763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         E("failed to get state", 0, 0, 0);
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev///////////////////I N T R A P E R I O D ///////////////////
771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 1
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev///////////////////E R R O R C O R R E C T I O N ///////////////////
775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      ResyncMarkerType eResyncMarkerType = RESYNC_MARKER_NONE;
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      unsigned long int nResyncMarkerSpacing = 0;
778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_BOOL enableHEC = OMX_FALSE;
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//For Testing ONLY
781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// MPEG4
784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//      eResyncMarkerType = RESYNC_MARKER_BYTE;
785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//      nResyncMarkerSpacing = 1920;
786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eResyncMarkerType = RESYNC_MARKER_MB;
787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nResyncMarkerSpacing = 50;
788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      enableHEC = OMX_TRUE;
789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else if (m_sProfile.eCodec == OMX_VIDEO_CodingH263)
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//H263
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eResyncMarkerType = RESYNC_MARKER_GOB;
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nResyncMarkerSpacing = 0;
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//H264
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//      eResyncMarkerType = RESYNC_MARKER_BYTE;
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//      nResyncMarkerSpacing = 1920;
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //nResyncMarkerSpacing sets the slice size in venc_set_multislice_cfg
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //As of 9/24/10, it is known that the firmware has a bitstream
805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //corruption issue when RateControl and multislice are enabled for 720P
806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //So, disabling multislice for 720P when ratecontrol is enabled until
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //the firmware issue is resolved.
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ( ( (m_sProfile.nFrameWidth == 1280) && (m_sProfile.nFrameHeight = 720) ) &&
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (m_sProfile.eControlRate  != OMX_Video_ControlRateDisable) )
811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eResyncMarkerType = RESYNC_MARKER_NONE;
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         nResyncMarkerSpacing = 0;
814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eResyncMarkerType = RESYNC_MARKER_MB;
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          nResyncMarkerSpacing = 50;
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrection; //OMX_IndexParamVideoErrorCorrection
823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   errorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   result = OMX_GetParameter(m_hHandle,
825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             (OMX_INDEXTYPE) OMX_IndexParamVideoErrorCorrection,
826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             (OMX_PTR) &errorCorrection);
827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   errorCorrection.bEnableRVLC = OMX_FALSE;
829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   errorCorrection.bEnableDataPartitioning = OMX_FALSE;
830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if ((eResyncMarkerType == RESYNC_MARKER_BYTE) &&
832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)){
833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            errorCorrection.bEnableResync = OMX_TRUE;
834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            errorCorrection.bEnableHEC = enableHEC;
836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if ((eResyncMarkerType == RESYNC_MARKER_BYTE) &&
838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)){
839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         errorCorrection.bEnableResync = OMX_TRUE;
840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if ((eResyncMarkerType == RESYNC_MARKER_GOB) &&
843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               (m_sProfile.eCodec == OMX_VIDEO_CodingH263)){
844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         errorCorrection.bEnableResync = OMX_FALSE;
845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         errorCorrection.bEnableDataPartitioning = OMX_TRUE;
847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      result = OMX_SetParameter(m_hHandle,
850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (OMX_INDEXTYPE) OMX_IndexParamVideoErrorCorrection,
851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (OMX_PTR) &errorCorrection);
852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   CHK(result);
853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (eResyncMarkerType == RESYNC_MARKER_MB){
855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC){
856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_VIDEO_PARAM_AVCTYPE avcdata;
857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            avcdata.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            result = OMX_GetParameter(m_hHandle,
859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IndexParamVideoAvc,
860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      (OMX_PTR) &avcdata);
861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            CHK(result);
862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (result == OMX_ErrorNone)
863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               avcdata.nSliceHeaderSpacing = nResyncMarkerSpacing;
865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               result = OMX_SetParameter(m_hHandle,
866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_IndexParamVideoAvc,
867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         (OMX_PTR) &avcdata);
868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               CHK(result);
869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         else if(m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4){
873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            OMX_VIDEO_PARAM_MPEG4TYPE mp4;
874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            mp4.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            result = OMX_GetParameter(m_hHandle,
876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      OMX_IndexParamVideoMpeg4,
877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                      (OMX_PTR) &mp4);
878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            CHK(result);
879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (result == OMX_ErrorNone)
881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               mp4.nSliceHeaderSpacing = nResyncMarkerSpacing;
883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               result = OMX_SetParameter(m_hHandle,
884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_IndexParamVideoMpeg4,
885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         (OMX_PTR) &mp4);
886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               CHK(result);
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev///////////////////E R R O R C O R R E C T I O N ///////////////////
892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 1
895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev///////////////////I N T R A R E F R E S H///////////////////
896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      bool bEnableIntraRefresh = OMX_TRUE;
897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (result == OMX_ErrorNone)
899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_VIDEO_PARAM_INTRAREFRESHTYPE ir; // OMX_IndexParamVideoIntraRefresh
901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         ir.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         result = OMX_GetParameter(m_hHandle,
903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_IndexParamVideoIntraRefresh,
904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   (OMX_PTR) &ir);
905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (result == OMX_ErrorNone)
906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (bEnableIntraRefresh)
908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               ir.eRefreshMode = OMX_VIDEO_IntraRefreshCyclic;
910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               ir.nCirMBs = 5;
911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               result = OMX_SetParameter(m_hHandle,
912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         OMX_IndexParamVideoIntraRefresh,
913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                         (OMX_PTR) &ir);
914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               CHK(result);
915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if 1
920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev///////////////////FRAMEPACKING DATA///////////////////
921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement;
922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      FILE *m_pConfigFile;
923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      char m_configFilename [128] = "/data/configFile.cfg";
924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      memset(&framePackingArrangement, 0, sizeof(framePackingArrangement));
925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_pConfigFile = fopen(m_configFilename, "r");
926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_pConfigFile != NULL)
927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         //read all frame packing data
929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         int totalSizeToRead = FRAME_PACK_SIZE * sizeof(OMX_U32);
931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         char *pFramePack = (char *) &(framePackingArrangement.id);
932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         while ( ( (fscanf(m_pConfigFile, "%d", pFramePack)) != EOF ) &&
933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 (totalSizeToRead != 0) )
934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            //printf("Addr = %p, Value read = %d, sizeToRead remaining=%d\n",
936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            //       pFramePack, *pFramePack, totalSizeToRead);
937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pFramePack += sizeof(OMX_U32);
938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            totalSizeToRead -= sizeof(OMX_U32);
939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         //close the file.
941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         fclose(m_pConfigFile);
942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         printf("Frame Packing data from config file:\n");
944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         PrintFramePackArrangement(framePackingArrangement);
945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         D("\n Config file does not exist or could not be opened.");
949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         //set the default values
950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.id = 123;
952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.cancel_flag = false;
953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.type = 3;
954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.quincunx_sampling_flag = false;
955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.content_interpretation_type = 0;
956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.spatial_flipping_flag = true;
957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.frame0_flipped_flag = false;
958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.field_views_flag = false;
959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.current_frame_is_frame0_flag = false;
960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.frame0_self_contained_flag = true;
961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.frame1_self_contained_flag = false;
962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.frame0_grid_position_x = 3;
963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.frame0_grid_position_y = 15;
964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.frame1_grid_position_x = 11;
965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.frame1_grid_position_y = 7;
966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.reserved_byte = 0;
967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.repetition_period = 16381;
968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         framePackingArrangement.extension_flag = false;
969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         printf("Frame Packing Defaults :\n");
971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         PrintFramePackArrangement(framePackingArrangement);
972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      result = OMX_SetConfig(m_hHandle,
974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement,
975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (OMX_PTR) &framePackingArrangement);
976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      CHK(result);
977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////OMX_VIDEO_PARAM_INTRAREFRESHTYPE///////////////////
979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
98147e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_CONFIG_FRAMERATETYPE enc_framerate; // OMX_IndexConfigVideoFramerate
98247e37c4428509524ee576920a98381f3e4872493Nick Pelly   enc_framerate.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
98347e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_GetConfig(m_hHandle,
98447e37c4428509524ee576920a98381f3e4872493Nick Pelly                          OMX_IndexConfigVideoFramerate,
98547e37c4428509524ee576920a98381f3e4872493Nick Pelly                          &enc_framerate);
98647e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   FractionToQ16(enc_framerate.xEncodeFramerate,(int) (m_sProfile.nFramerate * 2),2);
98847e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_SetConfig(m_hHandle,
98947e37c4428509524ee576920a98381f3e4872493Nick Pelly                          OMX_IndexConfigVideoFramerate,
99047e37c4428509524ee576920a98381f3e4872493Nick Pelly                          &enc_framerate);
99147e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
99247e37c4428509524ee576920a98381f3e4872493Nick Pelly   return OMX_ErrorNone;
99347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
99447e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
99547e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid SendMessage(MsgId id, MsgData* data)
99647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
99747e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_lock(&m_mutex);
99847e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_sMsgQ.size >= MAX_MSG)
99947e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
100047e37c4428509524ee576920a98381f3e4872493Nick Pelly      E("main msg m_sMsgQ is full");
100147e37c4428509524ee576920a98381f3e4872493Nick Pelly      return;
100247e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
100347e37c4428509524ee576920a98381f3e4872493Nick Pelly   m_sMsgQ.q[(m_sMsgQ.head + m_sMsgQ.size) % MAX_MSG].id = id;
100447e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (data)
100547e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sMsgQ.q[(m_sMsgQ.head + m_sMsgQ.size) % MAX_MSG].data = *data;
100647e37c4428509524ee576920a98381f3e4872493Nick Pelly   ++m_sMsgQ.size;
100747e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_cond_signal(&m_signal);
100847e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_unlock(&m_mutex);
100947e37c4428509524ee576920a98381f3e4872493Nick Pelly}
101047e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
101147e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid PopMessage(Msg* msg)
101247e37c4428509524ee576920a98381f3e4872493Nick Pelly{
101347e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_lock(&m_mutex);
101447e37c4428509524ee576920a98381f3e4872493Nick Pelly   while (m_sMsgQ.size == 0)
101547e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
101647e37c4428509524ee576920a98381f3e4872493Nick Pelly      pthread_cond_wait(&m_signal, &m_mutex);
101747e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
101847e37c4428509524ee576920a98381f3e4872493Nick Pelly   *msg = m_sMsgQ.q[m_sMsgQ.head];
101947e37c4428509524ee576920a98381f3e4872493Nick Pelly   --m_sMsgQ.size;
102047e37c4428509524ee576920a98381f3e4872493Nick Pelly   m_sMsgQ.head = (m_sMsgQ.head + 1) % MAX_MSG;
102147e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_unlock(&m_mutex);
102247e37c4428509524ee576920a98381f3e4872493Nick Pelly}
102347e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
102447e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_ERRORTYPE EVT_CB(OMX_IN OMX_HANDLETYPE hComponent,
102547e37c4428509524ee576920a98381f3e4872493Nick Pelly                     OMX_IN OMX_PTR pAppData,
102647e37c4428509524ee576920a98381f3e4872493Nick Pelly                     OMX_IN OMX_EVENTTYPE eEvent,
102747e37c4428509524ee576920a98381f3e4872493Nick Pelly                     OMX_IN OMX_U32 nData1,
102847e37c4428509524ee576920a98381f3e4872493Nick Pelly                     OMX_IN OMX_U32 nData2,
102947e37c4428509524ee576920a98381f3e4872493Nick Pelly                     OMX_IN OMX_PTR pEventData)
103047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
103147e37c4428509524ee576920a98381f3e4872493Nick Pelly#define SET_STATE(eState)                                   \
103247e37c4428509524ee576920a98381f3e4872493Nick Pelly   case eState:                                             \
103347e37c4428509524ee576920a98381f3e4872493Nick Pelly      {                                                     \
103447e37c4428509524ee576920a98381f3e4872493Nick Pelly         D("" # eState " complete");                        \
103547e37c4428509524ee576920a98381f3e4872493Nick Pelly         m_eState = eState;                                 \
103647e37c4428509524ee576920a98381f3e4872493Nick Pelly         break;                                             \
103747e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
103847e37c4428509524ee576920a98381f3e4872493Nick Pelly
103947e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (eEvent == OMX_EventCmdComplete)
104047e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
104147e37c4428509524ee576920a98381f3e4872493Nick Pelly      if ((OMX_COMMANDTYPE) nData1 == OMX_CommandStateSet)
104247e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
104347e37c4428509524ee576920a98381f3e4872493Nick Pelly         switch ((OMX_STATETYPE) nData2)
104447e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
104547e37c4428509524ee576920a98381f3e4872493Nick Pelly            SET_STATE(OMX_StateLoaded);
104647e37c4428509524ee576920a98381f3e4872493Nick Pelly            SET_STATE(OMX_StateIdle);
104747e37c4428509524ee576920a98381f3e4872493Nick Pelly            SET_STATE(OMX_StateExecuting);
104847e37c4428509524ee576920a98381f3e4872493Nick Pelly            SET_STATE(OMX_StateInvalid);
104947e37c4428509524ee576920a98381f3e4872493Nick Pelly            SET_STATE(OMX_StateWaitForResources);
105047e37c4428509524ee576920a98381f3e4872493Nick Pelly            SET_STATE(OMX_StatePause);
105147e37c4428509524ee576920a98381f3e4872493Nick Pelly         default:
105247e37c4428509524ee576920a98381f3e4872493Nick Pelly            E("invalid state %d", (int) nData2);
105347e37c4428509524ee576920a98381f3e4872493Nick Pelly          }
105447e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
105547e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
105647e37c4428509524ee576920a98381f3e4872493Nick Pelly
105747e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (eEvent == OMX_EventError)
105847e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
105947e37c4428509524ee576920a98381f3e4872493Nick Pelly      E("OMX_EventError");
106047e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
106147e37c4428509524ee576920a98381f3e4872493Nick Pelly
106247e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
106347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
106447e37c4428509524ee576920a98381f3e4872493Nick Pelly      E("unexpected event %d", (int) eEvent);
106547e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
106647e37c4428509524ee576920a98381f3e4872493Nick Pelly   return OMX_ErrorNone;
106747e37c4428509524ee576920a98381f3e4872493Nick Pelly}
106847e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
106947e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_ERRORTYPE EBD_CB(OMX_IN OMX_HANDLETYPE hComponent,
107047e37c4428509524ee576920a98381f3e4872493Nick Pelly                     OMX_IN OMX_PTR pAppData,
107147e37c4428509524ee576920a98381f3e4872493Nick Pelly                     OMX_IN OMX_BUFFERHEADERTYPE* pBuffer)
107247e37c4428509524ee576920a98381f3e4872493Nick Pelly{
107347e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("Got EBD callback ts=%lld", pBuffer->nTimeStamp);
107447e37c4428509524ee576920a98381f3e4872493Nick Pelly
107547e37c4428509524ee576920a98381f3e4872493Nick Pelly   for (int i = 0; i < num_in_buffers; i++)
107647e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
107747e37c4428509524ee576920a98381f3e4872493Nick Pelly      // mark this buffer ready for use again
107847e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (m_pInBuffers[i] == pBuffer)
107947e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
108047e37c4428509524ee576920a98381f3e4872493Nick Pelly
108147e37c4428509524ee576920a98381f3e4872493Nick Pelly         D("Marked input buffer idx %d as free, buf %p", i, pBuffer->pBuffer);
108247e37c4428509524ee576920a98381f3e4872493Nick Pelly         m_bInFrameFree[i] = OMX_TRUE;
108347e37c4428509524ee576920a98381f3e4872493Nick Pelly         break;
108447e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
108547e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
108647e37c4428509524ee576920a98381f3e4872493Nick Pelly
108747e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode == MODE_LIVE_ENCODE)
108847e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
108947e37c4428509524ee576920a98381f3e4872493Nick Pelly      CameraTest_ReleaseFrame(pBuffer->pBuffer,
109047e37c4428509524ee576920a98381f3e4872493Nick Pelly                              ((OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*)pBuffer->pAppPrivate));
109147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
109247e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
109347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
109447e37c4428509524ee576920a98381f3e4872493Nick Pelly      // wake up main thread and tell it to send next frame
109547e37c4428509524ee576920a98381f3e4872493Nick Pelly      MsgData data;
109647e37c4428509524ee576920a98381f3e4872493Nick Pelly      data.sBitstreamData.pBuffer = pBuffer;
109747e37c4428509524ee576920a98381f3e4872493Nick Pelly      SendMessage(MSG_ID_INPUT_FRAME_DONE,
109847e37c4428509524ee576920a98381f3e4872493Nick Pelly                  &data);
109947e37c4428509524ee576920a98381f3e4872493Nick Pelly
110047e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
110147e37c4428509524ee576920a98381f3e4872493Nick Pelly   return OMX_ErrorNone;
110247e37c4428509524ee576920a98381f3e4872493Nick Pelly}
110347e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
110447e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_ERRORTYPE FBD_CB(OMX_OUT OMX_HANDLETYPE hComponent,
110547e37c4428509524ee576920a98381f3e4872493Nick Pelly                     OMX_OUT OMX_PTR pAppData,
110647e37c4428509524ee576920a98381f3e4872493Nick Pelly                     OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
110747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
110847e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("Got FBD callback ts=%lld", pBuffer->nTimeStamp);
110947e37c4428509524ee576920a98381f3e4872493Nick Pelly
111047e37c4428509524ee576920a98381f3e4872493Nick Pelly   static long long prevTime = 0;
111147e37c4428509524ee576920a98381f3e4872493Nick Pelly   long long currTime = GetTimeStamp();
111247e37c4428509524ee576920a98381f3e4872493Nick Pelly
111347e37c4428509524ee576920a98381f3e4872493Nick Pelly   m_bWatchDogKicked = true;
111447e37c4428509524ee576920a98381f3e4872493Nick Pelly
111547e37c4428509524ee576920a98381f3e4872493Nick Pelly   /* Empty Buffers should not be counted */
111647e37c4428509524ee576920a98381f3e4872493Nick Pelly   if(pBuffer->nFilledLen !=0)
111747e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
111847e37c4428509524ee576920a98381f3e4872493Nick Pelly      /* Counting Buffers supplied from OpneMax Encoder */
111947e37c4428509524ee576920a98381f3e4872493Nick Pelly      fbd_cnt++;
112047e37c4428509524ee576920a98381f3e4872493Nick Pelly      tot_bufsize += pBuffer->nFilledLen;
112147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
112247e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (prevTime != 0)
112347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
112447e37c4428509524ee576920a98381f3e4872493Nick Pelly      long long currTime = GetTimeStamp();
112547e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("FBD_DELTA = %lld\n", currTime - prevTime);
112647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
112747e37c4428509524ee576920a98381f3e4872493Nick Pelly   prevTime = currTime;
112847e37c4428509524ee576920a98381f3e4872493Nick Pelly
112947e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode == MODE_PROFILE)
113047e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
113147e37c4428509524ee576920a98381f3e4872493Nick Pelly      // if we are profiling we are not doing file I/O
113247e37c4428509524ee576920a98381f3e4872493Nick Pelly      // so just give back to encoder
113347e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (OMX_FillThisBuffer(m_hHandle, pBuffer) != OMX_ErrorNone)
113447e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
113547e37c4428509524ee576920a98381f3e4872493Nick Pelly         E("empty buffer failed for profiling");
113647e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
113747e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
113847e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
113947e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
114047e37c4428509524ee576920a98381f3e4872493Nick Pelly      // wake up main thread and tell it to write to file
114147e37c4428509524ee576920a98381f3e4872493Nick Pelly      MsgData data;
114247e37c4428509524ee576920a98381f3e4872493Nick Pelly      data.sBitstreamData.pBuffer = pBuffer;
114347e37c4428509524ee576920a98381f3e4872493Nick Pelly      SendMessage(MSG_ID_OUTPUT_FRAME_DONE,
114447e37c4428509524ee576920a98381f3e4872493Nick Pelly                  &data);
114547e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
114647e37c4428509524ee576920a98381f3e4872493Nick Pelly   return OMX_ErrorNone;
114747e37c4428509524ee576920a98381f3e4872493Nick Pelly}
114847e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
114947e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_ERRORTYPE VencTest_Initialize()
115047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
115147e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_ERRORTYPE result = OMX_ErrorNone;
115247e37c4428509524ee576920a98381f3e4872493Nick Pelly   static OMX_CALLBACKTYPE sCallbacks = {EVT_CB, EBD_CB, FBD_CB};
115347e37c4428509524ee576920a98381f3e4872493Nick Pelly   int i;
115447e37c4428509524ee576920a98381f3e4872493Nick Pelly
115547e37c4428509524ee576920a98381f3e4872493Nick Pelly   for (i = 0; i < num_in_buffers; i++)
115647e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
115747e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_pInBuffers[i] = NULL;
115847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
115947e37c4428509524ee576920a98381f3e4872493Nick Pelly
116047e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_Init();
116147e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
116247e37c4428509524ee576920a98381f3e4872493Nick Pelly
116347e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
116447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
116547e37c4428509524ee576920a98381f3e4872493Nick Pelly        result = OMX_GetHandle(&m_hHandle,
116647e37c4428509524ee576920a98381f3e4872493Nick Pelly                             "OMX.qcom.video.encoder.mpeg4",
116747e37c4428509524ee576920a98381f3e4872493Nick Pelly                             NULL,
116847e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &sCallbacks);
116947e37c4428509524ee576920a98381f3e4872493Nick Pelly     // CHK(result);
117047e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
117147e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (m_sProfile.eCodec == OMX_VIDEO_CodingH263)
117247e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
117347e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_GetHandle(&m_hHandle,
117447e37c4428509524ee576920a98381f3e4872493Nick Pelly                             "OMX.qcom.video.encoder.h263",
117547e37c4428509524ee576920a98381f3e4872493Nick Pelly                             NULL,
117647e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &sCallbacks);
117747e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
117847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
117947e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
118047e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
118147e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_GetHandle(&m_hHandle,
118247e37c4428509524ee576920a98381f3e4872493Nick Pelly                             "OMX.qcom.video.encoder.avc",
118347e37c4428509524ee576920a98381f3e4872493Nick Pelly                             NULL,
118447e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &sCallbacks);
118547e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
118647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
118747e37c4428509524ee576920a98381f3e4872493Nick Pelly
118847e37c4428509524ee576920a98381f3e4872493Nick Pelly
118947e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = ConfigureEncoder();
119047e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
119147e37c4428509524ee576920a98381f3e4872493Nick Pelly
119247e37c4428509524ee576920a98381f3e4872493Nick Pelly   return result;
119347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
119447e37c4428509524ee576920a98381f3e4872493Nick Pelly
119547e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
119647e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_ERRORTYPE VencTest_RegisterYUVBuffer(OMX_BUFFERHEADERTYPE** ppBufferHeader,
119747e37c4428509524ee576920a98381f3e4872493Nick Pelly                                         OMX_U8 *pBuffer,
119847e37c4428509524ee576920a98381f3e4872493Nick Pelly                                         OMX_PTR pAppPrivate)
119947e37c4428509524ee576920a98381f3e4872493Nick Pelly{
120047e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_ERRORTYPE result = OMX_ErrorNone;
120147e37c4428509524ee576920a98381f3e4872493Nick Pelly#if 0
120247e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("register buffer");
120347e37c4428509524ee576920a98381f3e4872493Nick Pelly   if ((result = OMX_AllocateBuffer(m_hHandle,
120447e37c4428509524ee576920a98381f3e4872493Nick Pelly                               ppBufferHeader,
120547e37c4428509524ee576920a98381f3e4872493Nick Pelly                               (OMX_U32) PORT_INDEX_IN,
120647e37c4428509524ee576920a98381f3e4872493Nick Pelly                               pAppPrivate,
120747e37c4428509524ee576920a98381f3e4872493Nick Pelly                               m_sProfile.nFrameBytes
120847e37c4428509524ee576920a98381f3e4872493Nick Pelly                               )) != OMX_ErrorNone)
120947e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
121047e37c4428509524ee576920a98381f3e4872493Nick Pelly      E("use buffer failed");
121147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
121247e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
121347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
121447e37c4428509524ee576920a98381f3e4872493Nick Pelly     E("Allocate Buffer Success %x", (*ppBufferHeader)->pBuffer);
121547e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
121647e37c4428509524ee576920a98381f3e4872493Nick Pelly  #endif
121747e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("register buffer");
121847e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("Calling UseBuffer for Input port");
121947e37c4428509524ee576920a98381f3e4872493Nick Pelly   if ((result = OMX_UseBuffer(m_hHandle,
122047e37c4428509524ee576920a98381f3e4872493Nick Pelly                               ppBufferHeader,
122147e37c4428509524ee576920a98381f3e4872493Nick Pelly                               (OMX_U32) PORT_INDEX_IN,
122247e37c4428509524ee576920a98381f3e4872493Nick Pelly                               pAppPrivate,
122347e37c4428509524ee576920a98381f3e4872493Nick Pelly                               m_sProfile.nFrameBytes,
122447e37c4428509524ee576920a98381f3e4872493Nick Pelly                               pBuffer)) != OMX_ErrorNone)
122547e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
122647e37c4428509524ee576920a98381f3e4872493Nick Pelly      E("use buffer failed");
122747e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
122847e37c4428509524ee576920a98381f3e4872493Nick Pelly
122947e37c4428509524ee576920a98381f3e4872493Nick Pelly   return result;
123047e37c4428509524ee576920a98381f3e4872493Nick Pelly}
123147e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
123247e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_ERRORTYPE VencTest_EncodeFrame(void* pYUVBuff,
123347e37c4428509524ee576920a98381f3e4872493Nick Pelly                                   long long nTimeStamp)
123447e37c4428509524ee576920a98381f3e4872493Nick Pelly{
123547e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_ERRORTYPE result = OMX_ErrorUndefined;
123647e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("calling OMX empty this buffer");
123747e37c4428509524ee576920a98381f3e4872493Nick Pelly   for (int i = 0; i < num_in_buffers; i++)
123847e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
123947e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (pYUVBuff == m_pInBuffers[i]->pBuffer)
124047e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
124147e37c4428509524ee576920a98381f3e4872493Nick Pelly         m_pInBuffers[i]->nTimeStamp = nTimeStamp;
124247e37c4428509524ee576920a98381f3e4872493Nick Pelly    D("Sending Buffer - %x", m_pInBuffers[i]->pBuffer);
124347e37c4428509524ee576920a98381f3e4872493Nick Pelly         result = OMX_EmptyThisBuffer(m_hHandle,
124447e37c4428509524ee576920a98381f3e4872493Nick Pelly                                      m_pInBuffers[i]);
124547e37c4428509524ee576920a98381f3e4872493Nick Pelly         /* Counting Buffers supplied to OpenMax Encoder */
124647e37c4428509524ee576920a98381f3e4872493Nick Pelly         if(OMX_ErrorNone == result)
124747e37c4428509524ee576920a98381f3e4872493Nick Pelly            ebd_cnt++;
124847e37c4428509524ee576920a98381f3e4872493Nick Pelly         CHK(result);
124947e37c4428509524ee576920a98381f3e4872493Nick Pelly         break;
125047e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
125147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
125247e37c4428509524ee576920a98381f3e4872493Nick Pelly   return result;
125347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
125447e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
125547e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_ERRORTYPE VencTest_Exit(void)
125647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
125747e37c4428509524ee576920a98381f3e4872493Nick Pelly   int i;
125847e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_ERRORTYPE result = OMX_ErrorNone;
125947e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("trying to exit venc");
126047e37c4428509524ee576920a98381f3e4872493Nick Pelly
126147e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("going to idle state");
126247e37c4428509524ee576920a98381f3e4872493Nick Pelly   SetState(OMX_StateIdle);
126347e37c4428509524ee576920a98381f3e4872493Nick Pelly
126447e37c4428509524ee576920a98381f3e4872493Nick Pelly
126547e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("going to loaded state");
126647e37c4428509524ee576920a98381f3e4872493Nick Pelly   //SetState(OMX_StateLoaded);
126747e37c4428509524ee576920a98381f3e4872493Nick Pelly      OMX_SendCommand(m_hHandle,
126847e37c4428509524ee576920a98381f3e4872493Nick Pelly                      OMX_CommandStateSet,
126947e37c4428509524ee576920a98381f3e4872493Nick Pelly                      (OMX_U32) OMX_StateLoaded,
127047e37c4428509524ee576920a98381f3e4872493Nick Pelly                       NULL);
127147e37c4428509524ee576920a98381f3e4872493Nick Pelly
127247e37c4428509524ee576920a98381f3e4872493Nick Pelly      for (i = 0; i < num_in_buffers; i++)
127347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
127447e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("free buffer");
127547e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (m_pInBuffers[i]->pBuffer)
127647e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
127747e37c4428509524ee576920a98381f3e4872493Nick Pelly        // free(m_pInBuffers[i]->pBuffer);
127847e37c4428509524ee576920a98381f3e4872493Nick Pelly         result = OMX_FreeBuffer(m_hHandle,
127947e37c4428509524ee576920a98381f3e4872493Nick Pelly                                 PORT_INDEX_IN,
128047e37c4428509524ee576920a98381f3e4872493Nick Pelly                                 m_pInBuffers[i]);
128147e37c4428509524ee576920a98381f3e4872493Nick Pelly         CHK(result);
128247e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
128347e37c4428509524ee576920a98381f3e4872493Nick Pelly      else
128447e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
128547e37c4428509524ee576920a98381f3e4872493Nick Pelly         E("buffer %d is null", i);
128647e37c4428509524ee576920a98381f3e4872493Nick Pelly         result = OMX_ErrorUndefined;
128747e37c4428509524ee576920a98381f3e4872493Nick Pelly         CHK(result);
128847e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
128947e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
129047e37c4428509524ee576920a98381f3e4872493Nick Pelly   for (i = 0; i < num_out_buffers; i++)
129147e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
129247e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("free buffer");
129347e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (m_pOutBuffers[i]->pBuffer)
129447e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
129547e37c4428509524ee576920a98381f3e4872493Nick Pelly         free(m_pOutBuffers[i]->pBuffer);
129647e37c4428509524ee576920a98381f3e4872493Nick Pelly         result = OMX_FreeBuffer(m_hHandle,
129747e37c4428509524ee576920a98381f3e4872493Nick Pelly                                 PORT_INDEX_OUT,
129847e37c4428509524ee576920a98381f3e4872493Nick Pelly                                 m_pOutBuffers[i]);
129947e37c4428509524ee576920a98381f3e4872493Nick Pelly         CHK(result);
130047e37c4428509524ee576920a98381f3e4872493Nick Pelly
130147e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
130247e37c4428509524ee576920a98381f3e4872493Nick Pelly      else
130347e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
130447e37c4428509524ee576920a98381f3e4872493Nick Pelly         E("buffer %d is null", i);
130547e37c4428509524ee576920a98381f3e4872493Nick Pelly         result = OMX_ErrorUndefined;
130647e37c4428509524ee576920a98381f3e4872493Nick Pelly         CHK(result);
130747e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
130847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
130947e37c4428509524ee576920a98381f3e4872493Nick Pelly
131047e37c4428509524ee576920a98381f3e4872493Nick Pelly     while (m_eState != OMX_StateLoaded)
131147e37c4428509524ee576920a98381f3e4872493Nick Pelly     {
131247e37c4428509524ee576920a98381f3e4872493Nick Pelly        sleep(1);
131347e37c4428509524ee576920a98381f3e4872493Nick Pelly     }
131447e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("component_deinit...");
131547e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_Deinit();
131647e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
131747e37c4428509524ee576920a98381f3e4872493Nick Pelly
131847e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("venc is exiting...");
131947e37c4428509524ee576920a98381f3e4872493Nick Pelly   return result;
132047e37c4428509524ee576920a98381f3e4872493Nick Pelly}
132147e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
1322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid VencTest_ReadDynamicConfigMsg()
1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char frame_n[8], config[16], param[8];
1326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  char *dest = frame_n;
1327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool end = false;
1328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int cntr, nparam = 0;
1329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  memset(&dynamic_config, 0, sizeof(struct DynamicConfig));
1330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  do
1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    cntr = -1;
1333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    do
1334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dest[++cntr] = fgetc(m_pDynConfFile);
1336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } while(dest[cntr] != ' ' && dest[cntr] != '\t' && dest[cntr] != '\n' && dest[cntr] != '\r' && !feof(m_pDynConfFile));
1337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (dest[cntr] == '\n' || dest[cntr] == '\r')
1338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      end = true;
1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dest[cntr] = NULL;
1340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (dest == frame_n)
1341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dest = config;
1342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (dest == config)
1343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dest = param;
1344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      end = true;
1346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nparam++;
1347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } while (!end && !feof(m_pDynConfFile));
1348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (nparam > 1)
1350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dynamic_config.pending = true;
1352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dynamic_config.frame_num = atoi(frame_n);
1353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!strcmp(config, "bitrate"))
1354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_param = OMX_IndexConfigVideoBitrate;
1356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.bitrate.nPortIndex = PORT_INDEX_OUT;
1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.bitrate.nEncodeBitrate = strtoul(param, NULL, 10);
1358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(config, "framerate"))
1360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_param = OMX_IndexConfigVideoFramerate;
1362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.framerate.nPortIndex = PORT_INDEX_OUT;
1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.f_framerate = atof(param);
1364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(config, "iperiod"))
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_param = (OMX_INDEXTYPE)QOMX_IndexConfigVideoIntraperiod;
1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.intraperiod.nPortIndex = PORT_INDEX_OUT;
1369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.intraperiod.nPFrames = strtoul(param, NULL, 10) - 1;
1370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.intraperiod.nIDRPeriod = 1; // This value is ignored in OMX component
1371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(config, "ivoprefresh"))
1373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_param = OMX_IndexConfigVideoIntraVOPRefresh;
1375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.intravoprefresh.nPortIndex = PORT_INDEX_OUT;
1376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.intravoprefresh.IntraRefreshVOP = OMX_TRUE;
1377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if (!strcmp(config, "rotation"))
1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_param = OMX_IndexConfigCommonRotate;
1381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.rotation.nPortIndex = PORT_INDEX_OUT;
1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.config_data.rotation.nRotation = strtoul(param, NULL, 10);
1383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      E("UNKNOWN CONFIG PARAMETER: %s!", config);
1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      dynamic_config.pending = false;
1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (feof(m_pDynConfFile))
1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose(m_pDynConfFile);
1393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_pDynConfFile = NULL;
1394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid VencTest_ProcessDynamicConfigurationFile()
1398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  do
1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (dynamic_config.pending)
1402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_nFrameIn == dynamic_config.frame_num)
1404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (dynamic_config.config_param == OMX_IndexConfigVideoFramerate)
1406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_sProfile.nFramerate = dynamic_config.config_data.f_framerate;
1408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          FractionToQ16(dynamic_config.config_data.framerate.xEncodeFramerate,
1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        (int)(m_sProfile.nFramerate * 2), 2);
1410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (OMX_SetConfig(m_hHandle, dynamic_config.config_param,
1412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            &dynamic_config.config_data) != OMX_ErrorNone)
1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          E("ERROR: Setting dynamic config to OMX param[0x%x]", dynamic_config.config_param);
1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        dynamic_config.pending = false;
1415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (m_nFrameIn > dynamic_config.frame_num)
1417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        E("WARNING: Config change requested in passed frame(%d)", dynamic_config.frame_num);
1419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        dynamic_config.pending = false;
1420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (!dynamic_config.pending)
1423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      VencTest_ReadDynamicConfigMsg();
1424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  } while (!dynamic_config.pending && m_pDynConfFile);
1425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev////////////////////////////////////////////////////////////////////////////////
142847e37c4428509524ee576920a98381f3e4872493Nick PellyOMX_ERRORTYPE VencTest_ReadAndEmpty(OMX_BUFFERHEADERTYPE* pYUVBuffer)
142947e37c4428509524ee576920a98381f3e4872493Nick Pelly{
143047e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_ERRORTYPE result = OMX_ErrorNone;
143147e37c4428509524ee576920a98381f3e4872493Nick Pelly#ifdef T_ARM
1432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
143347e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (read(m_nInFd,
143447e37c4428509524ee576920a98381f3e4872493Nick Pelly            pYUVBuffer->pBuffer,
143547e37c4428509524ee576920a98381f3e4872493Nick Pelly            m_sProfile.nFrameBytes) != m_sProfile.nFrameBytes)
143647e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
143747e37c4428509524ee576920a98381f3e4872493Nick Pelly      return OMX_ErrorUndefined;
143847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
1439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#elif BADGER
1440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int bytes;
1441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   E("will read YUV now: %d bytes to buffer %p\n", m_sProfile.nFrameRead, pYUVBuffer->pBuffer);
1442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   E("W: %d H: %d Str: %d scal: %d \n", m_sProfile.nFrameWidth, m_sProfile.nFrameHeight,
1443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sProfile.nFramestride, m_sProfile.nFrameScanlines);
1444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   bytes = read(m_nInFd, pYUVBuffer->pBuffer, m_sProfile.nFrameRead);
1445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (bytes != m_sProfile.nFrameRead) {
1446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		E("read failed: %d != %d\n", read, m_sProfile.nFrameRead);
1447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return OMX_ErrorUndefined;
1448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
1449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   E("\n\nRead %d bytes\n\n\n", m_sProfile.nFrameRead);
1450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
1451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_U32 bytestoread = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight;
1452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // read Y first
1453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (read(m_nInFd,
1454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pYUVBuffer->pBuffer,
1455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bytestoread) != bytestoread)
1456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorUndefined;
1457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // check alignment for offset to C
1459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_U32 offset_to_c = m_sProfile.nFrameWidth * m_sProfile.nFrameHeight;
1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         const OMX_U32 C_2K = (1024*2),
1462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            MASK_2K = C_2K-1,
1463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            IMASK_2K = ~MASK_2K;
1464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (offset_to_c & MASK_2K)
1466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
1467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // offset to C is not 2k aligned, adjustment is required
1468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            offset_to_c = (offset_to_c & IMASK_2K) + C_2K;
1469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
1470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         bytestoread = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight/2;
1472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // read C
1473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (read(m_nInFd,
1474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pYUVBuffer->pBuffer + offset_to_c,
1475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bytestoread)!= bytestoread)
1476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorUndefined;
1477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
147847e37c4428509524ee576920a98381f3e4872493Nick Pelly#else
147947e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
148047e37c4428509524ee576920a98381f3e4872493Nick Pelly	  char * pInputbuf = (char *)(pYUVBuffer->pBuffer) ;
148147e37c4428509524ee576920a98381f3e4872493Nick Pelly	      read(m_nInFd,pInputbuf,m_sProfile.nFrameBytes) ;
148247e37c4428509524ee576920a98381f3e4872493Nick Pelly
148347e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
148447e37c4428509524ee576920a98381f3e4872493Nick Pelly#endif
1485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (m_pDynConfFile)
1486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     VencTest_ProcessDynamicConfigurationFile();
148747e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("about to call VencTest_EncodeFrame...");
148847e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_lock(&m_mutex);
148947e37c4428509524ee576920a98381f3e4872493Nick Pelly   ++m_nFrameIn;
1490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef BADGER
1491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   pYUVBuffer->nFilledLen = m_sProfile.nFrameRead;
1492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
149347e37c4428509524ee576920a98381f3e4872493Nick Pelly   pYUVBuffer->nFilledLen = m_sProfile.nFrameBytes;
1494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
149547e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("Called Buffer with Data filled length %d",pYUVBuffer->nFilledLen);
149647e37c4428509524ee576920a98381f3e4872493Nick Pelly
149747e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = VencTest_EncodeFrame(pYUVBuffer->pBuffer,
149847e37c4428509524ee576920a98381f3e4872493Nick Pelly                                 m_nTimeStamp);
149947e37c4428509524ee576920a98381f3e4872493Nick Pelly
150047e37c4428509524ee576920a98381f3e4872493Nick Pelly   m_nTimeStamp += (1000000) / m_sProfile.nFramerate;
150147e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
150247e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_unlock(&m_mutex);
150347e37c4428509524ee576920a98381f3e4872493Nick Pelly   return result;
150447e37c4428509524ee576920a98381f3e4872493Nick Pelly}
150547e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
150647e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid PreviewCallback(int nFD,
150747e37c4428509524ee576920a98381f3e4872493Nick Pelly                     int nOffset,
150847e37c4428509524ee576920a98381f3e4872493Nick Pelly                     void* pPhys,
150947e37c4428509524ee576920a98381f3e4872493Nick Pelly                     void* pVirt,
151047e37c4428509524ee576920a98381f3e4872493Nick Pelly                     long long nTimeStamp)
151147e37c4428509524ee576920a98381f3e4872493Nick Pelly{
151247e37c4428509524ee576920a98381f3e4872493Nick Pelly
151347e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("================= preview frame %d, phys=0x%x, nTimeStamp(millis)=%lld",
151447e37c4428509524ee576920a98381f3e4872493Nick Pelly     m_nFrameIn+1, pPhys, (nTimeStamp / 1000));
151547e37c4428509524ee576920a98381f3e4872493Nick Pelly
151647e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_nFrameIn == m_nFramePlay &&
151747e37c4428509524ee576920a98381f3e4872493Nick Pelly       m_nFramePlay != 0)
151847e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
151947e37c4428509524ee576920a98381f3e4872493Nick Pelly      // we will stop camera after last frame is encoded.
152047e37c4428509524ee576920a98381f3e4872493Nick Pelly      // for now just ignore input frames
152147e37c4428509524ee576920a98381f3e4872493Nick Pelly
152247e37c4428509524ee576920a98381f3e4872493Nick Pelly      CameraTest_ReleaseFrame(pPhys, pVirt);
152347e37c4428509524ee576920a98381f3e4872493Nick Pelly      return;
152447e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
152547e37c4428509524ee576920a98381f3e4872493Nick Pelly
152647e37c4428509524ee576920a98381f3e4872493Nick Pelly   // see if we should stop
152747e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_lock(&m_mutex);
152847e37c4428509524ee576920a98381f3e4872493Nick Pelly   ++m_nFrameIn;
152947e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_unlock(&m_mutex);
153047e37c4428509524ee576920a98381f3e4872493Nick Pelly
153147e37c4428509524ee576920a98381f3e4872493Nick Pelly
153247e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode == MODE_LIVE_ENCODE)
153347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
153447e37c4428509524ee576920a98381f3e4872493Nick Pelly
153547e37c4428509524ee576920a98381f3e4872493Nick Pelly      OMX_ERRORTYPE result;
153647e37c4428509524ee576920a98381f3e4872493Nick Pelly
153747e37c4428509524ee576920a98381f3e4872493Nick Pelly      // register new camera buffers with encoder
153847e37c4428509524ee576920a98381f3e4872493Nick Pelly      int i;
153947e37c4428509524ee576920a98381f3e4872493Nick Pelly      for (i = 0; i < num_in_buffers; i++)
154047e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
154147e37c4428509524ee576920a98381f3e4872493Nick Pelly         if (m_pInBuffers[i] != NULL &&
154247e37c4428509524ee576920a98381f3e4872493Nick Pelly             m_pInBuffers[i]->pBuffer == pPhys)
154347e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
154447e37c4428509524ee576920a98381f3e4872493Nick Pelly            break;
154547e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
154647e37c4428509524ee576920a98381f3e4872493Nick Pelly         else if (m_pInBuffers[i] == NULL)
154747e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
154847e37c4428509524ee576920a98381f3e4872493Nick Pelly            D("registering buffer...");
154947e37c4428509524ee576920a98381f3e4872493Nick Pelly            result = VencTest_RegisterYUVBuffer(&m_pInBuffers[i],
155047e37c4428509524ee576920a98381f3e4872493Nick Pelly                                                (OMX_U8*) pPhys,
155147e37c4428509524ee576920a98381f3e4872493Nick Pelly                                                (OMX_PTR) pVirt); // store virt in app private field
155247e37c4428509524ee576920a98381f3e4872493Nick Pelly            D("register done");
155347e37c4428509524ee576920a98381f3e4872493Nick Pelly            CHK(result);
155447e37c4428509524ee576920a98381f3e4872493Nick Pelly            break;
155547e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
155647e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
155747e37c4428509524ee576920a98381f3e4872493Nick Pelly
155847e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (i == num_in_buffers)
155947e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
156047e37c4428509524ee576920a98381f3e4872493Nick Pelly         E("There are more camera buffers than we thought");
156147e37c4428509524ee576920a98381f3e4872493Nick Pelly         CHK(1);
156247e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
156347e37c4428509524ee576920a98381f3e4872493Nick Pelly
156447e37c4428509524ee576920a98381f3e4872493Nick Pelly      // encode the yuv frame
156547e37c4428509524ee576920a98381f3e4872493Nick Pelly
156647e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("StartEncodeTime=%lld", GetTimeStamp());
156747e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = VencTest_EncodeFrame(pPhys,
156847e37c4428509524ee576920a98381f3e4872493Nick Pelly                                    nTimeStamp);
156947e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
157047e37c4428509524ee576920a98381f3e4872493Nick Pelly     // FBTest_DisplayImage(nFD, nOffset);
157147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
157247e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
157347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
157447e37c4428509524ee576920a98381f3e4872493Nick Pelly     // FBTest_DisplayImage(nFD, nOffset);
157547e37c4428509524ee576920a98381f3e4872493Nick Pelly      CameraTest_ReleaseFrame(pPhys, pVirt);
157647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
157747e37c4428509524ee576920a98381f3e4872493Nick Pelly}
157847e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
157947e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid usage(char* filename)
158047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
158147e37c4428509524ee576920a98381f3e4872493Nick Pelly   char* fname = strrchr(filename, (int) '/');
158247e37c4428509524ee576920a98381f3e4872493Nick Pelly   fname = (fname == NULL) ? filename : fname;
158347e37c4428509524ee576920a98381f3e4872493Nick Pelly
158447e37c4428509524ee576920a98381f3e4872493Nick Pelly   fprintf(stderr, "usage: %s LIVE <QCIF|QVGA> <MP4|H263> <FPS> <BITRATE> <NFRAMES> <OUTFILE>\n", fname);
158547e37c4428509524ee576920a98381f3e4872493Nick Pelly   fprintf(stderr, "usage: %s FILE <QCIF|QVGA> <MP4|H263 <FPS> <BITRATE> <NFRAMES> <INFILE> <OUTFILE> ", fname);
1586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   fprintf(stderr, "<Dynamic config file - opt> <Rate Control - opt> <AVC Slice Mode - opt>\n", fname);
158747e37c4428509524ee576920a98381f3e4872493Nick Pelly   fprintf(stderr, "usage: %s PROFILE <QCIF|QVGA> <MP4|H263 <FPS> <BITRATE> <NFRAMES> <INFILE>\n", fname);
158847e37c4428509524ee576920a98381f3e4872493Nick Pelly   fprintf(stderr, "usage: %s PREVIEW <QCIF|QVGA> <FPS> <NFRAMES>\n", fname);
158947e37c4428509524ee576920a98381f3e4872493Nick Pelly   fprintf(stderr, "usage: %s DISPLAY <QCIF|QVGA> <FPS> <NFRAMES> <INFILE>\n", fname);
159047e37c4428509524ee576920a98381f3e4872493Nick Pelly   fprintf(stderr, "\n       BITRATE - bitrate in kbps\n");
159147e37c4428509524ee576920a98381f3e4872493Nick Pelly   fprintf(stderr, "       FPS - frames per second\n");
159247e37c4428509524ee576920a98381f3e4872493Nick Pelly   fprintf(stderr, "       NFRAMES - number of frames to play, 0 for infinite\n");
159347e37c4428509524ee576920a98381f3e4872493Nick Pelly   fprintf(stderr, "       RateControl (Values 0 - 4 for RC_OFF, RC_CBR_CFR, RC_CBR_VFR, RC_VBR_CFR, RC_VBR_VFR\n");
159447e37c4428509524ee576920a98381f3e4872493Nick Pelly   exit(1);
159547e37c4428509524ee576920a98381f3e4872493Nick Pelly}
1596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool parseWxH(char *str, OMX_U32 *width, OMX_U32 *height)
1598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   bool parseOK = false;
1600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   const char delimiters[] = " x*,";
1601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   char *token, *dupstr, *temp;
1602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_U32 w, h;
1603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   dupstr = strdup(str);
1605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   token = strtok_r(dupstr, delimiters, &temp);
1606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (token)
1607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
1608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       w = strtoul(token, NULL, 10);
1609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       token = strtok_r(NULL, delimiters, &temp);
1610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       if (token)
1611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       {
1612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           h = strtoul(token, NULL, 10);
1613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           if (w != ULONG_MAX && h != ULONG_MAX)
1614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           {
1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
1616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if ((w * h >> 8) <= 3600)
1617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 parseOK = true;
1619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 *width = w;
1620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 *height = h;
1621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 }
1622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
1623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if ((w * h >> 8) <= 8160)
1624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
1625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 parseOK = true;
1626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 *width = w;
1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 *height = h;
1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 }
1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              else
1631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                 E("\nInvalid dimensions %dx%d",w,h);
1632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
1633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           }
1634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       }
1635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   free(dupstr);
1636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return parseOK;
1637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
163947e37c4428509524ee576920a98381f3e4872493Nick Pelly////////////////////////////////////////////////////////////////////////////////
164047e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid parseArgs(int argc, char** argv)
164147e37c4428509524ee576920a98381f3e4872493Nick Pelly{
1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   int dyn_file_arg = argc;
164347e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (argc == 1)
164447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
164547e37c4428509524ee576920a98381f3e4872493Nick Pelly      usage(argv[0]);
164647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
164747e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (strcmp("PREVIEW", argv[1]) == 0 ||
164847e37c4428509524ee576920a98381f3e4872493Nick Pelly            strcmp("preview", argv[1]) == 0)
164947e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
165047e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_eMode = MODE_PREVIEW;
165147e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (argc != 5)
165247e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
165347e37c4428509524ee576920a98381f3e4872493Nick Pelly         usage(argv[0]);
165447e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
165547e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
165647e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (strcmp("DISPLAY", argv[1]) == 0 ||
165747e37c4428509524ee576920a98381f3e4872493Nick Pelly            strcmp("display", argv[1]) == 0)
165847e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
165947e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_eMode = MODE_DISPLAY;
166047e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (argc != 6)
166147e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
166247e37c4428509524ee576920a98381f3e4872493Nick Pelly         usage(argv[0]);
166347e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
166447e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.cInFileName = argv[5];
166547e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.cOutFileName = NULL;
166647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
166747e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (strcmp("LIVE", argv[1]) == 0 ||
166847e37c4428509524ee576920a98381f3e4872493Nick Pelly            strcmp("live", argv[1]) == 0)
166947e37c4428509524ee576920a98381f3e4872493Nick Pelly   {//263
167047e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_eMode = MODE_LIVE_ENCODE;
167147e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (argc != 8)
167247e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
167347e37c4428509524ee576920a98381f3e4872493Nick Pelly         usage(argv[0]);
167447e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
167547e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.cInFileName = NULL;
167647e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.cOutFileName = argv[7];
167747e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
167847e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (strcmp("FILE", argv[1]) == 0 ||
167947e37c4428509524ee576920a98381f3e4872493Nick Pelly            strcmp("file", argv[1]) == 0)
168047e37c4428509524ee576920a98381f3e4872493Nick Pelly   {//263
168147e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_eMode = MODE_FILE_ENCODE;
168247e37c4428509524ee576920a98381f3e4872493Nick Pelly
1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(argc < 9 || argc > 13)
168447e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
168547e37c4428509524ee576920a98381f3e4872493Nick Pelly          usage(argv[0]);
168647e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
168747e37c4428509524ee576920a98381f3e4872493Nick Pelly      else
168847e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
1689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (argc > 9)
1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            dyn_file_arg = 9;
1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (argc > 10)
169347e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
169447e37c4428509524ee576920a98381f3e4872493Nick Pelly           m_sProfile.eControlRate = OMX_Video_ControlRateVariable;
1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            int RC = atoi(argv[10]);
169647e37c4428509524ee576920a98381f3e4872493Nick Pelly
169747e37c4428509524ee576920a98381f3e4872493Nick Pelly            switch (RC)
169847e37c4428509524ee576920a98381f3e4872493Nick Pelly            {
169947e37c4428509524ee576920a98381f3e4872493Nick Pelly            case 0:
170047e37c4428509524ee576920a98381f3e4872493Nick Pelly               m_sProfile.eControlRate  = OMX_Video_ControlRateDisable ;//VENC_RC_NONE
170147e37c4428509524ee576920a98381f3e4872493Nick Pelly               break;
170247e37c4428509524ee576920a98381f3e4872493Nick Pelly            case 1:
170347e37c4428509524ee576920a98381f3e4872493Nick Pelly               m_sProfile.eControlRate  = OMX_Video_ControlRateConstant;//VENC_RC_CBR_CFR
170447e37c4428509524ee576920a98381f3e4872493Nick Pelly               break;
170547e37c4428509524ee576920a98381f3e4872493Nick Pelly
170647e37c4428509524ee576920a98381f3e4872493Nick Pelly            case 2:
170747e37c4428509524ee576920a98381f3e4872493Nick Pelly               m_sProfile.eControlRate  = OMX_Video_ControlRateConstantSkipFrames;//VENC_RC_CBR_VFR
170847e37c4428509524ee576920a98381f3e4872493Nick Pelly               break;
170947e37c4428509524ee576920a98381f3e4872493Nick Pelly
171047e37c4428509524ee576920a98381f3e4872493Nick Pelly            case 3:
171147e37c4428509524ee576920a98381f3e4872493Nick Pelly               m_sProfile.eControlRate  =OMX_Video_ControlRateVariable ;//VENC_RC_VBR_CFR
171247e37c4428509524ee576920a98381f3e4872493Nick Pelly               break;
171347e37c4428509524ee576920a98381f3e4872493Nick Pelly
171447e37c4428509524ee576920a98381f3e4872493Nick Pelly            case 4:
171547e37c4428509524ee576920a98381f3e4872493Nick Pelly               m_sProfile.eControlRate  = OMX_Video_ControlRateVariableSkipFrames;//VENC_RC_VBR_VFR
171647e37c4428509524ee576920a98381f3e4872493Nick Pelly               break;
171747e37c4428509524ee576920a98381f3e4872493Nick Pelly
171847e37c4428509524ee576920a98381f3e4872493Nick Pelly           default:
171947e37c4428509524ee576920a98381f3e4872493Nick Pelly               E("invalid rate control selection");
172047e37c4428509524ee576920a98381f3e4872493Nick Pelly               m_sProfile.eControlRate = OMX_Video_ControlRateVariable; //VENC_RC_VBR_CFR
172147e37c4428509524ee576920a98381f3e4872493Nick Pelly               break;
172247e37c4428509524ee576920a98381f3e4872493Nick Pelly            }
172347e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
172447e37c4428509524ee576920a98381f3e4872493Nick Pelly
1725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (argc > 11)
172647e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
1727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            int profile_argi = 11;
172847e37c4428509524ee576920a98381f3e4872493Nick Pelly            if(!strcmp(argv[3], "H264") || !strcmp(argv[3], "h264"))
172947e37c4428509524ee576920a98381f3e4872493Nick Pelly            {
1730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               profile_argi = 12;
1731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               D("\nSetting AVCSliceMode ... ");
1732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               int AVCSliceMode = atoi(argv[11]);
173347e37c4428509524ee576920a98381f3e4872493Nick Pelly               switch(AVCSliceMode)
173447e37c4428509524ee576920a98381f3e4872493Nick Pelly               {
173547e37c4428509524ee576920a98381f3e4872493Nick Pelly               case 0:
173647e37c4428509524ee576920a98381f3e4872493Nick Pelly                  m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
173747e37c4428509524ee576920a98381f3e4872493Nick Pelly                  break;
173847e37c4428509524ee576920a98381f3e4872493Nick Pelly
173947e37c4428509524ee576920a98381f3e4872493Nick Pelly               case 1:
174047e37c4428509524ee576920a98381f3e4872493Nick Pelly                  m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCMBSlice;
174147e37c4428509524ee576920a98381f3e4872493Nick Pelly                  break;
174247e37c4428509524ee576920a98381f3e4872493Nick Pelly
174347e37c4428509524ee576920a98381f3e4872493Nick Pelly               case 2:
174447e37c4428509524ee576920a98381f3e4872493Nick Pelly                  m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCByteSlice;
174547e37c4428509524ee576920a98381f3e4872493Nick Pelly                  break;
174647e37c4428509524ee576920a98381f3e4872493Nick Pelly
174747e37c4428509524ee576920a98381f3e4872493Nick Pelly               default:
174847e37c4428509524ee576920a98381f3e4872493Nick Pelly                  E("invalid Slice Mode");
174947e37c4428509524ee576920a98381f3e4872493Nick Pelly                  m_sProfile.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
175047e37c4428509524ee576920a98381f3e4872493Nick Pelly                  break;
175147e37c4428509524ee576920a98381f3e4872493Nick Pelly              }
175247e37c4428509524ee576920a98381f3e4872493Nick Pelly            }
1753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if (profile_argi < argc)
175447e37c4428509524ee576920a98381f3e4872493Nick Pelly            {
1755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if (!strncmp(argv[profile_argi], "0x", 2) || !strncmp(argv[profile_argi], "0x", 2))
1756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               {
1757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  m_sProfile.nUserProfile = strtoul(argv[profile_argi], NULL, 16);
1758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
1759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               else
1760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               {
1761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  m_sProfile.nUserProfile = strtoul(argv[profile_argi], NULL, 10);
1762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
1763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               if (!m_sProfile.nUserProfile || m_sProfile.nUserProfile == ULONG_MAX)
1764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               {
1765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  E("invalid specified Profile %s, using default", argv[profile_argi]);
1766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  m_sProfile.nUserProfile = 0;
1767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               }
176847e37c4428509524ee576920a98381f3e4872493Nick Pelly            }
176947e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
177047e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
177147e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.cInFileName = argv[7];
177247e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.cOutFileName = argv[8];
177347e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
177447e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (strcmp("PROFILE", argv[1]) == 0 ||
177547e37c4428509524ee576920a98381f3e4872493Nick Pelly            strcmp("profile", argv[1]) == 0)
177647e37c4428509524ee576920a98381f3e4872493Nick Pelly   {//263
177747e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_eMode = MODE_PROFILE;
177847e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (argc != 8)
177947e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
178047e37c4428509524ee576920a98381f3e4872493Nick Pelly         usage(argv[0]);
178147e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
178247e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.cInFileName = argv[7];
178347e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.cOutFileName = NULL;
178447e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
178547e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
178647e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
178747e37c4428509524ee576920a98381f3e4872493Nick Pelly      usage(argv[0]);
178847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
178947e37c4428509524ee576920a98381f3e4872493Nick Pelly
179047e37c4428509524ee576920a98381f3e4872493Nick Pelly
179147e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (strcmp("QCIF", argv[2]) == 0 ||
179247e37c4428509524ee576920a98381f3e4872493Nick Pelly       strcmp("qcif", argv[2]) == 0)
179347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
179447e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameWidth = 176;
179547e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameHeight = 144;
179647e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameBytes = 176*144*3/2;
179747e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level0;
179847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
179947e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (strcmp("QVGA", argv[2]) == 0 ||
180047e37c4428509524ee576920a98381f3e4872493Nick Pelly            strcmp("qvga", argv[2]) == 0)
180147e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
180247e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameWidth = 320;
180347e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameHeight = 240;
180447e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameBytes = 320*240*3/2;
180547e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
180647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
180747e37c4428509524ee576920a98381f3e4872493Nick Pelly
180847e37c4428509524ee576920a98381f3e4872493Nick Pelly
180947e37c4428509524ee576920a98381f3e4872493Nick Pelly    else if (strcmp("VGA", argv[2]) == 0 ||
181047e37c4428509524ee576920a98381f3e4872493Nick Pelly            strcmp("vga", argv[2]) == 0)
181147e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
181247e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameWidth = 640;
181347e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameHeight = 480;
181447e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameBytes = 640*480*3/2;
181547e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
181647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
181747e37c4428509524ee576920a98381f3e4872493Nick Pelly
181847e37c4428509524ee576920a98381f3e4872493Nick Pelly    else if (strcmp("WVGA", argv[2]) == 0 ||
181947e37c4428509524ee576920a98381f3e4872493Nick Pelly            strcmp("wvga", argv[2]) == 0)
182047e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
182147e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameWidth = 800;
182247e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameHeight = 480;
182347e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameBytes = 800*480*3/2;
182447e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
182547e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
182647e37c4428509524ee576920a98381f3e4872493Nick Pelly  else if (strcmp("CIF", argv[2]) == 0 ||
1827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            strcmp("cif", argv[2]) == 0)
182847e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
182947e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameWidth = 352;
183047e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameHeight = 288;
183147e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameBytes = 352*288*3/2;
183247e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
183347e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
1834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else if (strcmp("720", argv[2]) == 0)
183547e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
183647e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameWidth = 1280;
183747e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameHeight = 720;
183847e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nFrameBytes = 720*1280*3/2;
183947e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
184047e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
1841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else if (strcmp("1080", argv[2]) == 0)
1842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
1843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sProfile.nFrameWidth = 1920;
1844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sProfile.nFrameHeight = 1080;
1845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sProfile.nFrameBytes = 1920*1080*3/2;
1846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
1847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
1848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else if (parseWxH(argv[2], &m_sProfile.nFrameWidth, &m_sProfile.nFrameHeight))
1849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sProfile.nFrameBytes = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight*3/2;
1851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
1852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
185347e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
185447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
185547e37c4428509524ee576920a98381f3e4872493Nick Pelly      usage(argv[0]);
185647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
185747e37c4428509524ee576920a98381f3e4872493Nick Pelly
1858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef BADGER
1859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_sProfile.nFramestride =  (m_sProfile.nFrameWidth + 31) & (~31);
1860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_sProfile.nFrameScanlines = (m_sProfile.nFrameHeight + 31) & (~31);
1861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_sProfile.nFrameBytes = ((m_sProfile.nFramestride * m_sProfile.nFrameScanlines * 3/2) + 4095) & (~4095);
1862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   E("stride: %d, Scanlines: %d, Size: %d",
1863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     m_sProfile.nFramestride, m_sProfile.nFrameScanlines, m_sProfile.nFrameBytes);
1864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   m_sProfile.nFrameRead = m_sProfile.nFramestride * m_sProfile.nFrameScanlines * 3/2;
1865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
186647e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode == MODE_DISPLAY ||
186747e37c4428509524ee576920a98381f3e4872493Nick Pelly       m_eMode == MODE_PREVIEW)
186847e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
1869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sProfile.nFramerate = atof(argv[3]);
187047e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_nFramePlay = atoi(argv[4]);
187147e37c4428509524ee576920a98381f3e4872493Nick Pelly
187247e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
187347e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (m_eMode == MODE_LIVE_ENCODE ||
187447e37c4428509524ee576920a98381f3e4872493Nick Pelly            m_eMode == MODE_FILE_ENCODE ||
187547e37c4428509524ee576920a98381f3e4872493Nick Pelly            m_eMode == MODE_PROFILE)
1876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
187747e37c4428509524ee576920a98381f3e4872493Nick Pelly      if ((!strcmp(argv[3], "MP4")) || (!strcmp(argv[3], "mp4")))
187847e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
187947e37c4428509524ee576920a98381f3e4872493Nick Pelly         m_sProfile.eCodec = OMX_VIDEO_CodingMPEG4;
188047e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
188147e37c4428509524ee576920a98381f3e4872493Nick Pelly      else if ((!strcmp(argv[3], "H263")) || (!strcmp(argv[3], "h263")))
188247e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
188347e37c4428509524ee576920a98381f3e4872493Nick Pelly         m_sProfile.eCodec = OMX_VIDEO_CodingH263;
188447e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
188547e37c4428509524ee576920a98381f3e4872493Nick Pelly      else if ((!strcmp(argv[3], "H264")) || (!strcmp(argv[3], "h264")))
188647e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
188747e37c4428509524ee576920a98381f3e4872493Nick Pelly         m_sProfile.eCodec = OMX_VIDEO_CodingAVC;
188847e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
188947e37c4428509524ee576920a98381f3e4872493Nick Pelly      else
189047e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
189147e37c4428509524ee576920a98381f3e4872493Nick Pelly         usage(argv[0]);
189247e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
189347e37c4428509524ee576920a98381f3e4872493Nick Pelly
1894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sProfile.nFramerate = atof(argv[4]);
189547e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_sProfile.nBitrate = atoi(argv[5]);
189647e37c4428509524ee576920a98381f3e4872493Nick Pelly//      m_sProfile.eControlRate = OMX_Video_ControlRateVariable;
189747e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_nFramePlay = atoi(argv[6]);
1898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (dyn_file_arg < argc)
1899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_pDynConfFile = fopen(argv[dyn_file_arg], "r");
1901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (!m_pDynConfFile)
1902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          E("ERROR: Cannot open dynamic config file: %s", argv[dyn_file_arg]);
1903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          memset(&dynamic_config, 0, sizeof(struct DynamicConfig));
1906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
190847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
190947e37c4428509524ee576920a98381f3e4872493Nick Pelly}
191047e37c4428509524ee576920a98381f3e4872493Nick Pelly
191147e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid* Watchdog(void* data)
191247e37c4428509524ee576920a98381f3e4872493Nick Pelly{
191347e37c4428509524ee576920a98381f3e4872493Nick Pelly   while (1)
191447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
191547e37c4428509524ee576920a98381f3e4872493Nick Pelly      sleep(1000);
191647e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (m_bWatchDogKicked == true)
191747e37c4428509524ee576920a98381f3e4872493Nick Pelly         m_bWatchDogKicked = false;
191847e37c4428509524ee576920a98381f3e4872493Nick Pelly      else
191947e37c4428509524ee576920a98381f3e4872493Nick Pelly         E("watchdog has not been kicked. we may have a deadlock");
192047e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
192147e37c4428509524ee576920a98381f3e4872493Nick Pelly   return NULL;
192247e37c4428509524ee576920a98381f3e4872493Nick Pelly}
192347e37c4428509524ee576920a98381f3e4872493Nick Pelly
192447e37c4428509524ee576920a98381f3e4872493Nick Pellyint main(int argc, char** argv)
192547e37c4428509524ee576920a98381f3e4872493Nick Pelly{
192647e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_U8* pvirt = NULL;
192747e37c4428509524ee576920a98381f3e4872493Nick Pelly   int result;
192847e37c4428509524ee576920a98381f3e4872493Nick Pelly   float enc_time_sec=0.0,enc_time_usec=0.0;
192947e37c4428509524ee576920a98381f3e4872493Nick Pelly
193047e37c4428509524ee576920a98381f3e4872493Nick Pelly   m_nInFd = -1;
193147e37c4428509524ee576920a98381f3e4872493Nick Pelly   m_nOutFd = -1;
193247e37c4428509524ee576920a98381f3e4872493Nick Pelly   m_nTimeStamp = 0;
193347e37c4428509524ee576920a98381f3e4872493Nick Pelly   m_nFrameIn = 0;
193447e37c4428509524ee576920a98381f3e4872493Nick Pelly   m_nFrameOut = 0;
193547e37c4428509524ee576920a98381f3e4872493Nick Pelly
193647e37c4428509524ee576920a98381f3e4872493Nick Pelly   memset(&m_sMsgQ, 0, sizeof(MsgQ));
193747e37c4428509524ee576920a98381f3e4872493Nick Pelly   parseArgs(argc, argv);
193847e37c4428509524ee576920a98381f3e4872493Nick Pelly
193947e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("fps=%d, bitrate=%d, width=%d, height=%d",
194047e37c4428509524ee576920a98381f3e4872493Nick Pelly     m_sProfile.nFramerate,
194147e37c4428509524ee576920a98381f3e4872493Nick Pelly     m_sProfile.nBitrate,
194247e37c4428509524ee576920a98381f3e4872493Nick Pelly     m_sProfile.nFrameWidth,
194347e37c4428509524ee576920a98381f3e4872493Nick Pelly     m_sProfile.nFrameHeight);
194447e37c4428509524ee576920a98381f3e4872493Nick Pelly
194547e37c4428509524ee576920a98381f3e4872493Nick Pelly
194647e37c4428509524ee576920a98381f3e4872493Nick Pelly   //if (m_eMode != MODE_PREVIEW && m_eMode != MODE_DISPLAY)
194747e37c4428509524ee576920a98381f3e4872493Nick Pelly   //{
194847e37c4428509524ee576920a98381f3e4872493Nick Pelly     // pthread_t wd;
194947e37c4428509524ee576920a98381f3e4872493Nick Pelly     // pthread_create(&wd, NULL, Watchdog, NULL);
195047e37c4428509524ee576920a98381f3e4872493Nick Pelly   //}
195147e37c4428509524ee576920a98381f3e4872493Nick Pelly
195247e37c4428509524ee576920a98381f3e4872493Nick Pelly   for (int x = 0; x < num_in_buffers; x++)
195347e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
195447e37c4428509524ee576920a98381f3e4872493Nick Pelly      // mark all buffers as ready to use
195547e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_bInFrameFree[x] = OMX_TRUE;
195647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
195747e37c4428509524ee576920a98381f3e4872493Nick Pelly
195847e37c4428509524ee576920a98381f3e4872493Nick Pelly
195947e37c4428509524ee576920a98381f3e4872493Nick Pelly    if (m_eMode != MODE_PROFILE)
196047e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
196147e37c4428509524ee576920a98381f3e4872493Nick Pelly      #if T_ARM
196247e37c4428509524ee576920a98381f3e4872493Nick Pelly	   m_nOutFd = open(m_sProfile.cOutFileName, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO);
196347e37c4428509524ee576920a98381f3e4872493Nick Pelly      #else
196447e37c4428509524ee576920a98381f3e4872493Nick Pelly	  m_nOutFd = open(m_sProfile.cOutFileName,0);
196547e37c4428509524ee576920a98381f3e4872493Nick Pelly      #endif
196647e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (m_nOutFd < 0)
196747e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
196847e37c4428509524ee576920a98381f3e4872493Nick Pelly         E("could not open output file %s", m_sProfile.cOutFileName);
196947e37c4428509524ee576920a98381f3e4872493Nick Pelly         CHK(1);
197047e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
197147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
197247e37c4428509524ee576920a98381f3e4872493Nick Pelly
197347e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_init(&m_mutex, NULL);
197447e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_cond_init(&m_signal, NULL);
197547e37c4428509524ee576920a98381f3e4872493Nick Pelly
197647e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode != MODE_PREVIEW)
197747e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
197847e37c4428509524ee576920a98381f3e4872493Nick Pelly      VencTest_Initialize();
197947e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
198047e37c4428509524ee576920a98381f3e4872493Nick Pelly
198147e37c4428509524ee576920a98381f3e4872493Nick Pelly   ////////////////////////////////////////
198247e37c4428509524ee576920a98381f3e4872493Nick Pelly   // Camera + Encode
198347e37c4428509524ee576920a98381f3e4872493Nick Pelly   ////////////////////////////////////////
198447e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode == MODE_LIVE_ENCODE)
198547e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
198647e37c4428509524ee576920a98381f3e4872493Nick Pelly     CameraTest_Initialize(m_sProfile.nFramerate,
198747e37c4428509524ee576920a98381f3e4872493Nick Pelly                            m_sProfile.nFrameWidth,
198847e37c4428509524ee576920a98381f3e4872493Nick Pelly                            m_sProfile.nFrameHeight,
198947e37c4428509524ee576920a98381f3e4872493Nick Pelly                            PreviewCallback);
199047e37c4428509524ee576920a98381f3e4872493Nick Pelly      CameraTest_Run();
199147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
199247e37c4428509524ee576920a98381f3e4872493Nick Pelly
199347e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode == MODE_FILE_ENCODE ||
199447e37c4428509524ee576920a98381f3e4872493Nick Pelly       m_eMode == MODE_PROFILE)
199547e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
199647e37c4428509524ee576920a98381f3e4872493Nick Pelly      int i;
199747e37c4428509524ee576920a98381f3e4872493Nick Pelly      #if T_ARM
199847e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_nInFd = open(m_sProfile.cInFileName, O_RDONLY);
199947e37c4428509524ee576920a98381f3e4872493Nick Pelly      #else
200047e37c4428509524ee576920a98381f3e4872493Nick Pelly      m_nInFd = open(m_sProfile.cInFileName,1);
200147e37c4428509524ee576920a98381f3e4872493Nick Pelly      #endif
200247e37c4428509524ee576920a98381f3e4872493Nick Pelly	  if (m_nInFd < 0)
200347e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
200447e37c4428509524ee576920a98381f3e4872493Nick Pelly         E("could not open input file");
200547e37c4428509524ee576920a98381f3e4872493Nick Pelly         CHK(1);
2006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
200747e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
200847e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("going to idle state");
200947e37c4428509524ee576920a98381f3e4872493Nick Pelly      //SetState(OMX_StateIdle);
201047e37c4428509524ee576920a98381f3e4872493Nick Pelly      OMX_SendCommand(m_hHandle,
201147e37c4428509524ee576920a98381f3e4872493Nick Pelly                      OMX_CommandStateSet,
201247e37c4428509524ee576920a98381f3e4872493Nick Pelly                      (OMX_U32) OMX_StateIdle,
201347e37c4428509524ee576920a98381f3e4872493Nick Pelly                       NULL);
201447e37c4428509524ee576920a98381f3e4872493Nick Pelly
201547e37c4428509524ee576920a98381f3e4872493Nick Pelly      OMX_PARAM_PORTDEFINITIONTYPE portDef;
201647e37c4428509524ee576920a98381f3e4872493Nick Pelly
201747e37c4428509524ee576920a98381f3e4872493Nick Pelly      portDef.nPortIndex = 0;
201847e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_GetParameter(m_hHandle, OMX_IndexParamPortDefinition, &portDef);
201947e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
202047e37c4428509524ee576920a98381f3e4872493Nick Pelly
202147e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("allocating Input buffers");
202247e37c4428509524ee576920a98381f3e4872493Nick Pelly      num_in_buffers = portDef.nBufferCountActual;
202347e37c4428509524ee576920a98381f3e4872493Nick Pelly      for (i = 0; i < portDef.nBufferCountActual; i++)
202447e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
202547e37c4428509524ee576920a98381f3e4872493Nick Pelly         OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem = new OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO;
202647e37c4428509524ee576920a98381f3e4872493Nick Pelly         pvirt = (OMX_U8*)PmemMalloc(pMem, m_sProfile.nFrameBytes);
202747e37c4428509524ee576920a98381f3e4872493Nick Pelly
202847e37c4428509524ee576920a98381f3e4872493Nick Pelly         if(pvirt == NULL)
202947e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
203047e37c4428509524ee576920a98381f3e4872493Nick Pelly            CHK(1);
203147e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
203247e37c4428509524ee576920a98381f3e4872493Nick Pelly         result = VencTest_RegisterYUVBuffer(&m_pInBuffers[i],
203347e37c4428509524ee576920a98381f3e4872493Nick Pelly                                             (OMX_U8*) pvirt,
203447e37c4428509524ee576920a98381f3e4872493Nick Pelly                                             (OMX_PTR) pMem);
203547e37c4428509524ee576920a98381f3e4872493Nick Pelly         CHK(result);
203647e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
203747e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
203847e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (m_eMode == MODE_LIVE_ENCODE)
203947e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
204047e37c4428509524ee576920a98381f3e4872493Nick Pelly       D("going to idle state");
204147e37c4428509524ee576920a98381f3e4872493Nick Pelly       //SetState(OMX_StateIdle);
204247e37c4428509524ee576920a98381f3e4872493Nick Pelly       OMX_SendCommand(m_hHandle,
204347e37c4428509524ee576920a98381f3e4872493Nick Pelly                       OMX_CommandStateSet,
204447e37c4428509524ee576920a98381f3e4872493Nick Pelly                       (OMX_U32) OMX_StateIdle,
204547e37c4428509524ee576920a98381f3e4872493Nick Pelly                        NULL);
204647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
204747e37c4428509524ee576920a98381f3e4872493Nick Pelly
204847e37c4428509524ee576920a98381f3e4872493Nick Pelly   int i;
204947e37c4428509524ee576920a98381f3e4872493Nick Pelly   OMX_PARAM_PORTDEFINITIONTYPE portDef;
205047e37c4428509524ee576920a98381f3e4872493Nick Pelly
205147e37c4428509524ee576920a98381f3e4872493Nick Pelly   portDef.nPortIndex = 1;
205247e37c4428509524ee576920a98381f3e4872493Nick Pelly   result = OMX_GetParameter(m_hHandle, OMX_IndexParamPortDefinition, &portDef);
205347e37c4428509524ee576920a98381f3e4872493Nick Pelly   CHK(result);
205447e37c4428509524ee576920a98381f3e4872493Nick Pelly
205547e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("allocating output buffers");
205647e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("Calling UseBuffer for Output port");
205747e37c4428509524ee576920a98381f3e4872493Nick Pelly   num_out_buffers = portDef.nBufferCountActual;
205847e37c4428509524ee576920a98381f3e4872493Nick Pelly   for (i = 0; i < portDef.nBufferCountActual; i++)
205947e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
206047e37c4428509524ee576920a98381f3e4872493Nick Pelly      void* pBuff;
206147e37c4428509524ee576920a98381f3e4872493Nick Pelly
206247e37c4428509524ee576920a98381f3e4872493Nick Pelly      pBuff = malloc(portDef.nBufferSize);
206347e37c4428509524ee576920a98381f3e4872493Nick Pelly     D("portDef.nBufferSize = %d ",portDef.nBufferSize);
206447e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_UseBuffer(m_hHandle,
206547e37c4428509524ee576920a98381f3e4872493Nick Pelly                             &m_pOutBuffers[i],
206647e37c4428509524ee576920a98381f3e4872493Nick Pelly                             (OMX_U32) PORT_INDEX_OUT,
206747e37c4428509524ee576920a98381f3e4872493Nick Pelly                             NULL,
206847e37c4428509524ee576920a98381f3e4872493Nick Pelly                             portDef.nBufferSize,
206947e37c4428509524ee576920a98381f3e4872493Nick Pelly                             (OMX_U8*) pBuff);
207047e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
207147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
207247e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("allocate done");
207347e37c4428509524ee576920a98381f3e4872493Nick Pelly
207447e37c4428509524ee576920a98381f3e4872493Nick Pelly        // D("Going to state " # eState"...");
207547e37c4428509524ee576920a98381f3e4872493Nick Pelly
207647e37c4428509524ee576920a98381f3e4872493Nick Pelly         while (m_eState != OMX_StateIdle)
207747e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
207847e37c4428509524ee576920a98381f3e4872493Nick Pelly            sleep(1);
207947e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
208047e37c4428509524ee576920a98381f3e4872493Nick Pelly         //D("Now in state " # eState);
208147e37c4428509524ee576920a98381f3e4872493Nick Pelly
208247e37c4428509524ee576920a98381f3e4872493Nick Pelly
208347e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("going to executing state");
208447e37c4428509524ee576920a98381f3e4872493Nick Pelly   SetState(OMX_StateExecuting);
208547e37c4428509524ee576920a98381f3e4872493Nick Pelly   for (i = 0; i < num_out_buffers; i++)
208647e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
208747e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("filling buffer %d", i);
208847e37c4428509524ee576920a98381f3e4872493Nick Pelly      result = OMX_FillThisBuffer(m_hHandle, m_pOutBuffers[i]);
208947e37c4428509524ee576920a98381f3e4872493Nick Pelly      //sleep(1000);
209047e37c4428509524ee576920a98381f3e4872493Nick Pelly      CHK(result);
209147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
209247e37c4428509524ee576920a98381f3e4872493Nick Pelly
209347e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode == MODE_FILE_ENCODE)
209447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
209547e37c4428509524ee576920a98381f3e4872493Nick Pelly      // encode the first frame to kick off the whole process
209647e37c4428509524ee576920a98381f3e4872493Nick Pelly      VencTest_ReadAndEmpty(m_pInBuffers[0]);
209747e37c4428509524ee576920a98381f3e4872493Nick Pelly    //  FBTest_DisplayImage(((PmemBuffer*) m_pInBuffers[0]->pAppPrivate)->fd,0);
209847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
209947e37c4428509524ee576920a98381f3e4872493Nick Pelly
210047e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode == MODE_PROFILE)
210147e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
210247e37c4428509524ee576920a98381f3e4872493Nick Pelly      int i;
210347e37c4428509524ee576920a98381f3e4872493Nick Pelly
210447e37c4428509524ee576920a98381f3e4872493Nick Pelly      // read several frames into memory
210547e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("reading frames into memory");
210647e37c4428509524ee576920a98381f3e4872493Nick Pelly      for (i = 0; i < num_in_buffers; i++)
210747e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
210847e37c4428509524ee576920a98381f3e4872493Nick Pelly        D("[%d] address 0x%x",i, m_pInBuffers[i]->pBuffer);
2109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_720P
211047e37c4428509524ee576920a98381f3e4872493Nick Pelly         read(m_nInFd,
211147e37c4428509524ee576920a98381f3e4872493Nick Pelly              m_pInBuffers[i]->pBuffer,
211247e37c4428509524ee576920a98381f3e4872493Nick Pelly              m_sProfile.nFrameBytes);
2113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
2114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // read Y first
2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         read(m_nInFd,
2116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_pInBuffers[i]->pBuffer,
2117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_sProfile.nFrameWidth*m_sProfile.nFrameHeight);
2118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // check alignment for offset to C
2120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_U32 offset_to_c = m_sProfile.nFrameWidth * m_sProfile.nFrameHeight;
2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         const OMX_U32 C_2K = (1024*2),
2123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            MASK_2K = C_2K-1,
2124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            IMASK_2K = ~MASK_2K;
2125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         if (offset_to_c & MASK_2K)
2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
2128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // offset to C is not 2k aligned, adjustment is required
2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            offset_to_c = (offset_to_c & IMASK_2K) + C_2K;
2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
2131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         // read C
2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         read(m_nInFd,
2134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_pInBuffers[i]->pBuffer + offset_to_c,
2135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              m_sProfile.nFrameWidth*m_sProfile.nFrameHeight/2);
2136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
213747e37c4428509524ee576920a98381f3e4872493Nick Pelly
213847e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
213947e37c4428509524ee576920a98381f3e4872493Nick Pelly
214047e37c4428509524ee576920a98381f3e4872493Nick Pelly     // FBTest_Initialize(m_sProfile.nFrameWidth, m_sProfile.nFrameHeight);
214147e37c4428509524ee576920a98381f3e4872493Nick Pelly
214247e37c4428509524ee576920a98381f3e4872493Nick Pelly      // loop over the mem-resident frames and encode them
214347e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("beging playing mem-resident frames...");
214447e37c4428509524ee576920a98381f3e4872493Nick Pelly      for (i = 0; m_nFramePlay == 0 || i < m_nFramePlay; i++)
214547e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
214647e37c4428509524ee576920a98381f3e4872493Nick Pelly         int idx = i % num_in_buffers;
214747e37c4428509524ee576920a98381f3e4872493Nick Pelly         if (m_bInFrameFree[idx] == OMX_FALSE)
214847e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
214947e37c4428509524ee576920a98381f3e4872493Nick Pelly            int j;
215047e37c4428509524ee576920a98381f3e4872493Nick Pelly            E("the expected buffer is not free, but lets find another");
215147e37c4428509524ee576920a98381f3e4872493Nick Pelly
215247e37c4428509524ee576920a98381f3e4872493Nick Pelly            idx = -1;
215347e37c4428509524ee576920a98381f3e4872493Nick Pelly
215447e37c4428509524ee576920a98381f3e4872493Nick Pelly            // lets see if we can find another free buffer
215547e37c4428509524ee576920a98381f3e4872493Nick Pelly            for (j = 0; j < num_in_buffers; j++)
215647e37c4428509524ee576920a98381f3e4872493Nick Pelly            {
215747e37c4428509524ee576920a98381f3e4872493Nick Pelly               if(m_bInFrameFree[j])
215847e37c4428509524ee576920a98381f3e4872493Nick Pelly               {
215947e37c4428509524ee576920a98381f3e4872493Nick Pelly                  idx = j;
216047e37c4428509524ee576920a98381f3e4872493Nick Pelly                  break;
216147e37c4428509524ee576920a98381f3e4872493Nick Pelly               }
216247e37c4428509524ee576920a98381f3e4872493Nick Pelly            }
216347e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
216447e37c4428509524ee576920a98381f3e4872493Nick Pelly
216547e37c4428509524ee576920a98381f3e4872493Nick Pelly         // if we have a free buffer let's encode it
216647e37c4428509524ee576920a98381f3e4872493Nick Pelly         if (idx >= 0)
216747e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
216847e37c4428509524ee576920a98381f3e4872493Nick Pelly            D("encode frame %d...m_pInBuffers[idx]->pBuffer=0x%x", i,m_pInBuffers[idx]->pBuffer);
216947e37c4428509524ee576920a98381f3e4872493Nick Pelly            m_bInFrameFree[idx] = OMX_FALSE;
217047e37c4428509524ee576920a98381f3e4872493Nick Pelly            VencTest_EncodeFrame(m_pInBuffers[idx]->pBuffer,
217147e37c4428509524ee576920a98381f3e4872493Nick Pelly                                 m_nTimeStamp);
217247e37c4428509524ee576920a98381f3e4872493Nick Pelly            D("display frame %d...", i);
217347e37c4428509524ee576920a98381f3e4872493Nick Pelly        //    FBTest_DisplayImage(((PmemBuffer*) m_pInBuffers[idx]->pAppPrivate)->fd,0);
217447e37c4428509524ee576920a98381f3e4872493Nick Pelly            m_nTimeStamp += 1000000 / m_sProfile.nFramerate;
217547e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
217647e37c4428509524ee576920a98381f3e4872493Nick Pelly         else
217747e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
217847e37c4428509524ee576920a98381f3e4872493Nick Pelly            E("wow, no buffers are free, performance "
217947e37c4428509524ee576920a98381f3e4872493Nick Pelly              "is not so good. lets just sleep some more");
218047e37c4428509524ee576920a98381f3e4872493Nick Pelly
218147e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
218247e37c4428509524ee576920a98381f3e4872493Nick Pelly         D("sleep for %d microsec", 1000000/m_sProfile.nFramerate);
218347e37c4428509524ee576920a98381f3e4872493Nick Pelly         sleep (1000000 / m_sProfile.nFramerate);
218447e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
218547e37c4428509524ee576920a98381f3e4872493Nick Pelly     // FBTest_Exit();
218647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
218747e37c4428509524ee576920a98381f3e4872493Nick Pelly
218847e37c4428509524ee576920a98381f3e4872493Nick Pelly   Msg msg;
218947e37c4428509524ee576920a98381f3e4872493Nick Pelly   bool bQuit = false;
219047e37c4428509524ee576920a98381f3e4872493Nick Pelly   while ((m_eMode == MODE_FILE_ENCODE || m_eMode == MODE_LIVE_ENCODE) &&
219147e37c4428509524ee576920a98381f3e4872493Nick Pelly          !bQuit)
219247e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
219347e37c4428509524ee576920a98381f3e4872493Nick Pelly      PopMessage(&msg);
219447e37c4428509524ee576920a98381f3e4872493Nick Pelly      switch (msg.id)
219547e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
219647e37c4428509524ee576920a98381f3e4872493Nick Pelly      //////////////////////////////////
219747e37c4428509524ee576920a98381f3e4872493Nick Pelly      // FRAME IS ENCODED
219847e37c4428509524ee576920a98381f3e4872493Nick Pelly      //////////////////////////////////
219947e37c4428509524ee576920a98381f3e4872493Nick Pelly      case MSG_ID_INPUT_FRAME_DONE:
220047e37c4428509524ee576920a98381f3e4872493Nick Pelly         /*pthread_mutex_lock(&m_mutex);
220147e37c4428509524ee576920a98381f3e4872493Nick Pelly         ++m_nFrameOut;
220247e37c4428509524ee576920a98381f3e4872493Nick Pelly         if (m_nFrameOut == m_nFramePlay && m_nFramePlay != 0)
220347e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
220447e37c4428509524ee576920a98381f3e4872493Nick Pelly            bQuit = true;
220547e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
220647e37c4428509524ee576920a98381f3e4872493Nick Pelly         pthread_mutex_unlock(&m_mutex);*/
220747e37c4428509524ee576920a98381f3e4872493Nick Pelly
220847e37c4428509524ee576920a98381f3e4872493Nick Pelly         if (!bQuit && m_eMode == MODE_FILE_ENCODE)
220947e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
221047e37c4428509524ee576920a98381f3e4872493Nick Pelly            D("pushing another frame down to encoder");
221147e37c4428509524ee576920a98381f3e4872493Nick Pelly            if (VencTest_ReadAndEmpty(msg.data.sBitstreamData.pBuffer))
221247e37c4428509524ee576920a98381f3e4872493Nick Pelly            {
221347e37c4428509524ee576920a98381f3e4872493Nick Pelly               // we have read the last frame
221447e37c4428509524ee576920a98381f3e4872493Nick Pelly               D("main is exiting...");
221547e37c4428509524ee576920a98381f3e4872493Nick Pelly               bQuit = true;
221647e37c4428509524ee576920a98381f3e4872493Nick Pelly            }
221747e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
221847e37c4428509524ee576920a98381f3e4872493Nick Pelly       break;
221947e37c4428509524ee576920a98381f3e4872493Nick Pelly      case MSG_ID_OUTPUT_FRAME_DONE:
222047e37c4428509524ee576920a98381f3e4872493Nick Pelly         D("================ writing frame %d = %d bytes to output file",
222147e37c4428509524ee576920a98381f3e4872493Nick Pelly           m_nFrameOut+1,
222247e37c4428509524ee576920a98381f3e4872493Nick Pelly           msg.data.sBitstreamData.pBuffer->nFilledLen);
222347e37c4428509524ee576920a98381f3e4872493Nick Pelly         D("StopEncodeTime=%lld", GetTimeStamp());
222447e37c4428509524ee576920a98381f3e4872493Nick Pelly
222547e37c4428509524ee576920a98381f3e4872493Nick Pelly
222647e37c4428509524ee576920a98381f3e4872493Nick Pelly		 write(m_nOutFd,
222747e37c4428509524ee576920a98381f3e4872493Nick Pelly               msg.data.sBitstreamData.pBuffer->pBuffer,
222847e37c4428509524ee576920a98381f3e4872493Nick Pelly               msg.data.sBitstreamData.pBuffer->nFilledLen);
222947e37c4428509524ee576920a98381f3e4872493Nick Pelly
223047e37c4428509524ee576920a98381f3e4872493Nick Pelly
223147e37c4428509524ee576920a98381f3e4872493Nick Pelly         result = OMX_FillThisBuffer(m_hHandle,
223247e37c4428509524ee576920a98381f3e4872493Nick Pelly                                     msg.data.sBitstreamData.pBuffer);
223347e37c4428509524ee576920a98381f3e4872493Nick Pelly
223447e37c4428509524ee576920a98381f3e4872493Nick Pelly         if (result != OMX_ErrorNone)
223547e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
223647e37c4428509524ee576920a98381f3e4872493Nick Pelly            CHK(result);
223747e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
223847e37c4428509524ee576920a98381f3e4872493Nick Pelly
223947e37c4428509524ee576920a98381f3e4872493Nick Pelly         pthread_mutex_lock(&m_mutex);
224047e37c4428509524ee576920a98381f3e4872493Nick Pelly         ++m_nFrameOut;
224147e37c4428509524ee576920a98381f3e4872493Nick Pelly         if (m_nFrameOut == m_nFramePlay && m_nFramePlay != 0)
224247e37c4428509524ee576920a98381f3e4872493Nick Pelly         {
224347e37c4428509524ee576920a98381f3e4872493Nick Pelly            bQuit = true;
224447e37c4428509524ee576920a98381f3e4872493Nick Pelly         }
224547e37c4428509524ee576920a98381f3e4872493Nick Pelly         pthread_mutex_unlock(&m_mutex);
224647e37c4428509524ee576920a98381f3e4872493Nick Pelly         break;
224747e37c4428509524ee576920a98381f3e4872493Nick Pelly
224847e37c4428509524ee576920a98381f3e4872493Nick Pelly      default:
224947e37c4428509524ee576920a98381f3e4872493Nick Pelly         E("invalid msg id %d", (int) msg.id);
225047e37c4428509524ee576920a98381f3e4872493Nick Pelly      } // end switch (msg.id)
2251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*  // TO UNCOMMENT FOR PAUSE TESTINGS
2253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(m_nFrameOut == 10)
2254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         E("\nGoing to Pause state\n");
2256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         SetState(OMX_StatePause);
2257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         sleep(3);
2258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//REQUEST AN I FRAME AFTER PAUSE
2259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         OMX_CONFIG_INTRAREFRESHVOPTYPE voprefresh;
2260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         voprefresh.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
2261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         voprefresh.IntraRefreshVOP = OMX_TRUE;
2262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         result = OMX_SetConfig(m_hHandle,
2263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   OMX_IndexConfigVideoIntraVOPRefresh,
2264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   &voprefresh);
2265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         E("\n OMX_IndexConfigVideoIntraVOPRefresh Set Paramter port");
2266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         CHK(result);
2267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         E("\nGoing to executing state\n");
2268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         SetState(OMX_StateExecuting);
2269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*/
227147e37c4428509524ee576920a98381f3e4872493Nick Pelly   } // end while (!bQuit)
227247e37c4428509524ee576920a98381f3e4872493Nick Pelly
227347e37c4428509524ee576920a98381f3e4872493Nick Pelly
227447e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode == MODE_LIVE_ENCODE)
227547e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
227647e37c4428509524ee576920a98381f3e4872493Nick Pelly      CameraTest_Exit();
227747e37c4428509524ee576920a98381f3e4872493Nick Pelly      close(m_nOutFd);
227847e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
227947e37c4428509524ee576920a98381f3e4872493Nick Pelly   else if (m_eMode == MODE_FILE_ENCODE ||
228047e37c4428509524ee576920a98381f3e4872493Nick Pelly            m_eMode == MODE_PROFILE)
228147e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
228247e37c4428509524ee576920a98381f3e4872493Nick Pelly      // deallocate pmem buffers
228347e37c4428509524ee576920a98381f3e4872493Nick Pelly      for (int i = 0; i < num_in_buffers; i++)
228447e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
228547e37c4428509524ee576920a98381f3e4872493Nick Pelly         PmemFree((OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*)m_pInBuffers[i]->pAppPrivate,
228647e37c4428509524ee576920a98381f3e4872493Nick Pelly                  m_pInBuffers[i]->pBuffer,
228747e37c4428509524ee576920a98381f3e4872493Nick Pelly                  m_sProfile.nFrameBytes);
228847e37c4428509524ee576920a98381f3e4872493Nick Pelly         delete (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*) m_pInBuffers[i]->pAppPrivate;
228947e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
229047e37c4428509524ee576920a98381f3e4872493Nick Pelly      close(m_nInFd);
229147e37c4428509524ee576920a98381f3e4872493Nick Pelly
229247e37c4428509524ee576920a98381f3e4872493Nick Pelly      if (m_eMode == MODE_FILE_ENCODE)
229347e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
229447e37c4428509524ee576920a98381f3e4872493Nick Pelly         close(m_nOutFd);
229547e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
2296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (m_pDynConfFile)
2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fclose(m_pDynConfFile);
2299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_pDynConfFile = NULL;
2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
230147e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
230247e37c4428509524ee576920a98381f3e4872493Nick Pelly
230347e37c4428509524ee576920a98381f3e4872493Nick Pelly   if (m_eMode != MODE_PREVIEW)
230447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
230547e37c4428509524ee576920a98381f3e4872493Nick Pelly      D("exit encoder test");
230647e37c4428509524ee576920a98381f3e4872493Nick Pelly      VencTest_Exit();
230747e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
230847e37c4428509524ee576920a98381f3e4872493Nick Pelly
230947e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_mutex_destroy(&m_mutex);
231047e37c4428509524ee576920a98381f3e4872493Nick Pelly   pthread_cond_destroy(&m_signal);
231147e37c4428509524ee576920a98381f3e4872493Nick Pelly
231247e37c4428509524ee576920a98381f3e4872493Nick Pelly   /* Time Statistics Logging */
231347e37c4428509524ee576920a98381f3e4872493Nick Pelly   if(0 != m_sProfile.nFramerate)
231447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
231547e37c4428509524ee576920a98381f3e4872493Nick Pelly      enc_time_usec = m_nTimeStamp - (1000000 / m_sProfile.nFramerate);
231647e37c4428509524ee576920a98381f3e4872493Nick Pelly      enc_time_sec =enc_time_usec/1000000;
231747e37c4428509524ee576920a98381f3e4872493Nick Pelly      if(0 != enc_time_sec)
231847e37c4428509524ee576920a98381f3e4872493Nick Pelly      {
231947e37c4428509524ee576920a98381f3e4872493Nick Pelly         printf("Total Frame Rate: %f",ebd_cnt/enc_time_sec);
232047e37c4428509524ee576920a98381f3e4872493Nick Pelly         printf("\nEncoder Bitrate :%lf Kbps",(tot_bufsize*8)/(enc_time_sec*1000));
232147e37c4428509524ee576920a98381f3e4872493Nick Pelly      }
232247e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
232347e37c4428509524ee576920a98381f3e4872493Nick Pelly   else
232447e37c4428509524ee576920a98381f3e4872493Nick Pelly   {
232547e37c4428509524ee576920a98381f3e4872493Nick Pelly      printf("\n\n Encode Time is zero");
232647e37c4428509524ee576920a98381f3e4872493Nick Pelly   }
232747e37c4428509524ee576920a98381f3e4872493Nick Pelly   printf("\nTotal Number of Frames :%d",ebd_cnt);
232847e37c4428509524ee576920a98381f3e4872493Nick Pelly   printf("\nNumber of dropped frames during encoding:%d\n",ebd_cnt-fbd_cnt);
232947e37c4428509524ee576920a98381f3e4872493Nick Pelly   /* End of Time Statistics Logging */
233047e37c4428509524ee576920a98381f3e4872493Nick Pelly
233147e37c4428509524ee576920a98381f3e4872493Nick Pelly   D("main has exited");
233247e37c4428509524ee576920a98381f3e4872493Nick Pelly   return 0;
233347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
2334