]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/omapdrmtest.git/blobdiff - viddec3test.c
viddec3test: close file descriptor created for input buffer
[glsdk/omapdrmtest.git] / viddec3test.c
index 53004f1d7d54c45bf07293dce2f055066b1b1ecd..20fc252b2bf6f08004275c69914dc08f01b5e199 100644 (file)
 #include <omap_drm.h>
 #include <omap_drmif.h>
 
+#include <pthread.h>
+
 #include "util.h"
 #include "demux.h"
 
+/* Used for mpeg4 esds data copy */
+int first_in_buff = 0;
 
 /* Padding for width as per Codec Requirement (for h264) */
 #define PADX  32
@@ -79,27 +83,23 @@ usage(char *name)
 static void
 decoder_close(struct decoder *decoder)
 {
-       int i;
-       /* fix me: all the output buffers are not unlocked in process.So calling unlock
-        * for all the buffers */
-       for(i=0;i<decoder->num_outBuf;i++){
-               dce_buf_unlock(1,&decoder->disp->buf[i]->fd[0]);
-               if(decoder->disp->multiplanar)
-                       dce_buf_unlock(1,&decoder->disp->buf[i]->fd[1]);
-       }
        /* free output buffers allocated by display */
        disp_free_buffers(decoder->disp,decoder->num_outBuf);
 
-       if (decoder->codec)          VIDDEC3_delete(decoder->codec);
-       if (decoder->engine)         Engine_close(decoder->engine);
-       if (dev)                     dce_deinit(dev);
+       if (decoder->status)         dce_free(decoder->status);
        if (decoder->params)         dce_free(decoder->params);
        if (decoder->dynParams)      dce_free(decoder->dynParams);
-       if (decoder->status)         dce_free(decoder->status);
-       if (decoder->inBufs)         dce_free(decoder->inBufs);
+       if (decoder->inBufs) {
+               dce_buf_unlock(1, &(decoder->inBufs->descs[0].buf));
+               close(decoder->inBufs->descs[0].buf);
+               dce_free(decoder->inBufs);
+       }
        if (decoder->outBufs)        dce_free(decoder->outBufs);
        if (decoder->inArgs)         dce_free(decoder->inArgs);
        if (decoder->outArgs)        dce_free(decoder->outArgs);
+       if (decoder->codec)          VIDDEC3_delete(decoder->codec);
+       if (decoder->engine)         Engine_close(decoder->engine);
+       if (dev)                     dce_deinit(dev);
        if (decoder->input_bo)       omap_bo_del(decoder->input_bo);
        if (decoder->demux)          demux_deinit(decoder->demux);
        if (decoder->disp)           disp_close(decoder->disp);
@@ -237,6 +237,11 @@ decoder_open(int argc, char **argv)
             decoder->codec = VIDDEC3_create(decoder->engine,
                                         "ivahd_h264dec", decoder->params);
         }
+       else if (decoder->demux->cc->codec_id == CODEC_ID_MPEG4) {
+               first_in_buff = 1;
+               decoder->codec = VIDDEC3_create(decoder->engine,
+                                        "ivahd_mpeg4dec", decoder->params);
+       }
 
        if (!decoder->codec) {
                ERROR("%p: could not create codec", decoder);
@@ -274,6 +279,7 @@ decoder_open(int argc, char **argv)
        decoder->inBufs = dce_alloc(sizeof(XDM2_BufDesc));
        decoder->inBufs->numBufs = 1;
        decoder->inBufs->descs[0].buf = (XDAS_Int8 *)omap_bo_dmabuf(decoder->input_bo);
+       dce_buf_lock(1, &(decoder->inBufs->descs[0].buf));
        decoder->inBufs->descs[0].bufSize.bytes = omap_bo_size(decoder->input_bo);
        decoder->inBufs->descs[0].memType = XDM_MEMTYPE_RAW;
 
@@ -311,6 +317,8 @@ decoder_process(struct decoder *decoder)
        struct buffer *buf;
        int freeBufCount =0;
        int i, n;
+       XDAS_Int32 err;
+       int eof = 0; /* end of file flag */
 
        buf = disp_get_vid_buffer(decoder->disp);
        if (!buf) {
@@ -340,97 +348,122 @@ decoder_process(struct decoder *decoder)
                                MSG("%p: rewound.", decoder);
                                continue;
                        }
+                       eof = 1; /* set the flag for end of file to 1 */
+                       /* Control call call with XDM_FLUSH command */
+                       err = VIDDEC3_control(decoder->codec, XDM_FLUSH,
+                                       decoder->dynParams, decoder->status);
                        inBufs->numBufs = 0;
                        inArgs->inputID = 0;
-                       inArgs->numBytes =0;
-
                }
                break;
        }
 
+        /*set the parameters if it is not the end of file */
+       if (!eof) {
+               inArgs->inputID = (XDAS_Int32)buf;
+               outBufs->descs[0].buf = buf->fd[0];
+               outBufs->descs[1].buf = (buf->multiplanar) ?buf->fd[1]:(XDAS_Int8 *)((outBufs->descs[0].buf));
 
-       inArgs->inputID = (XDAS_Int32)buf;
-       outBufs->descs[0].buf = buf->fd[0];
-       outBufs->descs[1].buf = (buf->multiplanar) ?buf->fd[1]:(XDAS_Int8 *)((outBufs->descs[0].buf));
 
-
-       if(buf->multiplanar){
-               decoder->outBuf_fd[0] = buf->fd[0];
-               decoder->outBuf_fd[1] = buf->fd[1];
-               dce_buf_lock(2,decoder->outBuf_fd);
-       }
-       else{
-               decoder->outBuf_fd[0] = buf->fd[0];
-               dce_buf_lock(1,decoder->outBuf_fd);
-       }
-        decoder->outBufs->descs[0].bufSize.bytes =decoder->padded_width*decoder->padded_height;
-        decoder->outBufs->descs[1].bufSize.bytes = decoder->padded_width* (decoder->padded_height/2);
-
-
-       if (no_process) {
-               /* Do not process. This is for benchmarking. We need to "fake"
-                * the outArgs. */
-               outArgs->outputID[0] = buf;
-               outArgs->outputID[1] = NULL;
-               outArgs->freeBufID[0] = buf;
-               outArgs->freeBufID[1] = NULL;
-               outArgs->outBufsInUseFlag = 0;
-
-       } else {
-               XDAS_Int32 err;
-               suseconds_t tproc;
-               tproc = mark(NULL);
-               err = VIDDEC3_process(decoder->codec, inBufs, outBufs, inArgs, outArgs);
-               DBG("%p: processed returned in: %ldus", decoder, (long int)mark(&tproc));
-               if (err) {
-                       ERROR("%p: process returned error: %d", decoder, err);
-                       ERROR("%p: extendedError: %08x", decoder, outArgs->extendedError);
-                       if (XDM_ISFATALERROR(outArgs->extendedError))
-                               return -1;
+               if(buf->multiplanar){
+                       decoder->outBuf_fd[0] = buf->fd[0];
+                       decoder->outBuf_fd[1] = buf->fd[1];
+                       dce_buf_lock(2,decoder->outBuf_fd);
+               }
+               else{
+                       decoder->outBuf_fd[0] = buf->fd[0];
+                       dce_buf_lock(1,decoder->outBuf_fd);
                }
+               decoder->outBufs->descs[0].bufSize.bytes =decoder->padded_width*decoder->padded_height;
+               decoder->outBufs->descs[1].bufSize.bytes = decoder->padded_width* (decoder->padded_height/2);
        }
 
-       for (i = 0; outArgs->outputID[i]; i++) {
-               /* calculate offset to region of interest */
-               XDM_Rect *r = &(outArgs->displayBufs.bufDesc[0].activeFrameRegion);
+       do {
+               if (no_process) {
+                       /* Do not process. This is for benchmarking. We need to "fake"
+                        * the outArgs. */
+                       outArgs->outputID[0] = buf;
+                       outArgs->outputID[1] = NULL;
+                       outArgs->freeBufID[0] = buf;
+                       outArgs->freeBufID[1] = NULL;
+                       outArgs->outBufsInUseFlag = 0;
 
-               /* get the output buffer and write it to file */
-               buf = (struct buffer *)outArgs->outputID[i];
-               disp_post_vid_buffer(decoder->disp, buf,
-                               r->topLeft.x, r->topLeft.y,
-                               r->bottomRight.x - r->topLeft.x,
-                               r->bottomRight.y - r->topLeft.y);
-       }
+               } else {
+                       suseconds_t tproc;
+                       tproc = mark(NULL);
+                       err = VIDDEC3_process(decoder->codec, inBufs, outBufs, inArgs, outArgs);
+                       DBG("%p: processed returned in: %ldus", decoder, (long int)mark(&tproc));
+                       if (err) {
+                               ERROR("%p: process returned error: %d", decoder, err);
+                               ERROR("%p: extendedError: %08x", decoder, outArgs->extendedError);
+                               if (XDM_ISFATALERROR(outArgs->extendedError))
+                                       return -1;
+                       }
+               }
 
-       for (i = 0; outArgs->freeBufID[i]; i++) {
-               buf = (struct buffer *)outArgs->freeBufID[i];
-               disp_put_vid_buffer(decoder->disp, buf);
+               for (i = 0; outArgs->outputID[i]; i++) {
+                       /* calculate offset to region of interest */
+                       XDM_Rect *r = &(outArgs->displayBufs.bufDesc[0].activeFrameRegion);
 
-               if(buf->multiplanar){
-                       decoder->outBuf_fd[freeBufCount++] = buf->fd[0];
-                       decoder->outBuf_fd[freeBufCount++] = buf->fd[1];
+                       /* get the output buffer and write it to file */
+                       buf = (struct buffer *)outArgs->outputID[i];
+                       disp_post_vid_buffer(decoder->disp, buf,
+                                       r->topLeft.x, r->topLeft.y,
+                                       r->bottomRight.x - r->topLeft.x,
+                                       r->bottomRight.y - r->topLeft.y);
                }
-               else{
-                       decoder->outBuf_fd[freeBufCount++] = buf->fd[0];
+
+               for (i = 0; outArgs->freeBufID[i]; i++) {
+                       buf = (struct buffer *)outArgs->freeBufID[i];
+                       disp_put_vid_buffer(decoder->disp, buf);
+
+                       if(buf->multiplanar){
+                               decoder->outBuf_fd[freeBufCount++] = buf->fd[0];
+                               decoder->outBuf_fd[freeBufCount++] = buf->fd[1];
+                       }
+                       else{
+                               decoder->outBuf_fd[freeBufCount++] = buf->fd[0];
+                       }
                }
-       }
 
-       if(freeBufCount){
-               dce_buf_unlock(freeBufCount,decoder->outBuf_fd);
-               freeBufCount =0;
-       }
-       if (outArgs->outBufsInUseFlag) {
-               MSG("%p: TODO... outBufsInUseFlag", decoder); // XXX
-       }
+               if(freeBufCount){
+                       dce_buf_unlock(freeBufCount,decoder->outBuf_fd);
+                       freeBufCount =0;
+               }
+               if (outArgs->outBufsInUseFlag) {
+                       MSG("%p: TODO... outBufsInUseFlag", decoder); // XXX
+               }
+       } while ((err == 0) && eof);
 
        return (inBufs->numBufs > 0) ? 0 : -1;
 }
 
+void *decode_stream(void *decoderHandle)
+{
+       int n = 0;
+       struct decoder *decoders = (struct decoder*)decoderHandle;
+
+       do {
+               if (decoders) {
+                       int ret = decoder_process(decoders);
+                       if (ret) {
+                               decoder_close(decoders);
+                               decoders = NULL;
+                               n = 0;
+                               continue;
+                       }
+                       n++;
+               }
+       } while(n > 0);
+
+       return NULL;
+}
+
 int
 main(int argc, char **argv)
 {
        struct decoder *decoders[8] = {};
-       int i, n, first = 0, ndecoders = 0;
+       int i, first = 0, ndecoders = 0;
 
        for (i = 1; i < argc; i++) {
                if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
@@ -453,21 +486,29 @@ main(int argc, char **argv)
        }
 
        argv[first] = argv[0];
+
        decoders[ndecoders++] = decoder_open(i - first, &argv[first]);
 
-       do {
-               for (i = 0, n = 0; i < ndecoders; i++) {
+       if (ndecoders > 1) {
+               pthread_t threadIds[8];
+
+               for (i = 0; i < ndecoders; i++) {
                        if (decoders[i]) {
-                               int ret = decoder_process(decoders[i]);
-                               if (ret) {
-                                       decoder_close(decoders[i]);
-                                       decoders[i] = NULL;
-                                       continue;
-                               }
-                               n++;
+                               int ret = pthread_create(&threadIds[i], NULL,
+                                               &decode_stream, decoders[i]);
+                               if (ret != 0)
+                                       ERROR("%p: creation of pthread, error: %d",
+                                                       decoders[i], ret);
                        }
                }
-       } while(n > 0);
+
+               for (i = 0; i < ndecoders; i++) {
+                       pthread_join(threadIds[i], NULL);
+               }
+       }
+       else {
+               decode_stream(decoders[0]);
+       }
 
        return 0;
 }