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