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