- If queued buffer is queued again, kernel warning could be occurred when call VIDIOC_DQBUF.
[Version] 1.1.2
[Profile] Common
[Issue Type] Bug fix
Change-Id: I1486968d37189a90859823a99669ed9cea4b6717
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
Release: 0
License: LGPL-2.1+
Summary: Nexell video APIs
Release: 0
License: LGPL-2.1+
Summary: Nexell video APIs
libnx_video_api_la_LTLIBRARIES = libnx_video_api.la
libnx_video_api_ladir = ${libdir}
libnx_video_api_la_LTLIBRARIES = libnx_video_api.la
libnx_video_api_ladir = ${libdir}
-libnx_video_api_la_LDFLAGS = -L${libdir} -ldrm -ltbm $(DLOG_LIBS)
+libnx_video_api_la_LDFLAGS = -L${libdir} -ldrm -ltbm $(DLOG_LIBS) -lpthread
libnx_video_api_la_SOURCES = \
nx_video_alloc.c \
libnx_video_api_la_SOURCES = \
nx_video_alloc.c \
#include <linux/videodev2_nxp_media.h>
#ifdef TIZEN_FEATURE_ARTIK530
#include <tbm_bufmgr.h>
#include <linux/videodev2_nxp_media.h>
#ifdef TIZEN_FEATURE_ARTIK530
#include <tbm_bufmgr.h>
#endif
#include "nx_video_log.h"
#endif
#include "nx_video_log.h"
goto alloc_bo_fail;
#endif
}
goto alloc_bo_fail;
#endif
}
- pVidMem->surface = tbm_surface_internal_create_with_bos (&info, pVidMem->bo, planes);
+#ifdef TIZEN_FEATURE_ARTIK530
+ pVidMem->surface = tbm_surface_internal_create_with_bos (&info, (tbm_bo *)pVidMem->bo, planes);
if (!pVidMem->surface)
goto alloc_bo_fail;
if (!pVidMem->surface)
goto alloc_bo_fail;
#ifdef TIZEN_FEATURE_ARTIK530
void *bo[NX_MAX_PLANES]; // tbm bo
tbm_surface_h surface;
#ifdef TIZEN_FEATURE_ARTIK530
void *bo[NX_MAX_PLANES]; // tbm bo
tbm_surface_h surface;
#endif
} NX_VID_MEMORY_INFO, *NX_VID_MEMORY_HANDLE;
#endif
} NX_VID_MEMORY_INFO, *NX_VID_MEMORY_HANDLE;
#include <nx_video_alloc.h>
#include <nx_video_api.h>
#include "nx_video_log.h"
#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;
#ifdef TIZEN_FEATURE_ARTIK530
/* buffer manager */
void *bufmgr;
+ uint32_t queuedCnt;
+ pthread_mutex_t bufferLock;
}
hDec->codecType = codecType;
}
hDec->codecType = codecType;
+#ifdef TIZEN_FEATURE_ARTIK530
+ pthread_mutex_init(&hDec->bufferLock, NULL);
+#endif
}
}
#ifdef TIZEN_FEATURE_ARTIK530
}
}
#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);
_E ("failed to ioctl: VIDIOC_QBUF(Output YUV - %d)\n", i);
return -1;
}
_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;
}
type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
if (pDecOut->dispIdx >= 0) {
pDecOut->hImg = *hDec->hImage[buf.index];
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;
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;
if (iFrameIdx >= 0) {
index = iFrameIdx;
+#ifdef TIZEN_FEATURE_ARTIK530
+ hFrameBuf = hDec->hImage[index];
+#endif
} else {
/* Search Buffer Index */
if (hFrameBuf != NULL) {
} else {
/* Search Buffer Index */
if (hFrameBuf != NULL) {
_E ("Fail, Invalid FrameBuffer or FrameIndex.\n");
return -1;
}
_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;
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);
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
+#ifdef TIZEN_FEATURE_ARTIK530
+ hFrameBuf->isQueued = 1;
+ hDec->queuedCnt++;
+ /*_D ("QBUF [%2d] %p (%d)", index, hFrameBuf, hDec->queuedCnt);*/
+
+ pthread_mutex_unlock(&hDec->bufferLock);
+#endif
_E ("Fail, Invalid Handle.\n");
return -1;
}
_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");
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");
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");
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");
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
{
struct v4l2_plane planes[3];
struct v4l2_buffer buf;
{
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);
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
+#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