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 "decoder_driver_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 int Read_Buffer_From_DAT_File( unsigned char *dataptr, unsigned int length, 5261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FILE * inputBufferFile 5361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ); 5461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 5561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic unsigned clp2(unsigned x) 5661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 5761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x - 1; 5861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >> 1); 5961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >> 2); 6061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >> 4); 6161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >> 8); 6261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan x = x | (x >>16); 6361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return x + 1; 6461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 6561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic void* video_thread (void *); 6761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic void* async_thread (void *); 6861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint main (int argc, char **argv) 7061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 7161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_decoder_context *decoder_context = NULL; 7261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *file_name = NULL; 7361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FILE *file_ptr = NULL; 7461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int temp1 =0,temp2 =0; 7561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int error = 1; 7661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int i = 0; 7761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 7861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan file_name = argv [1]; 7961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan file_ptr = fopen (file_name,"rb"); 8061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (file_ptr == NULL) { 8261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n File is not located "); 8361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 8461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context = (struct video_decoder_context *) \ 8861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct video_decoder_context),1); 8961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decoder_context == NULL) { 9161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 9261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->outputBufferFile = NULL; 9561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->inputBufferFile = NULL; 9661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->video_driver_fd = -1; 9761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->inputBufferFile = file_ptr; 9861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan file_ptr = fopen ("/data/output.yuv","wb"); 10061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 10161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (file_ptr == NULL) { 10261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n File can't be created"); 10361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (decoder_context); 10461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 10561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 10661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 10761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->outputBufferFile = file_ptr; 10861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 10961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (atoi(argv[2])) { 11061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 0: 11161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n MPEG4 codec selected"); 11261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->decoder_format = VDEC_CODECTYPE_MPEG4; 11361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Code_type = 0; 11461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 11561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 1: 11661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n H.263"); 11761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->decoder_format = VDEC_CODECTYPE_H263; 11861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Code_type = 0; 11961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 12061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 2: 12161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n H.264"); 12261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->decoder_format = VDEC_CODECTYPE_H264; 12361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Code_type = 1; 12461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 12561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Wrong codec type"); 12761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 12861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 12961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 13061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 13161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1) { 13261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp1 = atoi(argv[3]); 13361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp2 = atoi(argv[4]); 13461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 13561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (((temp1%16) != 0) || ((temp2%16) != 0)) { 13661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->video_resoultion.frame_height = temp1; 13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->video_resoultion.frame_width = temp2; 14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (atoi(argv[5])) { 14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 0: 14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n No Sink"); 14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context->outputBufferFile = NULL; 14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( error != -1 && (init_decoder (decoder_context) == -1 )) { 15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Init decoder fails "); 15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Decoder open successfull"); 15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Allocate input and output buffers*/ 15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1 && (allocate_buffer (VDEC_BUFFER_TYPE_INPUT, 16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context)== -1)) { 16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in input Buffer allocation"); 16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1 && (allocate_buffer (VDEC_BUFFER_TYPE_OUTPUT, 16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoder_context)== -1)) { 16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in output Buffer allocation"); 16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1 && (start_decoding (decoder_context) == -1)) { 17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in start decoding call"); 17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error != -1 && (stop_decoding (decoder_context) == -1)) { 17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in stop decoding call"); 17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n De-init the decoder"); 18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((deinit_decoder (decoder_context) == -1)) { 18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = -1; 18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void)free_buffer (VDEC_BUFFER_TYPE_INPUT,decoder_context); 19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void)free_buffer (VDEC_BUFFER_TYPE_OUTPUT,decoder_context); 19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decoder_context->inputBufferFile != NULL) { 19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fclose (decoder_context->inputBufferFile); 19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decoder_context->outputBufferFile != NULL) { 19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fclose (decoder_context->outputBufferFile); 19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Total Number of frames decoded %d",total_frames); 20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n closing the driver"); 20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (decoder_context); 20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return error; 20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint init_decoder ( struct video_decoder_context *init_decode ) 20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_queue_context *queue_ptr = NULL; 21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef MAX_RES_720P 21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum vdec_output_fromat output_format = VDEC_YUV_FORMAT_NV12; 21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef MAX_RES_1080P 21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum vdec_output_fromat output_format = VDEC_YUV_FORMAT_TILE_4x2; 21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutexattr_t init_values; 21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Before calling the open"); 22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->video_driver_fd = open ("/dev/msm_vidc_dec", \ 22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan O_RDWR | O_NONBLOCK); 22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode->video_driver_fd < 0) { 22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Open failed"); 22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Decoder with codec type and resolution*/ 23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &init_decode->decoder_format; 23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_CODEC, 23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set codec type failed"); 24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 24361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Set the output format*/ 24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &output_format; 24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT, 24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 24961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set output format failed"); 25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &init_decode->video_resoultion; 25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_PICRES, 25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 25861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set Resolution failed"); 25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n After Set Resolution"); 26361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 26461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Query Input bufffer requirements"); 26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Get the Buffer requirements for input and output ports*/ 26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT; 26861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = NULL; 26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = &init_decode->input_buffer; 27061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 27161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ, 27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 27361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Requesting for input buffer requirements failed"); 27461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 27761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n input Size=%d min count =%d actual count = %d", \ 27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->input_buffer.buffer_size,\ 27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->input_buffer.mincount,\ 28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->input_buffer.actualcount); 28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 28261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT; 28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &init_decode->input_buffer; 28561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 28661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->input_buffer.actualcount = init_decode->input_buffer.mincount + 2; 28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 28861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_BUFFER_REQ, 28961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 29061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Set Buffer Requirements Failed"); 29161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 29261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 29361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 29461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 29561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Query output bufffer requirements"); 29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->output_buffer.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 29761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = NULL; 29861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = &init_decode->output_buffer; 29961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ, 30161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 30261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Requesting for output buffer requirements failed"); 30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 30461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 30561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 30661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n output Size=%d min count =%d actual count = %d", \ 30761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->output_buffer.buffer_size,\ 30861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->output_buffer.mincount,\ 30961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->output_buffer.actualcount); 31061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 31161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create Queue related data structures*/ 31261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr = &init_decode->queue_context; 31361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->commandq_size = 50; 31461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->dataq_size = 50; 31561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 31661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_init(&queue_ptr->sem_message,0, 0); 31761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_init(&init_decode->sem_synchronize,0, 0); 31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutexattr_init (&init_values); 32061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init (&queue_ptr->mutex,&init_values); 32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init (&read_lock,&init_values); 32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n create Queues"); 32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->ptr_cmdq = (struct video_msgq*) \ 32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct video_msgq), 32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->commandq_size); 32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->ptr_dataq = (struct video_msgq*) \ 32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct video_msgq), 32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->dataq_size 32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ); 33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( queue_ptr->ptr_cmdq == NULL || 33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queue_ptr->ptr_dataq == NULL 33361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 33461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n create Threads"); 33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create two threads*/ 34061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pthread_create (&init_decode->videothread_id,NULL,video_thread, 34161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode) < 0) || 34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pthread_create (&init_decode->asyncthread_id,NULL,async_thread, 34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode) < 0) 34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 35361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint free_buffer ( enum vdec_buffer buffer_dir, 35461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_decoder_context *decode_context 35561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 35661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 35761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffercount = 0,i=0; 35861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload **ptemp = NULL; 35961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 36061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context == NULL) { 36161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 36261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 36361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 36461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_dir == VDEC_BUFFER_TYPE_INPUT && decode_context->ptr_inputbuffer) { 36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffercount = decode_context->input_buffer.actualcount; 36661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp = decode_context->ptr_inputbuffer; 36761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 36861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i<buffercount; i++) { 36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]) { 37061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]->pmem_fd != -1) { 37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap ( ptemp [i]->bufferaddr,ptemp [i]->mmaped_size); 37261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->bufferaddr = NULL; 37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (ptemp [i]->pmem_fd); 37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 37661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (ptemp [i]); 37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i] = NULL; 37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (decode_context->ptr_inputbuffer); 38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_inputbuffer = NULL; 38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( buffer_dir == VDEC_BUFFER_TYPE_OUTPUT ) { 38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffercount = decode_context->output_buffer.actualcount; 38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp = decode_context->ptr_outputbuffer; 38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context->ptr_respbuffer) { 38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i<buffercount; i++) { 38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context->ptr_respbuffer [i]) { 39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (decode_context->ptr_respbuffer[i]); 39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_respbuffer [i] = NULL; 39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (decode_context->ptr_respbuffer); 39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_respbuffer = NULL; 39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp) { 40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i<buffercount; i++) { 40161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]) { 40261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]->pmem_fd != -1) { 40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap ( ptemp [i]->bufferaddr,ptemp [i]->mmaped_size); 40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->bufferaddr = NULL; 40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (ptemp [i]->pmem_fd); 40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (ptemp [i]); 40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i] = NULL; 41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (ptemp); 41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_outputbuffer = NULL; 41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint allocate_buffer ( enum vdec_buffer buffer_dir, 42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_decoder_context *decode_context 42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload **ptemp = NULL; 42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffercount = 0,i=0,alignedsize=0; 42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffersize = 0; 43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( decode_context == NULL) { 43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: context is NULL"); 43361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 43461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( buffer_dir == VDEC_BUFFER_TYPE_INPUT ) { 43761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if buffers are allocated*/ 43861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context->ptr_inputbuffer != NULL) { 43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: decode_context->ptr_inputbuffer is set"); 44061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 44161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 44261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffercount = decode_context->input_buffer.actualcount; 44461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alignedsize = decode_context->input_buffer.alignment; 44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffersize = decode_context->input_buffer.buffer_size; 44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffersize = (buffersize + alignedsize) & (~alignedsize); 44761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_dir == VDEC_BUFFER_TYPE_OUTPUT) { 44861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if buffers are allocated*/ 44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context->ptr_outputbuffer != NULL) { 45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: Double allcoate output"); 45161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 45261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 45361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 45461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffercount = decode_context->output_buffer.actualcount; 45561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alignedsize = decode_context->output_buffer.alignment; 45661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffersize = decode_context->output_buffer.buffer_size; 45761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffersize = (buffersize + alignedsize) & (~alignedsize); 45861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 45961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_respbuffer = (struct vdec_output_frameinfo **)\ 46061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo *),buffercount); 46161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 46261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context->ptr_respbuffer == NULL) { 46361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Allocate failure ptr_respbuffer"); 46461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 46661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 46761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< buffercount; i++) { 46861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_respbuffer [i] = (struct vdec_output_frameinfo *)\ 46961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo),buffercount); 47061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 47161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context->ptr_respbuffer [i] == NULL) { 47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nfailed to allocate vdec_output_frameinfo"); 47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 47461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 47761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: Wrong buffer directions"); 47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp = (struct vdec_bufferpayload **)\ 48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_bufferpayload *),buffercount); 48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 48461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp == NULL) { 48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: vdec_bufferpayload failure"); 48661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_dir == VDEC_BUFFER_TYPE_OUTPUT) { 49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: OUT"); 49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_outputbuffer = ptemp; 49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: IN"); 49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_inputbuffer = ptemp; 49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Allocate buffer headers*/ 49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< buffercount; i++) { 50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i] = (struct vdec_bufferpayload*)\ 50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_bufferpayload),1); 50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i] == NULL) { 50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: ptemp [i] calloc failure"); 50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_dir == VDEC_BUFFER_TYPE_OUTPUT) { 50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_respbuffer [i]->client_data = \ 51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void *) ptemp [i]; 51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->pmem_fd = -1; 51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< buffercount; i++) { 51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->pmem_fd = open ("/dev/pmem_adsp",O_RDWR); 51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]->pmem_fd < 0) { 52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: open pmem_adsp failed"); 52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->bufferaddr = mmap(NULL,clp2(buffersize),PROT_READ|PROT_WRITE, 52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan MAP_SHARED,ptemp [i]->pmem_fd,0); 52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n pmem fd = %d virt addr = %p",ptemp [i]->pmem_fd,\ 52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->bufferaddr); 52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptemp [i]->bufferaddr == MAP_FAILED) { 53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->bufferaddr = NULL; 53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: MMAP failed"); 53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->buffer_len = buffersize; 53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptemp [i]->mmaped_size = clp2 (buffersize); 53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = buffer_dir; 54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,ptemp [i],sizeof (struct vdec_bufferpayload)); 54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &setbuffers; 54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 54461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_SET_BUFFER, 54661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: Set Buffer IOCTL failed"); 54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 55161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 55361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\nallocate_buffer: Success"); 55461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 55661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 55861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 55961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint start_decoding (struct video_decoder_context *decode_context) 56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_input_frameinfo frameinfo; 56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_fillbuffer_cmd fillbuffer; 56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int i = 0; 56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int data_len =0; 56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset ((unsigned char*)&frameinfo,0,sizeof (struct vdec_input_frameinfo)); 56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset ((unsigned char*)&fillbuffer,0,sizeof (struct vdec_fillbuffer_cmd)); 56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context == NULL) { 57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_CMD_START, 57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL) < 0) { 57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Start failed"); 57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Start Issued successfully waiting for Start Done"); 58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Wait for Start command response*/ 58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&decode_context->sem_synchronize); 58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push output Buffers*/ 58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i = 0; 58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (i < decode_context->output_buffer.mincount) { 58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.buffer.buffer_len = 58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_outputbuffer [i]->buffer_len; 59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.buffer.bufferaddr = 59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_outputbuffer [i]->bufferaddr; 59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.buffer.offset = 59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_outputbuffer [i]->offset; 59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.buffer.pmem_fd = 59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_outputbuffer [i]->pmem_fd; 59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.client_data = (void *)decode_context->ptr_respbuffer [i]; 59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Client Data on output = %p",fillbuffer.client_data); 59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &fillbuffer; 59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (decode_context->video_driver_fd, 60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) { 60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Decoder frame failed"); 60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 60661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i++; 60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*push input buffers*/ 61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i = 0; 61361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (i < decode_context->input_buffer.mincount) { 61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Read Frame from File"); 61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data_len = read_frame ( decode_context->ptr_inputbuffer [i]->bufferaddr, 61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_inputbuffer [i]->buffer_len, 61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->inputBufferFile); 61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (data_len == 0) { 62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Length is zero error"); 62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Read Frame from File szie = %u",data_len); 62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr = 62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_inputbuffer [i]->bufferaddr; 62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.offset = 0; 62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_fd = decode_context->ptr_inputbuffer [i]->pmem_fd; 63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_offset = decode_context->ptr_inputbuffer [i]->offset; 63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.datalen = data_len; 63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.client_data = (struct vdec_bufferpayload *)\ 63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->ptr_inputbuffer [i]; 63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: Time stamp needs to be updated*/ 63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &frameinfo; 63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_DECODE_FRAME, 63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 64061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Decoder frame failed"); 64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan total_frames++; 64561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan i++; 64661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 64761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Wait for EOS"); 64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Wait for EOS or Error condition*/ 65061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&decode_context->sem_synchronize); 65161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Reached EOS"); 65261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 65361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 65461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 65561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint stop_decoding (struct video_decoder_context *decode_context) 65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum vdec_bufferflush flush_dir = VDEC_FLUSH_TYPE_INPUT; 66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context == NULL) { 66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 66461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &flush_dir; 66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_FLUSH, 66961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Flush input failed"); 67161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&decode_context->sem_synchronize); 67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 67461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan flush_dir = VDEC_FLUSH_TYPE_OUTPUT; 67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &flush_dir; 67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_FLUSH, 68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Flush output failed"); 68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&decode_context->sem_synchronize); 68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Stop VDEC_IOCTL_CMD_STOP"); 68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_STOP, 68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL) < 0) { 69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Stop failed"); 69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_wait (&decode_context->sem_synchronize); 69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint deinit_decoder (struct video_decoder_context *init_decode) 69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode == NULL) { 70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Close the driver*/ 70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode->video_driver_fd != -1) { 70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close (init_decode->video_driver_fd); 70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode->queue_context.ptr_cmdq) { 71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (init_decode->queue_context.ptr_cmdq); 71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->queue_context.ptr_cmdq = NULL; 71261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (init_decode->queue_context.ptr_dataq) { 71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (init_decode->queue_context.ptr_dataq); 71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_decode->queue_context.ptr_dataq = NULL; 71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_destroy (&init_decode->queue_context.sem_message); 72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_destroy (&init_decode->sem_synchronize); 72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&init_decode->queue_context.mutex); 72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy (&read_lock); 72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 1; 72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic void* video_thread (void *context) 72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_decoder_context *decode_context = NULL; 73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_msgq *queueitem = NULL; 73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_input_frameinfo frameinfo; 73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_fillbuffer_cmd fillbuffer; 73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *outputbuffer = NULL; 73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *tempbuffer = NULL; 73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int data_len =0; 73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 74061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (context == NULL) { 74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n video thread recieved NULL context"); 74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context = (struct video_decoder_context *) context; 74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Thread function which will accept commands from async thread 74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * or main thread 74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem = queue_get_cmd (&decode_context ->queue_context); 75261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (queueitem != NULL) { 75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (queueitem->cmd) { 75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_HW_ERROR: 75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n FATAL ERROR "); 75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_FLUSHED: 75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Input Buffer Flushed"); 76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_FLUSHED: 76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Output buffer Flushed"); 76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_START_DONE: 76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n recived start done command"); 76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&decode_context->sem_synchronize); 76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_STOP_DONE: 77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n recieved stop done"); 77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&decode_context->sem_synchronize); 77261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 77461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer = (struct vdec_bufferpayload *)queueitem->clientdata; 77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (tempbuffer == NULL) { 77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n FATAL ERROR input buffer address is bad"); 78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&decode_context->sem_synchronize); 78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data_len = read_frame ( tempbuffer->bufferaddr, 78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer->buffer_len, 78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->inputBufferFile 78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ); 78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (data_len == 0) { 79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n End of stream reached"); 79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&decode_context->sem_synchronize); 79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr = tempbuffer->bufferaddr; 79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.offset = 0; 79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_fd = tempbuffer->pmem_fd; 79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_offset = tempbuffer->offset; 79961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.datalen = data_len; 80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.client_data = (struct vdec_bufferpayload *)\ 80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer; 80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: Time stamp needs to be updated*/ 80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &frameinfo; 80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan total_frames++; 80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 80761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_DECODE_FRAME, 80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &ioctl_msg) < 0) { 80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Decoder frame failed"); 81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&decode_context->sem_synchronize); 81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 81361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Input buffer done send next buffer current value = %d",\ 81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan total_frames); 81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputbuffer = (struct vdec_output_frameinfo *)\ 82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem->clientdata; 82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Value of client Data in VT %p",queueitem->clientdata); 82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputbuffer == NULL || outputbuffer->bufferaddr == NULL || 82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputbuffer->client_data == NULL 82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n FATAL ERROR output buffer is bad"); 82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nValues outputbuffer = %p",outputbuffer); 82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputbuffer != NULL) { 83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\ 83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputbuffer->bufferaddr); 83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nValues outputbuffer->client_data = %p",\ 83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputbuffer->client_data); 83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&decode_context->sem_synchronize); 83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (outputbuffer->len == 0) { 84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Filled Length is zero Close decoding"); 84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&decode_context->sem_synchronize); 84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (decode_context->outputBufferFile != NULL) { 84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fwrite (outputbuffer->bufferaddr,1,outputbuffer->len, 84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context->outputBufferFile); 85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer = (struct vdec_bufferpayload *)\ 85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputbuffer->client_data; 85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n recieved output buffer consume outbuffer"); 85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\ 85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputbuffer->bufferaddr); 85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Vir address of allocated buffer %p",\ 85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tempbuffer->bufferaddr); 86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.buffer.buffer_len = tempbuffer->buffer_len; 86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.buffer.bufferaddr = tempbuffer->bufferaddr; 86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.buffer.offset = tempbuffer->offset; 86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.buffer.pmem_fd = tempbuffer->pmem_fd; 86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fillbuffer.client_data = (void *)outputbuffer; 86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = &fillbuffer; 86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = NULL; 86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (decode_context->video_driver_fd, 87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) { 87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Decoder frame failed"); 87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Flush input complete"); 87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&decode_context->sem_synchronize); 88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Flush output complete"); 88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&decode_context->sem_synchronize); 88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (queueitem->cmd == VDEC_MSG_RESP_STOP_DONE) { 88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Playback has ended thread will exit"); 89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error condition recieved NULL from Queue"); 89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic void* async_thread (void *context) 90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_decoder_context *decode_context = NULL; 90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *outputframe = NULL; 90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct video_msgq queueitem ; 90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ioctl_msg ioctl_msg = {NULL,NULL}; 90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int result = -1; 90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (context == NULL) { 90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n aynsc thread recieved NULL context"); 91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decode_context = (struct video_decoder_context *) context; 91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Entering the async thread"); 91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (1) { 91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.in = NULL; 91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out = (void*)&vdec_msg; 92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Sizeof vdec_msginfo = %d ",sizeof (vdec_msg)); 92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Address of Vdec msg in async thread %p",\ 92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ioctl_msg.out); 92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,\ 92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void*)&ioctl_msg) < 0) { 92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Error in ioctl read next msg"); 92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (vdec_msg.msgcode) { 92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_START_DONE: 93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_STOP_DONE: 93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_HW_ERROR: 93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nioctl read next msg"); 93561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.cmd = vdec_msg.msgcode; 93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.status = vdec_msg.status_code; 93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.clientdata = NULL; 93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_FLUSHED: 94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.cmd = vdec_msg.msgcode; 94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.status = vdec_msg.status_code; 94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.clientdata = (void *)\ 94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.input_frame_clientdata; 94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_FLUSHED: 95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.cmd = vdec_msg.msgcode; 95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.status = vdec_msg.status_code; 95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputframe = (struct vdec_output_frameinfo *)\ 95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.client_data; 95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Client Data value in %p", \ 95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.client_data); 95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputframe->bufferaddr = vdec_msg.msgdata.output_frame.bufferaddr; 95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputframe->framesize.bottom = \ 95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.bottom; 96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputframe->framesize.left = \ 96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.left; 96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputframe->framesize.right = \ 96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.right; 96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputframe->framesize.top = \ 96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.top; 96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputframe->framesize = vdec_msg.msgdata.output_frame.framesize; 96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputframe->len = vdec_msg.msgdata.output_frame.len; 96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan outputframe->time_stamp = vdec_msg.msgdata.output_frame.time_stamp; 96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.clientdata = (void *)outputframe; 97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Client Data value Copy %p",queueitem.clientdata); 97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\nIn Default of get next message %d",vdec_msg.msgcode); 97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.cmd = vdec_msg.msgcode; 97661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.status = vdec_msg.status_code; 97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan queueitem.clientdata = NULL; 97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan result = queue_post_cmdq (&decode_context->queue_context,&queueitem); 98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (result == 0) { 98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan result = queue_post_cmdq (&decode_context->queue_context, 98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &queueitem); 98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (result == -1) { 98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n FATAL ERROR WITH Queue"); 99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (vdec_msg.msgcode == VDEC_MSG_RESP_STOP_DONE) { 99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Thread can exit at this point*/ 99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic unsigned int read_frame (unsigned char *dataptr, unsigned int length, 100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FILE * inputBufferFile) 100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int readOffset = 0; 100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bytes_read = 0; 100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int code = 0; 100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int found = 0; 100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Inside the readframe"); 101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dataptr == NULL || length == 0) { 101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n dataptr = %p length = %u",dataptr,length); 101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!Code_type) { 101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Start of Critical Section*/ 101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&read_lock); 102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan do { 102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Start codes are always byte aligned. 102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_read = fread(&dataptr[readOffset],1, 1,inputBufferFile); 102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( !bytes_read) { 102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT("\n Bytes read Zero \n"); 102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan code <<= 8; 103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan code |= (0x000000FF & dataptr[readOffset]); 103261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //VOP start code comparision 103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (readOffset>3) { 103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!header_code ) { 103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( VOP_START_CODE == code) { 103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Found VOP Code"); 103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan header_code = VOP_START_CODE; 103961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (0xFFFFFC00 & code) == SHORT_HEADER_START_CODE ) { 104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan header_code = SHORT_HEADER_START_CODE; 104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((header_code == VOP_START_CODE) && (code == VOP_START_CODE)) { 104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Seek backwards by 4 104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fseek(inputBufferFile, -4, SEEK_CUR); 104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan readOffset-=4; 104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan found = 1; 104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (( header_code == SHORT_HEADER_START_CODE ) && 105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ( SHORT_HEADER_START_CODE == (code & 0xFFFFFC00))) { 105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Seek backwards by 4 105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fseek(inputBufferFile, -4, SEEK_CUR); 105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan readOffset-=4; 105661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan found = 1; 105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan readOffset++; 106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } while (readOffset < length); 106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&read_lock); 106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* End of Critical Section*/ 106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (found == 1) { 106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //DEBUG_PRINT ("Found a Frame"); 106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return (readOffset+1); 107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //DEBUG_PRINT ("No Frames detected"); 107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan readOffset = Read_Buffer_From_DAT_File(dataptr,length,inputBufferFile); 107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (total_frames == 0) { 107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_read = Read_Buffer_From_DAT_File(&dataptr[readOffset], 108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (length-readOffset), 108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan inputBufferFile); 108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan readOffset += bytes_read; 108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return (readOffset); 108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 108761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic int Read_Buffer_From_DAT_File(unsigned char *dataptr, unsigned int length, 109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FILE * inputBufferFile) 109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan long frameSize=0; 109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char temp_buffer[10]; 109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char temp_byte; 109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bytes_read=0; 109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i=0; 110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *read_buffer=NULL; 110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char c = '1'; //initialize to anything except '\0'(0) 110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char inputFrameSize[12]; 110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int count =0; 110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char cnt =0; 110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(temp_buffer, 0, sizeof(temp_buffer)); 110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (cnt < 10) 110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Check the input file format, may result in infinite loop */ 110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan count = fread(&inputFrameSize[cnt],1,1,inputBufferFile); 111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (inputFrameSize[cnt] == '\0' ) 111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan cnt++; 111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan inputFrameSize[cnt]='\0'; 111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameSize = atoi(inputFrameSize); 112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //length = 0; 112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT ("\n Frame Size is %d",frameSize); 112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* get the frame length */ 112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fseek(inputBufferFile, -1, SEEK_CUR); 112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bytes_read = fread(dataptr, 1, frameSize, inputBufferFile); 112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bytes_read == 0 || bytes_read < frameSize ) { 112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bytes_read; 113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 1133