#include <nx_video_alloc.h>
#include <nx_video_api.h>
#include "nx_video_log.h"
+#ifdef TIZEN_FEATURE_ARTIK530
+#include <pthread.h>
+#endif
/*----------------------------------------------------------------------------*/
#ifdef TIZEN_FEATURE_ARTIK530
/* buffer manager */
void *bufmgr;
+ uint32_t queuedCnt;
+ pthread_mutex_t bufferLock;
#endif
};
}
hDec->codecType = codecType;
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_init(&hDec->bufferLock, NULL);
+#endif
return hDec;
}
}
#ifdef TIZEN_FEATURE_ARTIK530
- if (hDec->bufmgr)
- tbm_bufmgr_deinit (hDec->bufmgr);
+ pthread_mutex_destroy(&hDec->bufferLock);
+ if (hDec->bufmgr)
+ tbm_bufmgr_deinit (hDec->bufmgr);
#endif
free (hDec);
_E ("failed to ioctl: VIDIOC_QBUF(Output YUV - %d)\n", i);
return -1;
}
+#ifdef TIZEN_FEATURE_ARTIK530
+ hDec->hImage[i]->isQueued = 1;
+ hDec->queuedCnt++;
+ _D ("INIT QBUF [%2d] %p (%d)", i, hDec->hImage[i], hDec->queuedCnt);
+#endif
}
type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
if (pDecOut->dispIdx >= 0) {
pDecOut->hImg = *hDec->hImage[buf.index];
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_lock(&hDec->bufferLock);
+
+ hDec->hImage[buf.index]->isQueued = 0;
+ hDec->queuedCnt--;
+ /*_D ("DQBUF [%2d] %p (%d)", buf.index, hDec->hImage[buf.index], hDec->queuedCnt);*/
+
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
pDecOut->timeStamp[DISPLAY_FRAME] =
((uint64_t) buf.timestamp.tv_sec) * 1000 + buf.timestamp.tv_usec / 1000;
pDecOut->outFrmReliable_0_100[DISPLAY_FRAME] = buf.reserved;
if (iFrameIdx >= 0) {
index = iFrameIdx;
+#ifdef TIZEN_FEATURE_ARTIK530
+ hFrameBuf = hDec->hImage[index];
+#endif
} else {
/* Search Buffer Index */
if (hFrameBuf != NULL) {
_E ("Fail, Invalid FrameBuffer or FrameIndex.\n");
return -1;
}
+#ifdef TIZEN_FEATURE_ARTIK530
+ if (!hFrameBuf) {
+ _E ("No frame buffer for index %d", index);
+ return -1;
+ }
+
+ pthread_mutex_lock(&hDec->bufferLock);
+
+ if (hFrameBuf->isQueued) {
+ _E ("This buffer[%2d] is already queued, skip QBUF", index);
+ pthread_mutex_unlock(&hDec->bufferLock);
+ return -1;
+ }
+#endif
memset (&buf, 0, sizeof (buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
if (ioctl (hDec->fd, VIDIOC_QBUF, &buf) != 0) {
_E ("Fail, ioctl(): VIDIOC_QBUF.(Clear Display Index, index = %d)\n",
index);
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
return -1;
}
+#ifdef TIZEN_FEATURE_ARTIK530
+ hFrameBuf->isQueued = 1;
+ hDec->queuedCnt++;
+ /*_D ("QBUF [%2d] %p (%d)", index, hFrameBuf, hDec->queuedCnt);*/
+
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
return 0;
}
_E ("Fail, Invalid Handle.\n");
return -1;
}
-
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_lock(&hDec->bufferLock);
+ hDec->queuedCnt = 0;
+#endif
type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
if (ioctl (hDec->fd, VIDIOC_STREAMOFF, &type) != 0) {
_E ("failed to ioctl: VIDIOC_STREAMOFF(Stream)\n");
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
return -1;
}
type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
if (ioctl (hDec->fd, VIDIOC_STREAMOFF, &type) != 0) {
_E ("failed to ioctl: VIDIOC_STREAMOFF(Image)\n");
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
return -1;
}
type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
if (ioctl (hDec->fd, VIDIOC_STREAMON, &type) != 0) {
_E ("Fail, ioctl(): VIDIOC_STREAMON. (Input)\n");
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
return -1;
}
type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
if (ioctl (hDec->fd, VIDIOC_STREAMON, &type) != 0) {
_E ("failed to ioctl: VIDIOC_STREAMON\n");
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
return -1;
}
-
{
struct v4l2_plane planes[3];
struct v4l2_buffer buf;
if (ioctl (hDec->fd, VIDIOC_QBUF, &buf) != 0) {
_E ("failed to ioctl: VIDIOC_QBUF(Output YUV - %d)\n", i);
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
return -1;
}
+#ifdef TIZEN_FEATURE_ARTIK530
+ hDec->hImage[i]->isQueued = 1;
+ hDec->queuedCnt++;
+ _D ("FLUSH QBUF [%2d] %p (%d)", i, hDec->hImage[i], hDec->queuedCnt);
+#endif
}
}
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
return 0;
}