1dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/*--------------------------------------------------------------------------
2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
3dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
4dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRedistribution and use in source and binary forms, with or without
5dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandmodification, are permitted provided that the following conditions are met:
6dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Redistributions of source code must retain the above copyright
7dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      notice, this list of conditions and the following disclaimer.
8dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Redistributions in binary form must reproduce the above copyright
9dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      notice, this list of conditions and the following disclaimer in the
10dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      documentation and/or other materials provided with the distribution.
11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Neither the name of Code Aurora nor
12dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      the names of its contributors may be used to endorse or promote
13dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      products derived from this software without specific prior written
14dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      permission.
15dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
16dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand--------------------------------------------------------------------------*/
28dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "video_encoder_test.h"
29dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
30dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define DEBUG_PRINT printf
31dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/************************************************************************/
32dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/*        #DEFINES                          */
33dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/************************************************************************/
34dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
35dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define VOP_START_CODE 0x000001B6
36dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define SHORT_HEADER_START_CODE 0x00008000
37dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define H264_START_CODE         0x00000001
38dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
39dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/************************************************************************/
40dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/*        STATIC VARIABLES                          */
41dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/************************************************************************/
42dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
43dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic int Code_type;
44dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic int total_frames = 0;
45dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic unsigned int header_code = 0;
46dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic pthread_mutex_t read_lock;
47dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
48dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic unsigned int read_frame ( unsigned char *dataptr,unsigned int length,
49dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                 FILE * inputBufferFile
50dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                );
51dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic unsigned clp2(unsigned x)
52dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
53dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        x = x - 1;
54dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        x = x | (x >> 1);
55dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        x = x | (x >> 2);
56dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        x = x | (x >> 4);
57dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        x = x | (x >> 8);
58dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        x = x | (x >>16);
59dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return x + 1;
60dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
61dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
62dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
63dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic void* video_thread (void *);
64dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic void* async_thread (void *);
65dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
66dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
67dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
68dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandint main (int argc, char **argv)
69dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
70dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct video_encoder_context *encoder_context = NULL;
71dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  char *file_name = NULL;
72dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  FILE *file_ptr = NULL;
73dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int temp1 =0,temp2 =0;
74dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int error = 1;
75dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int i = 0;
76dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
77dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  file_name = argv [1];
78dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  file_ptr = fopen (file_name,"rb");
79dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
80dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (file_ptr == NULL)
81dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
82dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n File is not located ");
83dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
84dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
85dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
86dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
87dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context = (struct video_encoder_context *) \
88dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                   calloc (sizeof (struct video_encoder_context),1);
89dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (encoder_context == NULL)
90dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
91dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
92dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
93dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->outputBufferFile = NULL;
94dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->inputBufferFile = NULL;
95dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->video_driver_fd = -1;
96dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->inputBufferFile = file_ptr;
97dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->input_width = 176;
98dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->input_height = 144;
99dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->codectype = VEN_CODEC_MPEG4;
100dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->fps_num = 60;
101dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->fps_den = 2;
102dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->inputformat = VEN_INPUTFMT_NV12;
103dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->targetbitrate = 128000;
104dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
105dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  file_ptr = fopen ("/data/output.m4v","wb");
106dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (file_ptr == NULL)
107dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
108dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n File can't be created");
109dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    free (encoder_context);
110dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
111dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
112dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context->outputBufferFile = file_ptr;
113dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
114dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   switch (atoi(argv[2]))
115dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
116dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   case 0:
117dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n MPEG4 codec selected");
118dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     encoder_context->codectype = VEN_CODEC_MPEG4;
119dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     Code_type = 0;
120dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     break;
121dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   case 1:
122dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n H.263");
123dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     encoder_context->codectype = VEN_CODEC_H263;
124dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     Code_type = 0;
125dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     break;
126dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   case 2:
127dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n H.264");
128dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     encoder_context->codectype = VEN_CODEC_H264;
129dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     Code_type = 1;
130dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     break;
131dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   default:
132dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n Wrong codec type");
133dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     error = -1;
134dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     break;
135dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
136dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
137dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (error != -1)
138dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
139dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     temp1 = atoi(argv[3]);
140dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     temp2 = atoi(argv[4]);
141dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
142dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     if (((temp1%16) != 0) || ((temp2%16) != 0))
143dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     {
144dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       error = -1;
145dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     }
146dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     else
147dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     {
148dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      encoder_context->input_width = temp1;
149dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      encoder_context->input_height = temp2;
150dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     }
151dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
152dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
153dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   switch (atoi(argv[5]))
154dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
155dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   case 0:
156dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n No Sink");
157dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     encoder_context->outputBufferFile = NULL;
158dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     break;
159dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
160dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
161dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (error != -1)
162dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
163dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     encoder_context->targetbitrate = atoi (argv[6]);
164dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
165dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
166dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if ( error != -1 && (init_encoder (encoder_context) == -1 ))
167dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
168dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("\n Init decoder fails ");
169dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      error = -1;
170dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
171dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   DEBUG_PRINT("\n Decoder open successfull");
172dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
173dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
174dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   /*Allocate input and output buffers*/
175dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (error != -1 && (allocate_buffer (0,encoder_context)== -1))
176dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
177dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n Error in input Buffer allocation");
178dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     error = -1;
179dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
180dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
181dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (error != -1 && (allocate_buffer (1,encoder_context)== -1))
182dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
183dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n Error in output Buffer allocation");
184dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     error = -1;
185dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
186dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
187dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
188dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (error != -1 && (start_encoding (encoder_context) == -1))
189dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
190dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n Error in start decoding call");
191dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     error = -1;
192dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
193dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
194dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (error != -1 && (stop_encoding (encoder_context) == -1))
195dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
196dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n Error in stop decoding call");
197dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     error = -1;
198dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
199dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
200dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   DEBUG_PRINT("\n De-init the decoder");
201dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if ((deinit_encoder (encoder_context) == -1))
202dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
203dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      error = -1;
204dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
205dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
206dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
207dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  (void)free_buffer (INPUT_BUFFER,encoder_context);
208dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  (void)free_buffer (OUTPUT_BUFFER,encoder_context);
209dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
210dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (encoder_context->inputBufferFile != NULL)
211dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
212dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   fclose (encoder_context->inputBufferFile);
213dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
214dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (encoder_context->outputBufferFile != NULL)
215dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
216dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    fclose (encoder_context->outputBufferFile);
217dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
218dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT ("\n Total Number of frames decoded %d",total_frames);
219dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n closing the driver");
220dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  free (encoder_context);
221dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
222dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return error;
223dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
224dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
225dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandint init_encoder ( struct video_encoder_context *init_decode )
226dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
227dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
228dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_basecfg basecfg;
229dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct video_queue_context *queue_ptr = NULL;
230dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_ratectrlcfg ratecrl;
231dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_mutexattr_t init_values;
232dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_profile profile;
233dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct ven_profilelevel profilelevel;
234dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
235dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n Before calling the open");
236dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
237dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  init_decode->video_driver_fd = open ("/dev/msm_vidc_enc", \
238dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     O_RDWR | O_NONBLOCK);
239dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
240dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
241dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
242dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (init_decode->video_driver_fd < 0)
243dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
244dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Open failed");
245dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
246dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
247dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
248dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  basecfg.codectype = init_decode->codectype;
249dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  basecfg.dvs_height = 0;
250dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  basecfg.dvs_width = 0;
251dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  basecfg.fps_den = init_decode->fps_den;
252dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  basecfg.fps_num = init_decode->fps_num;
253dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  basecfg.input_height = init_decode->input_height;
254dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  basecfg.input_width = init_decode->input_width;
255dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  basecfg.inputformat = init_decode->inputformat;
256dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  basecfg.targetbitrate = init_decode->targetbitrate;
257dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
258dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Initialize Decoder with codec type and resolution*/
259dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.in = &basecfg;
260dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.out = NULL;
261dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
262dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_BASE_CFG,
263dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         (void*)&ioctl_msg) < 0)
264dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
265dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Set base config type failed");
266dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
267dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
268dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
269dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Initialize Decoder with codec type and resolution*/
270dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT ("\n Switch off rate control");
271dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.in = &ratecrl;
272dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.out = NULL;
273dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ratecrl.rcmode = VEN_RC_OFF;
274dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,
275dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         (void*)&ioctl_msg) < 0)
276dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
277dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Set rate control failed");
278dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
279dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
280dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
281dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (basecfg.codectype == VEN_CODEC_H264)
282dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
283dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
284dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.in = &profile;
285dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.out = NULL;
286dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    profile.profile = VEN_PROFILE_H264_BASELINE;
287dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE,
288dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           (void*)&ioctl_msg) < 0)
289dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
290dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
291dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
292dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
293dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
294dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
295dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.in = &profilelevel;
296dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.out = NULL;
297dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    profilelevel.level = VEN_LEVEL_H264_1p1;
298dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,
299dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           (void*)&ioctl_msg) < 0)
300dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
301dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
302dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
303dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
304dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
305dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (basecfg.input_width > 720)
306dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
307dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
308dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ioctl_msg.in = &profile;
309dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ioctl_msg.out = NULL;
310dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      profile.profile = VEN_PROFILE_H264_HIGH;
311dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE,
312dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             (void*)&ioctl_msg) < 0)
313dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
314dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
315dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return -1;
316dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
317dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
318dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
319dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ioctl_msg.in = &profilelevel;
320dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ioctl_msg.out = NULL;
321dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      profilelevel.level = VEN_LEVEL_H264_3p1;
322dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,
323dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand             (void*)&ioctl_msg) < 0)
324dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
325dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed");
326dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return -1;
327dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
328dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
329dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
330dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
331dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n Query Input bufffer requirements");
332dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Get the Buffer requirements for input and output ports*/
333dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
334dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
335dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
336dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.in = NULL;
337dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.out = &init_decode->input_buffer;
338dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
339dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,
340dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         (void*)&ioctl_msg) < 0)
341dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
342dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Requesting for input buffer requirements failed");
343dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
344dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
345dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
346dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n input Size=%d min count =%d actual count = %d", \
347dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              (int)init_decode->input_buffer.datasize,\
348dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              (int)init_decode->input_buffer.mincount,\
349dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              (int)init_decode->input_buffer.actualcount);
350dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
351dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
352dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.in = &init_decode->input_buffer;
353dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.out = NULL;
354dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  init_decode->input_buffer.actualcount = init_decode->input_buffer.mincount + 2;
355dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
356dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,
357dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         (void*)&ioctl_msg) < 0)
358dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
359dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Set Buffer Requirements Failed");
360dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
361dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
362dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
363dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
364dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n Query output bufffer requirements");
365dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.in = NULL;
366dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.out = &init_decode->output_buffer;
367dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
368dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,
369dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         (void*)&ioctl_msg) < 0)
370dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
371dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Requesting for output buffer requirements failed");
372dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
373dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
374dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
375dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n output Size=%d min count =%d actual count = %d", \
376dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              (int)init_decode->output_buffer.datasize,\
377dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              (int)init_decode->output_buffer.mincount,\
378dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              (int)init_decode->output_buffer.actualcount);
379dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
380dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Create Queue related data structures*/
381dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  queue_ptr = &init_decode->queue_context;
382dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  queue_ptr->commandq_size = 50;
383dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  queue_ptr->dataq_size = 50;
384dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
385dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  sem_init(&queue_ptr->sem_message,0, 0);
386dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  sem_init(&init_decode->sem_synchronize,0, 0);
387dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
388dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_mutexattr_init (&init_values);
389dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_mutex_init (&queue_ptr->mutex,&init_values);
390dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_mutex_init (&read_lock,&init_values);
391dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n create Queues");
392dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  queue_ptr->ptr_cmdq = (struct video_msgq*) \
393dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        calloc (sizeof (struct video_msgq),
394dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  queue_ptr->commandq_size);
395dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  queue_ptr->ptr_dataq = (struct video_msgq*) \
396dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              calloc (sizeof (struct video_msgq),
397dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  queue_ptr->dataq_size
398dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  );
399dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
400dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if ( queue_ptr->ptr_cmdq == NULL ||
401dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     queue_ptr->ptr_dataq == NULL
402dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    )
403dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
404dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
405dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
406dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n create Threads");
407dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Create two threads*/
408dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if ( (pthread_create (&init_decode->videothread_id,NULL,video_thread,
409dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            init_decode) < 0) ||
410dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         (pthread_create (&init_decode->asyncthread_id,NULL,async_thread,
411dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            init_decode) < 0)
412dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    )
413dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
414dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
415dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
416dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
417dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return 1;
418dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
419dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
420dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
421dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
422dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandint free_buffer ( unsigned int  buffer_dir,
423dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  struct video_encoder_context *encoder_context
424dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                 )
425dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
426dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int buffercount = 0,i=0;
427dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_bufferpayload **ptemp = NULL;
428dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
429dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (encoder_context == NULL)
430dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
431dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
432dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
433dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
434dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (buffer_dir == INPUT_BUFFER && encoder_context->ptr_inputbuffer)
435dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
436dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      buffercount = encoder_context->input_buffer.actualcount;
437dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ptemp = encoder_context->ptr_inputbuffer;
438dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
439dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    for (i=0;i<buffercount;i++)
440dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
441dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (ptemp [i])
442dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
443dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (ptemp [i]->fd != -1)
444dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
445dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          munmap ( ptemp [i]->pbuffer,ptemp [i]->maped_size);
446dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          ptemp [i]->pbuffer = NULL;
447dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          close (ptemp [i]->fd);
448dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
449dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        free (ptemp [i]);
450dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        ptemp [i] = NULL;
451dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
452dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
453dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    free (encoder_context->ptr_inputbuffer);
454dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    encoder_context->ptr_inputbuffer = NULL;
455dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
456dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else if ( buffer_dir == OUTPUT_BUFFER && encoder_context->ptr_outputbuffer )
457dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
458dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    buffercount = encoder_context->output_buffer.actualcount;
459dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ptemp = encoder_context->ptr_outputbuffer;
460dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
461dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (ptemp)
462dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
463dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      for (i=0;i<buffercount;i++)
464dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
465dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (ptemp [i])
466dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
467dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if (ptemp [i]->fd != -1)
468dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
469dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            munmap ( ptemp [i]->pbuffer,ptemp [i]->maped_size);
470dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            ptemp [i]->pbuffer = NULL;
471dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            close (ptemp [i]->fd);
472dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
473dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          free (ptemp [i]);
474dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          ptemp [i] = NULL;
475dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
476dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
477dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      free (ptemp);
478dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      encoder_context->ptr_outputbuffer = NULL;
479dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
480dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
481dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
482dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return 1;
483dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
484dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
485dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandint allocate_buffer ( unsigned int buffer_dir,
486dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      struct video_encoder_context *encoder_context
487dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                    )
488dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
489dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_bufferpayload **ptemp = NULL;
490dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
491dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int buffercount = 0,i=0,alignedsize=0;
492dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int buffersize = 0;
493dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
494dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if ( encoder_context == NULL)
495dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
496dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\nallocate_buffer: context is NULL");
497dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
498dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
499dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
500dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if ( buffer_dir == INPUT_BUFFER )
501dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
502dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        /*Check if buffers are allocated*/
503dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (encoder_context->ptr_inputbuffer != NULL)
504dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
505dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT ("\nallocate_buffer: encoder_context->ptr_inputbuffer is set");
506dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
507dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
508dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
509dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    buffercount = encoder_context->input_buffer.actualcount;
510dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    alignedsize = encoder_context->input_buffer.alignment;
511dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    buffersize = encoder_context->input_buffer.datasize;
512dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    buffersize = (buffersize + alignedsize) & (~alignedsize);
513dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
514dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else if (buffer_dir == OUTPUT_BUFFER)
515dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
516dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    /*Check if buffers are allocated*/
517dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (encoder_context->ptr_outputbuffer != NULL)
518dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
519dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT ("\nallocate_buffer: Double allcoate output");
520dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
521dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
522dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
523dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    buffercount = encoder_context->output_buffer.actualcount;
524dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    alignedsize = encoder_context->output_buffer.alignment;
525dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    buffersize = encoder_context->output_buffer.datasize;
526dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    buffersize = (buffersize + alignedsize) & (~alignedsize);
527dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
528dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
529dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
530dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
531dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\nallocate_buffer: Wrong buffer directions");
532dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
533dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
534dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
535dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ptemp = (struct venc_bufferpayload **)\
536dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  calloc (sizeof (struct venc_bufferpayload *),buffercount);
537dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
538dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ptemp == NULL)
539dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
540dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\nallocate_buffer: venc_bufferpayload failure");
541dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
542dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
543dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
544dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
545dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (buffer_dir == OUTPUT_BUFFER)
546dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
547dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\nallocate_buffer: OUT");
548dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    encoder_context->ptr_outputbuffer = ptemp;
549dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
550dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
551dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
552dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\nallocate_buffer: IN");
553dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    encoder_context->ptr_inputbuffer = ptemp;
554dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
555dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
556dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Allocate buffer headers*/
557dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for (i=0; i< buffercount; i++)
558dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
559dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ptemp [i] = (struct venc_bufferpayload*)\
560dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    calloc (sizeof (struct venc_bufferpayload),1);
561dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
562dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (ptemp [i] == NULL)
563dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
564dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT ("\nallocate_buffer: ptemp [i] calloc failure");
565dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
566dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
567dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ptemp [i]->fd = -1;
568dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
569dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
570dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for (i=0; i< buffercount; i++)
571dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
572dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ptemp [i]->fd = open ("/dev/pmem_adsp",O_RDWR);
573dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
574dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (ptemp [i]->fd < 0)
575dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
576dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT ("\nallocate_buffer: open pmem_adsp failed");
577dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
578dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
579dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
580dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ptemp [i]->pbuffer = mmap(NULL,clp2(buffersize),PROT_READ|PROT_WRITE,
581dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                 MAP_SHARED,ptemp [i]->fd,0);
582dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\n pmem fd = %d virt addr = %p",ptemp [i]->fd,\
583dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                  ptemp [i]->pbuffer);
584dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (ptemp [i]->pbuffer == MAP_FAILED)
585dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
586dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      ptemp [i]->pbuffer = NULL;
587dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT ("\nallocate_buffer: MMAP failed");
588dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
589dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
590dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ptemp [i]->sz = buffersize;
591dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ptemp [i]->maped_size = clp2 (buffersize);
592dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
593dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.in  = ptemp [i];
594dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.out = NULL;
595dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
596dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (buffer_dir == OUTPUT_BUFFER)
597dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
598dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,
599dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           &ioctl_msg) < 0)
600dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
601dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT ("\nallocate_buffer: Set Output Buffer IOCTL failed");
602dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return -1;
603dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
604dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
605dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
606dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
607dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_SET_INPUT_BUFFER,
608dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           &ioctl_msg) < 0)
609dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
610dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT ("\nallocate_buffer: Set input Buffer IOCTL failed");
611dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return -1;
612dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
613dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
614dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
615dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
616dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT ("\nallocate_buffer: Success");
617dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return 1;
618dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
619dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
620dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
621dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
622dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandint start_encoding (struct video_encoder_context *encoder_context)
623dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
624dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
625dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_buffer enc_buffer;
626dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int i = 0;
627dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int data_len =0;
628dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
629dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
630dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (encoder_context == NULL)
631dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
632dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
633dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
634dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
635dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_CMD_START,
636dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         NULL) < 0)
637dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
638dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Start failed");
639dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
640dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
641dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
642dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n Start Issued successfully waiting for Start Done");
643dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Wait for Start command response*/
644dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  sem_wait (&encoder_context->sem_synchronize);
645dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
646dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Push output Buffers*/
647dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  i = 0;
648dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  while (i < encoder_context->output_buffer.actualcount)
649dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
650dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.clientdata = (void *)encoder_context->ptr_outputbuffer [i];
651dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.flags = 0;
652dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.sz = encoder_context->ptr_outputbuffer [i]->sz;
653dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.len = 0;
654dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.ptrbuffer = encoder_context->ptr_outputbuffer [i]->pbuffer;
655dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.offset = 0;
656dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.timestamp = 0;
657dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
658dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata);
659dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.in = &enc_buffer;
660dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.out = NULL;
661dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
662dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (ioctl (encoder_context->video_driver_fd,
663dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
664dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
665dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("\n fill output frame failed");
666dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
667dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
668dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    i++;
669dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
670dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
671dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
672dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*push input buffers*/
673dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  i = 0;
674dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  while (i < encoder_context->input_buffer.actualcount)
675dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
676dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Read  Frame from File");
677dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
678dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.clientdata = (void *)encoder_context->ptr_inputbuffer [i];
679dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.flags = 0;
680dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.sz = encoder_context->ptr_inputbuffer [i]->sz;
681dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.len = 0;
682dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.ptrbuffer = encoder_context->ptr_inputbuffer [i]->pbuffer;
683dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.offset = 0;
684dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.timestamp = total_frames *
685dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                ((encoder_context->fps_den * 1000000)/encoder_context->fps_num);
686dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.len = (encoder_context->input_height *
687dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     encoder_context->input_width *3)/2;
688dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    data_len = read_frame ( enc_buffer.ptrbuffer,
689dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                            enc_buffer.len,
690dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                            encoder_context->inputBufferFile);
691dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (data_len == 0)
692dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
693dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("\n Length is zero error");
694dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
695dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
696dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    enc_buffer.len = data_len;
697dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Read  Frame from File szie = %d",(int)data_len);
698dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
699dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata);
700dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.in = &enc_buffer;
701dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.out = NULL;
702dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
703dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (ioctl (encoder_context->video_driver_fd,
704dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < 0)
705dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
706dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("\n Encode input frame failed");
707dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
708dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
709dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    total_frames++;
710dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    i++;
711dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
712dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT ("\n Wait for EOS");
713dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Wait for EOS or Error condition*/
714dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  sem_wait (&encoder_context->sem_synchronize);
715dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT ("\n Reached EOS");
716dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
717dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return 1;
718dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
719dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
720dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandint stop_encoding  (struct video_encoder_context *encoder_context)
721dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
722dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
723dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_bufferflush buffer_flush;
724dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
725dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (encoder_context == NULL)
726dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
727dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
728dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
729dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  buffer_flush.flush_mode = VEN_FLUSH_INPUT;
730dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.in = &buffer_flush;
731dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.out = NULL;
732dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
733dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH,
734dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         &ioctl_msg) < 0)
735dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
736dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Flush input failed");
737dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
738dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
739dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
740dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       sem_wait (&encoder_context->sem_synchronize);
741dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
742dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
743dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  buffer_flush.flush_mode = VEN_FLUSH_OUTPUT;
744dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.in = &buffer_flush;
745dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ioctl_msg.out = NULL;
746dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
747dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH,
748dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            &ioctl_msg) < 0)
749dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
750dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Flush output failed");
751dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
752dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
753dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
754dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     sem_wait (&encoder_context->sem_synchronize);
755dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
756dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
757dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n Stop VEN_IOCTL_CMD_STOP");
758dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_STOP,NULL) < 0)
759dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
760dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Stop failed");
761dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
762dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
763dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
764dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     sem_wait (&encoder_context->sem_synchronize);
765dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
766dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return 1;
767dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
768dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
769dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandint deinit_encoder (struct video_encoder_context *init_decode)
770dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
771dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (init_decode == NULL)
772dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
773dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
774dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
775dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
776dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  /*Close the driver*/
777dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (init_decode->video_driver_fd != -1)
778dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
779dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    close (init_decode->video_driver_fd);
780dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
781dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
782dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (init_decode->queue_context.ptr_cmdq)
783dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
784dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    free (init_decode->queue_context.ptr_cmdq);
785dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    init_decode->queue_context.ptr_cmdq = NULL;
786dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
787dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
788dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (init_decode->queue_context.ptr_dataq)
789dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
790dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    free (init_decode->queue_context.ptr_dataq);
791dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    init_decode->queue_context.ptr_dataq = NULL;
792dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
793dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
794dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  sem_destroy (&init_decode->queue_context.sem_message);
795dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  sem_destroy (&init_decode->sem_synchronize);
796dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
797dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_mutex_destroy(&init_decode->queue_context.mutex);
798dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_mutex_destroy (&read_lock);
799dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
800dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return 1;
801dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
802dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
803dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic void* video_thread (void *context)
804dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
805dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   struct video_encoder_context *encoder_context = NULL;
806dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   struct video_msgq *queueitem = NULL;
807dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
808dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   struct venc_bufferpayload *tempbuffer = NULL;
809dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   struct venc_buffer enc_buffer;
810dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   unsigned int data_len =0;
811dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
812dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
813dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (context == NULL)
814dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
815dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT("\n video thread recieved NULL context");
816dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     return NULL;
817dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
818dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   encoder_context = (struct video_encoder_context *) context;
819dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
820dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   /* Thread function which will accept commands from async thread
821dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * or main thread
822dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   */
823dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   while (1)
824dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
825dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      queueitem = queue_get_cmd (&encoder_context ->queue_context);
826dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (queueitem != NULL)
827dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
828dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        switch (queueitem->cmd)
829dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
830dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case VEN_MSG_START:
831dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("\n recived start done command");
832dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            sem_post (&encoder_context->sem_synchronize);
833dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          break;
834dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
835dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case VEN_MSG_STOP:
836dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("\n recieved stop done");
837dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          sem_post (&encoder_context->sem_synchronize);
838dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          break;
839dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
840dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case VEN_MSG_INPUT_BUFFER_DONE:
841dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
842dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          tempbuffer = (struct venc_bufferpayload *)queueitem->clientdata;
843dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if (tempbuffer == NULL)
844dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
845dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT("\n FATAL ERROR input buffer address is bad");
846dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            sem_post (&encoder_context->sem_synchronize);
847dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            break;
848dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
849dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          tempbuffer->filled_len = (encoder_context->input_height *
850dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                             encoder_context->input_width *3)/2;
851dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
852dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          data_len = read_frame ( tempbuffer->pbuffer,
853dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                  tempbuffer->filled_len,
854dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                  encoder_context->inputBufferFile);
855dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
856dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if (data_len == 0)
857dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
858dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT ("\n End of stream reached");
859dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            sem_post (&encoder_context->sem_synchronize);
860dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            break;
861dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
862dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          enc_buffer.clientdata = (void *)tempbuffer;
863dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          enc_buffer.flags = 0;
864dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          enc_buffer.ptrbuffer = tempbuffer->pbuffer;
865dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          enc_buffer.sz = tempbuffer->sz;
866dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          enc_buffer.len = tempbuffer->filled_len;
867dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          enc_buffer.offset = 0;
868dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          enc_buffer.timestamp = total_frames *
869dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                ((encoder_context->fps_den * 1000000)/encoder_context->fps_num);
870dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
871dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          /*TODO: Time stamp needs to be updated*/
872dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          ioctl_msg.in = &enc_buffer;
873dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          ioctl_msg.out = NULL;
874dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          total_frames++;
875dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,
876dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               &ioctl_msg) < 0)
877dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
878dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT("\n Decoder frame failed");
879dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            sem_post (&encoder_context->sem_synchronize);
880dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
881dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("\n Input buffer done send next buffer current value = %d",\
882dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      total_frames);
883dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          break;
884dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
885dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case VEN_MSG_OUTPUT_BUFFER_DONE:
886dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
887dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          tempbuffer = (struct venc_bufferpayload *)queueitem->clientdata;
888dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if (tempbuffer == NULL)
889dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
890dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT("\n FATAL ERROR input buffer address is bad");
891dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            sem_post (&encoder_context->sem_synchronize);
892dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            break;
893dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
894dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
895dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         if (encoder_context->outputBufferFile != NULL)
896dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         {
897dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           fwrite (tempbuffer->pbuffer,1,tempbuffer->filled_len,
898dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                encoder_context->outputBufferFile);
899dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         }
900dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
901dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
902dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         DEBUG_PRINT("\n recieved output buffer consume outbuffer");
903dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\
904dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     tempbuffer->pbuffer);
905dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         enc_buffer.clientdata = (void *)tempbuffer;
906dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         enc_buffer.flags = 0;
907dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         enc_buffer.sz = tempbuffer->sz;
908dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         enc_buffer.len = 0;
909dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         enc_buffer.ptrbuffer = tempbuffer->pbuffer;
910dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         enc_buffer.offset = 0;
911dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         enc_buffer.timestamp = 0;
912dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
913dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         ioctl_msg.in = &enc_buffer;
914dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         ioctl_msg.out = NULL;
915dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
916dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         if (ioctl (encoder_context->video_driver_fd,
917dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
918dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         {
919dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           DEBUG_PRINT("\n Decoder frame failed");
920dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           return NULL;
921dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         }
922dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
923dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         break;
924dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
925dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case VEN_MSG_FLUSH_INPUT_DONE:
926dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("\n Flush input complete");
927dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          sem_post (&encoder_context->sem_synchronize);
928dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          break;
929dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
930dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        case VEN_MSG_FLUSH_OUPUT_DONE:
931dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("\n Flush output complete");
932dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          sem_post (&encoder_context->sem_synchronize);
933dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          break;
934dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
935dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
936dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (queueitem->cmd == VEN_MSG_STOP)
937dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
938dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT("\n Playback has ended thread will exit");
939dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          return NULL;
940dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
941dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
942dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      else
943dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
944dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\n Error condition recieved NULL from Queue");
945dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
946dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
947dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
948dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
949dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
950dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic void* async_thread (void *context)
951dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
952dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct video_encoder_context *encoder_context = NULL;
953dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct video_msgq queueitem ;
954dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_msg venc_msg;
955dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_bufferpayload *tempbuffer = NULL;
956dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
957dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int result = -1;
958dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
959dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (context == NULL)
960dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
961dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n aynsc thread recieved NULL context");
962dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return NULL;
963dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
964dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  encoder_context = (struct video_encoder_context *) context;
965dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT("\n Entering the async thread");
966dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
967dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  while (1)
968dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
969dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.in = NULL;
970dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    ioctl_msg.out = (void*)&venc_msg;
971dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\n Sizeof venc_msginfo = %d ",sizeof (venc_msg));
972dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT("\n Address of Venc msg in async thread %p",\
973dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                ioctl_msg.out);
974dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,\
975dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         (void*)&ioctl_msg) < 0)
976dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
977dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT("\n Error in ioctl read next msg");
978dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
979dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
980dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
981dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      switch (venc_msg.msgcode)
982dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
983dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      case VEN_MSG_START:
984dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      case VEN_MSG_STOP:
985dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      case VEN_MSG_INDICATION:
986dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\nSTOP/START Indiacation");
987dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.cmd = venc_msg.msgcode;
988dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.status = venc_msg.statuscode;
989dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.clientdata = NULL;
990dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        break;
991dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
992dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      case VEN_MSG_INPUT_BUFFER_DONE:
993dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\nINPUT buffer done Indiacation");
994dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.cmd = venc_msg.msgcode;
995dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.status = venc_msg.statuscode;
996dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.clientdata = (void *)venc_msg.buf.clientdata;
997dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\nInput Client data pointer is %p",queueitem.clientdata);
998dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        tempbuffer = (struct venc_bufferpayload *) queueitem.clientdata;
999dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT ("\n Input Address of tempbuffer %p",tempbuffer);
1000dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        tempbuffer->filled_len = venc_msg.buf.len;
1001dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT ("\n Input value of tempbuffer tempbuffer->filled_len %d",(int)tempbuffer->filled_len);
1002dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        break;
1003dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      case VEN_MSG_OUTPUT_BUFFER_DONE:
1004dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\nOUPUT buffer done Indiacation");
1005dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.cmd = venc_msg.msgcode;
1006dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.status = venc_msg.statuscode;
1007dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.clientdata = (void *)venc_msg.buf.clientdata;
1008dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\nOutput Client data pointer is %p",queueitem.clientdata);
1009dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        tempbuffer = (struct venc_bufferpayload *) queueitem.clientdata;
1010dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT ("\n Output Address of tempbuffer %p",tempbuffer);
1011dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        tempbuffer->filled_len = venc_msg.buf.len;
1012dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT ("\n Output value of tempbuffer tempbuffer->filled_len %d",(int)tempbuffer->filled_len);
1013dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        break;
1014dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1015dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      default:
1016dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\nIn Default of get next message %d",(int)venc_msg.msgcode);
1017dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.cmd = venc_msg.msgcode;
1018dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.status = venc_msg.statuscode;
1019dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        queueitem.clientdata = NULL;
1020dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        break;
1021dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
1022dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      result = queue_post_cmdq (&encoder_context->queue_context,&queueitem);
1023dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      while (result == 0)
1024dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
1025dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         result = queue_post_cmdq (&encoder_context->queue_context,&queueitem);
1026dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
1027dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1028dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (result == -1)
1029dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
1030dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT("\n FATAL ERROR WITH Queue");
1031dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
1032dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
1033dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if (venc_msg.msgcode == VEN_MSG_STOP)
1034dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
1035dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      /*Thread can exit at this point*/
1036dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return NULL;
1037dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
1038dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1039dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
1040dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1041dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1042dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandstatic unsigned int read_frame (unsigned char *dataptr, unsigned int length,
1043dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                FILE * inputBufferFile)
1044dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
1045dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1046dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int readOffset = 0;
1047dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int bytes_read = 0;
1048dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int code = 0;
1049dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int found = 0;
1050dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1051dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT ("\n Inside the readframe");
1052dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1053dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (dataptr == NULL && length == 0)
1054dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1055dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT ("\n dataptr = %p length = %d",dataptr,(int)length);
1056dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return 0;
1057dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1058dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1059dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_mutex_lock(&read_lock);
1060dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bytes_read = fread(&dataptr[readOffset],1,length,inputBufferFile);
1061dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_mutex_unlock(&read_lock);
1062dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1063dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return bytes_read;
1064dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
1065