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