161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/*-------------------------------------------------------------------------- 261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanCopyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved. 361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanRedistribution and use in source and binary forms, with or without 561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanmodification, are permitted provided that the following conditions are met: 661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * Redistributions of source code must retain the above copyright 761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan notice, this list of conditions and the following disclaimer. 861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * Redistributions in binary form must reproduce the above copyright 961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan notice, this list of conditions and the following disclaimer in the 1061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan documentation and/or other materials provided with the distribution. 1161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * Neither the name of The Linux Foundation nor 1261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the names of its contributors may be used to endorse or promote 1361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan products derived from this software without specific prior written 1461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan permission. 1561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1861a2c6a19dbd06a317a419623020e02056661876Praveen ChavanIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 1961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2061a2c6a19dbd06a317a419623020e02056661876Praveen ChavanCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2161a2c6a19dbd06a317a419623020e02056661876Praveen ChavanEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2361a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan--------------------------------------------------------------------------*/ 2861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include "video_encoder_test.h" 2961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define DEBUG_PRINT printf 3161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/************************************************************************/ 3261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* #DEFINES */ 3361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/************************************************************************/ 3461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define VOP_START_CODE 0x000001B6 3661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define SHORT_HEADER_START_CODE 0x00008000 3761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define H264_START_CODE 0x00000001 3861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/************************************************************************/ 4061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* STATIC VARIABLES */ 4161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/************************************************************************/ 4261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 4361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic int Code_type; 4461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic int total_frames = 0; 4561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic unsigned int header_code = 0; 4661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic pthread_mutex_t read_lock; 4761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 4861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic unsigned int read_frame ( unsigned char *dataptr,unsigned int length, 4961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FILE * inputBufferFile 5061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ); 5161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic unsigned clp2(unsigned x) 5261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 5361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x - 1; 5461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >> 1); 5561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >> 2); 5661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >> 4); 5761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >> 8); 5861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >>16); 5961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return x + 1; 6061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 6161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic void* video_thread (void *); 6461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic void* async_thread (void *); 6561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint main (int argc, char **argv) 6961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 7061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_encoder_context *encoder_context = NULL; 7161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *file_name = NULL; 7261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FILE *file_ptr = NULL; 7361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int temp1 =0,temp2 =0; 7461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int error = 1; 7561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int i = 0; 7661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 7761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan file_name = argv [1]; 7861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan file_ptr = fopen (file_name,"rb"); 7961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (file_ptr == NULL) { 8161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n File is not located "); 8261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 8361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context = (struct video_encoder_context *) \ 8761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct video_encoder_context),1); 8861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (encoder_context == NULL) { 9061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 9161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->outputBufferFile = NULL; 9461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->inputBufferFile = NULL; 9561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->video_driver_fd = -1; 9661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->inputBufferFile = file_ptr; 9761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->input_width = 176; 9861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->input_height = 144; 9961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->codectype = VEN_CODEC_MPEG4; 10061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->fps_num = 60; 10161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->fps_den = 2; 10261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->inputformat = VEN_INPUTFMT_NV12; 10361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->targetbitrate = 128000; 10461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 10561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan file_ptr = fopen ("/data/output.m4v","wb"); 10661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 10761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (file_ptr == NULL) { 10861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n File can't be created"); 10961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (encoder_context); 11061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 11161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 11261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 11361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->outputBufferFile = file_ptr; 11461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 11561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (atoi(argv[2])) { 11661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 0: 11761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n MPEG4 codec selected"); 11861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->codectype = VEN_CODEC_MPEG4; 11961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Code_type = 0; 12061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 12161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 1: 12261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n H.263"); 12361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->codectype = VEN_CODEC_H263; 12461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Code_type = 0; 12561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 2: 12761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n H.264"); 12861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->codectype = VEN_CODEC_H264; 12961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Code_type = 1; 13061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 13161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 13261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Wrong codec type"); 13361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 13461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 13561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 13661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1) { 13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp1 = atoi(argv[3]); 13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp2 = atoi(argv[4]); 14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (((temp1%16) != 0) || ((temp2%16) != 0)) { 14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->input_width = temp1; 14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->input_height = temp2; 14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (atoi(argv[5])) { 15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 0: 15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n No Sink"); 15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->outputBufferFile = NULL; 15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1) { 15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->targetbitrate = atoi (argv[6]); 15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( error != -1 && (init_encoder (encoder_context) == -1 )) { 16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Init decoder fails "); 16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Decoder open successfull"); 16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Allocate input and output buffers*/ 16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1 && (allocate_buffer (0,encoder_context)== -1)) { 17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in input Buffer allocation"); 17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1 && (allocate_buffer (1,encoder_context)== -1)) { 17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in output Buffer allocation"); 17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1 && (start_encoding (encoder_context) == -1)) { 18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in start decoding call"); 18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1 && (stop_encoding (encoder_context) == -1)) { 18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in stop decoding call"); 18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n De-init the decoder"); 19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((deinit_encoder (encoder_context) == -1)) { 19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void)free_buffer (INPUT_BUFFER,encoder_context); 19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void)free_buffer (OUTPUT_BUFFER,encoder_context); 19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (encoder_context->inputBufferFile != NULL) { 20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fclose (encoder_context->inputBufferFile); 20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (encoder_context->outputBufferFile != NULL) { 20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fclose (encoder_context->outputBufferFile); 20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Total Number of frames decoded %d",total_frames); 20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n closing the driver"); 21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (encoder_context); 21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return error; 21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint init_encoder ( struct video_encoder_context *init_decode ) 21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_ioctl_msg ioctl_msg = {NULL,NULL}; 21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_basecfg basecfg; 21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_queue_context *queue_ptr = NULL; 22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_ratectrlcfg ratecrl; 22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutexattr_t init_values; 22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_profile profile; 22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ven_profilelevel profilelevel; 22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Before calling the open"); 22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->video_driver_fd = open ("/dev/msm_vidc_enc", \ 22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan O_RDWR | O_NONBLOCK); 22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode->video_driver_fd < 0) { 23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Open failed"); 23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan basecfg.codectype = init_decode->codectype; 23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan basecfg.dvs_height = 0; 23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan basecfg.dvs_width = 0; 24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan basecfg.fps_den = init_decode->fps_den; 24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan basecfg.fps_num = init_decode->fps_num; 24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan basecfg.input_height = init_decode->input_height; 24361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan basecfg.input_width = init_decode->input_width; 24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan basecfg.inputformat = init_decode->inputformat; 24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan basecfg.targetbitrate = init_decode->targetbitrate; 24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Decoder with codec type and resolution*/ 24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &basecfg; 24961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_BASE_CFG, 25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set base config type failed"); 25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Decoder with codec type and resolution*/ 25861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Switch off rate control"); 25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &ratecrl; 26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ratecrl.rcmode = VEN_RC_OFF; 26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 26361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG, 26461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set rate control failed"); 26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 26861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (basecfg.codectype == VEN_CODEC_H264) { 27061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High"); 27161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &profile; 27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 27361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profile.profile = VEN_PROFILE_H264_BASELINE; 27461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE, 27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 27761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed"); 27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High"); 28261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &profilelevel; 28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profilelevel.level = VEN_LEVEL_H264_1p1; 28561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 28661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL, 28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 28861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed"); 28961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 29061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 29161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 29261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (basecfg.input_width > 720) { 29361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High"); 29461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &profile; 29561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profile.profile = VEN_PROFILE_H264_HIGH; 29761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 29861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE, 29961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 30061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed"); 30161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 30261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High"); 30561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &profilelevel; 30661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 30761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profilelevel.level = VEN_LEVEL_H264_3p1; 30861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL, 31061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 31161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set VEN_IOCTL_SET_CODEC_PROFILE failed"); 31261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 31361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 31461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 31561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 31661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 31761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Query Input bufffer requirements"); 31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Get the Buffer requirements for input and output ports*/ 31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 32061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = NULL; 32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = &init_decode->input_buffer; 32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ, 32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Requesting for input buffer requirements failed"); 32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n input Size=%d min count =%d actual count = %d", \ 33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)init_decode->input_buffer.datasize,\ 33361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)init_decode->input_buffer.mincount,\ 33461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)init_decode->input_buffer.actualcount); 33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &init_decode->input_buffer; 33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->input_buffer.actualcount = init_decode->input_buffer.mincount + 2; 34061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 34161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ, 34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set Buffer Requirements Failed"); 34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Query output bufffer requirements"); 34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = NULL; 35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = &init_decode->output_buffer; 35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ, 35361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 35461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Requesting for output buffer requirements failed"); 35561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 35661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 35761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 35861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n output Size=%d min count =%d actual count = %d", \ 35961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)init_decode->output_buffer.datasize,\ 36061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)init_decode->output_buffer.mincount,\ 36161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)init_decode->output_buffer.actualcount); 36261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 36361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create Queue related data structures*/ 36461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr = &init_decode->queue_context; 36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->commandq_size = 50; 36661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->dataq_size = 50; 36761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 36861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_init(&queue_ptr->sem_message,0, 0); 36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_init(&init_decode->sem_synchronize,0, 0); 37061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutexattr_init (&init_values); 37261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init (&queue_ptr->mutex,&init_values); 37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init (&read_lock,&init_values); 37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n create Queues"); 37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->ptr_cmdq = (struct video_msgq*) \ 37661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct video_msgq), 37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->commandq_size); 37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->ptr_dataq = (struct video_msgq*) \ 37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct video_msgq), 38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->dataq_size 38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ); 38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( queue_ptr->ptr_cmdq == NULL || 38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->ptr_dataq == NULL 38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n create Threads"); 39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create two threads*/ 39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pthread_create (&init_decode->videothread_id,NULL,video_thread, 39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode) < 0) || 39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pthread_create (&init_decode->asyncthread_id,NULL,async_thread, 39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode) < 0) 39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 40161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 40261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint free_buffer ( unsigned int buffer_dir, 40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_encoder_context *encoder_context 40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffercount = 0,i=0; 41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_bufferpayload **ptemp = NULL; 41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (encoder_context == NULL) { 41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_dir == INPUT_BUFFER && encoder_context->ptr_inputbuffer) { 41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffercount = encoder_context->input_buffer.actualcount; 41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp = encoder_context->ptr_inputbuffer; 41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i<buffercount; i++) { 42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]) { 42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]->fd != -1) { 42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap ( ptemp [i]->pbuffer,ptemp [i]->maped_size); 42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->pbuffer = NULL; 42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (ptemp [i]->fd); 42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (ptemp [i]); 42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i] = NULL; 43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (encoder_context->ptr_inputbuffer); 43461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->ptr_inputbuffer = NULL; 43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( buffer_dir == OUTPUT_BUFFER && encoder_context->ptr_outputbuffer ) { 43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffercount = encoder_context->output_buffer.actualcount; 43761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp = encoder_context->ptr_outputbuffer; 43861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp) { 44061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i<buffercount; i++) { 44161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]) { 44261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]->fd != -1) { 44361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap ( ptemp [i]->pbuffer,ptemp [i]->maped_size); 44461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->pbuffer = NULL; 44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (ptemp [i]->fd); 44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 44761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (ptemp [i]); 44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i] = NULL; 45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 45161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 45261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 45361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (ptemp); 45461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->ptr_outputbuffer = NULL; 45561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 45661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 45761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 45861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 45961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 46061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 46161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint allocate_buffer ( unsigned int buffer_dir, 46261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_encoder_context *encoder_context 46361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 46461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_bufferpayload **ptemp = NULL; 46661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_ioctl_msg ioctl_msg = {NULL,NULL}; 46761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffercount = 0,i=0,alignedsize=0; 46861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffersize = 0; 46961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 47061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( encoder_context == NULL) { 47161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: context is NULL"); 47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 47461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( buffer_dir == INPUT_BUFFER ) { 47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if buffers are allocated*/ 47761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (encoder_context->ptr_inputbuffer != NULL) { 47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: encoder_context->ptr_inputbuffer is set"); 47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffercount = encoder_context->input_buffer.actualcount; 48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alignedsize = encoder_context->input_buffer.alignment; 48461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffersize = encoder_context->input_buffer.datasize; 48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffersize = (buffersize + alignedsize) & (~alignedsize); 48661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_dir == OUTPUT_BUFFER) { 48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if buffers are allocated*/ 48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (encoder_context->ptr_outputbuffer != NULL) { 48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: Double allcoate output"); 49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffercount = encoder_context->output_buffer.actualcount; 49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alignedsize = encoder_context->output_buffer.alignment; 49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffersize = encoder_context->output_buffer.datasize; 49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffersize = (buffersize + alignedsize) & (~alignedsize); 49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: Wrong buffer directions"); 50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp = (struct venc_bufferpayload **)\ 50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct venc_bufferpayload *),buffercount); 50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp == NULL) { 50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: venc_bufferpayload failure"); 50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_dir == OUTPUT_BUFFER) { 51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: OUT"); 51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->ptr_outputbuffer = ptemp; 51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: IN"); 51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->ptr_inputbuffer = ptemp; 51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Allocate buffer headers*/ 52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< buffercount; i++) { 52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i] = (struct venc_bufferpayload*)\ 52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct venc_bufferpayload),1); 52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i] == NULL) { 52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: ptemp [i] calloc failure"); 52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->fd = -1; 53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< buffercount; i++) { 53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->fd = open ("/dev/pmem_adsp",O_RDWR); 53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]->fd < 0) { 53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: open pmem_adsp failed"); 53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->pbuffer = mmap(NULL,clp2(buffersize),PROT_READ|PROT_WRITE, 54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MAP_SHARED,ptemp [i]->fd,0); 54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n pmem fd = %d virt addr = %p",ptemp [i]->fd,\ 54461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->pbuffer); 54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 54661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]->pbuffer == MAP_FAILED) { 54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->pbuffer = NULL; 54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: MMAP failed"); 54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 55161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->sz = buffersize; 55361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->maped_size = clp2 (buffersize); 55461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = ptemp [i]; 55661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 55861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_dir == OUTPUT_BUFFER) { 55961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER, 56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: Set Output Buffer IOCTL failed"); 56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_SET_INPUT_BUFFER, 56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: Set input Buffer IOCTL failed"); 56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: Success"); 57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint start_encoding (struct video_encoder_context *encoder_context) 58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_ioctl_msg ioctl_msg = {NULL,NULL}; 58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_buffer enc_buffer; 58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int i = 0; 58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int data_len =0; 58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (encoder_context == NULL) { 58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_CMD_START, 59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL) < 0) { 59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Start failed"); 59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Start Issued successfully waiting for Start Done"); 59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Wait for Start command response*/ 60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&encoder_context->sem_synchronize); 60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push output Buffers*/ 60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i = 0; 60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (i < encoder_context->output_buffer.actualcount) { 60661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.clientdata = (void *)encoder_context->ptr_outputbuffer [i]; 60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.flags = 0; 60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.sz = encoder_context->ptr_outputbuffer [i]->sz; 60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.len = 0; 61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.ptrbuffer = encoder_context->ptr_outputbuffer [i]->pbuffer; 61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.offset = 0; 61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.timestamp = 0; 61361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata); 61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &enc_buffer; 61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (encoder_context->video_driver_fd, 61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) { 62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n fill output frame failed"); 62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i++; 62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*push input buffers*/ 62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i = 0; 63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (i < encoder_context->input_buffer.actualcount) { 63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Read Frame from File"); 63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.clientdata = (void *)encoder_context->ptr_inputbuffer [i]; 63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.flags = 0; 63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.sz = encoder_context->ptr_inputbuffer [i]->sz; 63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.len = 0; 63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.ptrbuffer = encoder_context->ptr_inputbuffer [i]->pbuffer; 63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.offset = 0; 64061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.timestamp = total_frames * 64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((encoder_context->fps_den * 1000000)/encoder_context->fps_num); 64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.len = (encoder_context->input_height * 64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->input_width *3)/2; 64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data_len = read_frame ( enc_buffer.ptrbuffer, 64561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.len, 64661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->inputBufferFile); 64761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (data_len == 0) { 64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Length is zero error"); 65061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 65161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 65261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 65361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.len = data_len; 65461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Read Frame from File szie = %d",(int)data_len); 65561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata); 65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &enc_buffer; 65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (encoder_context->video_driver_fd, 66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < 0) { 66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Encode input frame failed"); 66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 66461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 66561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan total_frames++; 66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i++; 66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 66961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Wait for EOS"); 67161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Wait for EOS or Error condition*/ 67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&encoder_context->sem_synchronize); 67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Reached EOS"); 67461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint stop_encoding (struct video_encoder_context *encoder_context) 67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_ioctl_msg ioctl_msg = {NULL,NULL}; 68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_bufferflush buffer_flush; 68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (encoder_context == NULL) { 68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_flush.flush_mode = VEN_FLUSH_INPUT; 68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &buffer_flush; 68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH, 69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Flush input failed"); 69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&encoder_context->sem_synchronize); 69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_flush.flush_mode = VEN_FLUSH_OUTPUT; 69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &buffer_flush; 70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH, 70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Flush output failed"); 70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&encoder_context->sem_synchronize); 70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Stop VEN_IOCTL_CMD_STOP"); 71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_STOP,NULL) < 0) { 71261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Stop failed"); 71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&encoder_context->sem_synchronize); 71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint deinit_encoder (struct video_encoder_context *init_decode) 72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode == NULL) { 72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Close the driver*/ 72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode->video_driver_fd != -1) { 72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (init_decode->video_driver_fd); 72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode->queue_context.ptr_cmdq) { 73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (init_decode->queue_context.ptr_cmdq); 73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->queue_context.ptr_cmdq = NULL; 73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode->queue_context.ptr_dataq) { 73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (init_decode->queue_context.ptr_dataq); 73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->queue_context.ptr_dataq = NULL; 73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 74061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_destroy (&init_decode->queue_context.sem_message); 74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_destroy (&init_decode->sem_synchronize); 74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&init_decode->queue_context.mutex); 74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy (&read_lock); 74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic void* video_thread (void *context) 75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 75261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_encoder_context *encoder_context = NULL; 75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_msgq *queueitem = NULL; 75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_ioctl_msg ioctl_msg = {NULL,NULL}; 75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_bufferpayload *tempbuffer = NULL; 75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_buffer enc_buffer; 75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int data_len =0; 75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (context == NULL) { 76161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n video thread recieved NULL context"); 76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context = (struct video_encoder_context *) context; 76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Thread function which will accept commands from async thread 76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * or main thread 76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem = queue_get_cmd (&encoder_context ->queue_context); 77261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (queueitem != NULL) { 77461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (queueitem->cmd) { 77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_START: 77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n recived start done command"); 77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&encoder_context->sem_synchronize); 77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_STOP: 78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n recieved stop done"); 78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&encoder_context->sem_synchronize); 78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_INPUT_BUFFER_DONE: 78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer = (struct venc_bufferpayload *)queueitem->clientdata; 78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (tempbuffer == NULL) { 79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n FATAL ERROR input buffer address is bad"); 79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&encoder_context->sem_synchronize); 79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer->filled_len = (encoder_context->input_height * 79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->input_width *3)/2; 79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data_len = read_frame ( tempbuffer->pbuffer, 79961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer->filled_len, 80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->inputBufferFile); 80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (data_len == 0) { 80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n End of stream reached"); 80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&encoder_context->sem_synchronize); 80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 80761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.clientdata = (void *)tempbuffer; 80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.flags = 0; 81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.ptrbuffer = tempbuffer->pbuffer; 81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.sz = tempbuffer->sz; 81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.len = tempbuffer->filled_len; 81361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.offset = 0; 81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.timestamp = total_frames * 81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((encoder_context->fps_den * 1000000)/encoder_context->fps_num); 81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: Time stamp needs to be updated*/ 81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &enc_buffer; 81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan total_frames++; 82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_ENCODE_FRAME, 82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Decoder frame failed"); 82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&encoder_context->sem_synchronize); 82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Input buffer done send next buffer current value = %d",\ 82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan total_frames); 83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_OUTPUT_BUFFER_DONE: 83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer = (struct venc_bufferpayload *)queueitem->clientdata; 83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (tempbuffer == NULL) { 83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n FATAL ERROR input buffer address is bad"); 83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&encoder_context->sem_synchronize); 83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (encoder_context->outputBufferFile != NULL) { 84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite (tempbuffer->pbuffer,1,tempbuffer->filled_len, 84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context->outputBufferFile); 84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n recieved output buffer consume outbuffer"); 84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\ 85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer->pbuffer); 85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.clientdata = (void *)tempbuffer; 85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.flags = 0; 85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.sz = tempbuffer->sz; 85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.len = 0; 85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.ptrbuffer = tempbuffer->pbuffer; 85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.offset = 0; 85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enc_buffer.timestamp = 0; 85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &enc_buffer; 86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (encoder_context->video_driver_fd, 86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) { 86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Decoder frame failed"); 86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_FLUSH_INPUT_DONE: 87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Flush input complete"); 87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&encoder_context->sem_synchronize); 87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_FLUSH_OUPUT_DONE: 87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Flush output complete"); 87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&encoder_context->sem_synchronize); 87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (queueitem->cmd == VEN_MSG_STOP) { 88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Playback has ended thread will exit"); 88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error condition recieved NULL from Queue"); 88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic void* async_thread (void *context) 89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_encoder_context *encoder_context = NULL; 89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_msgq queueitem ; 89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_msg venc_msg; 89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_bufferpayload *tempbuffer = NULL; 89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct venc_ioctl_msg ioctl_msg = {NULL,NULL}; 89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int result = -1; 90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (context == NULL) { 90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n aynsc thread recieved NULL context"); 90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan encoder_context = (struct video_encoder_context *) context; 90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Entering the async thread"); 90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = NULL; 91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = (void*)&venc_msg; 91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Sizeof venc_msginfo = %d ",sizeof (venc_msg)); 91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Address of Venc msg in async thread %p",\ 91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out); 91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,\ 91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in ioctl read next msg"); 91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (venc_msg.msgcode) { 92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_START: 92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_STOP: 92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_INDICATION: 92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nSTOP/START Indiacation"); 92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.cmd = venc_msg.msgcode; 92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.status = venc_msg.statuscode; 92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.clientdata = NULL; 92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_INPUT_BUFFER_DONE: 93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nINPUT buffer done Indiacation"); 93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.cmd = venc_msg.msgcode; 93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.status = venc_msg.statuscode; 93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.clientdata = (void *)venc_msg.buf.clientdata; 93561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nInput Client data pointer is %p",queueitem.clientdata); 93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer = (struct venc_bufferpayload *) queueitem.clientdata; 93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Input Address of tempbuffer %p",tempbuffer); 93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer->filled_len = venc_msg.buf.len; 93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Input value of tempbuffer tempbuffer->filled_len %d",(int)tempbuffer->filled_len); 94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VEN_MSG_OUTPUT_BUFFER_DONE: 94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nOUPUT buffer done Indiacation"); 94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.cmd = venc_msg.msgcode; 94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.status = venc_msg.statuscode; 94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.clientdata = (void *)venc_msg.buf.clientdata; 94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nOutput Client data pointer is %p",queueitem.clientdata); 94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer = (struct venc_bufferpayload *) queueitem.clientdata; 94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Output Address of tempbuffer %p",tempbuffer); 94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer->filled_len = venc_msg.buf.len; 95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Output value of tempbuffer tempbuffer->filled_len %d",(int)tempbuffer->filled_len); 95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nIn Default of get next message %d",(int)venc_msg.msgcode); 95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.cmd = venc_msg.msgcode; 95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.status = venc_msg.statuscode; 95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.clientdata = NULL; 95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan result = queue_post_cmdq (&encoder_context->queue_context,&queueitem); 96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (result == 0) { 96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan result = queue_post_cmdq (&encoder_context->queue_context,&queueitem); 96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (result == -1) { 96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n FATAL ERROR WITH Queue"); 96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (venc_msg.msgcode == VEN_MSG_STOP) { 97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Thread can exit at this point*/ 97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 97661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic unsigned int read_frame (unsigned char *dataptr, unsigned int length, 98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FILE * inputBufferFile) 98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int readOffset = 0; 98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bytes_read = 0; 98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int code = 0; 98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int found = 0; 98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Inside the readframe"); 99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dataptr == NULL && length == 0) { 99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n dataptr = %p length = %d",dataptr,(int)length); 99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&read_lock); 99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_read = fread(&dataptr[readOffset],1,length,inputBufferFile); 99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&read_lock); 99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bytes_read; 100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 1002