diff --git a/viddec3test.c b/viddec3test.c
index 53004f1d7d54c45bf07293dce2f055066b1b1ecd..20fc252b2bf6f08004275c69914dc08f01b5e199 100644 (file)
--- a/viddec3test.c
+++ b/viddec3test.c
#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
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);
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);
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;
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) {
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")) {
}
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;
}