mm-video-v4l2: format and indent mm-video-v4l2 code
This change will uniformly indent all of
mm-video-v4l2 code.
Change-Id: If3c0c4e61cac688d7d7b3a3d3de28b67cd5abf31
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
index e04cb0c..1cc9e01 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -121,9 +121,9 @@
#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
#ifdef _ANDROID_
- extern "C"{
- #include<utils/Log.h>
- }
+extern "C" {
+#include<utils/Log.h>
+}
#endif//_ANDROID_
#define SZ_4K 0x1000
@@ -136,163 +136,158 @@
#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
void* async_message_thread (void *input)
{
- OMX_BUFFERHEADERTYPE *buffer;
- struct v4l2_plane plane[VIDEO_MAX_PLANES];
- struct pollfd pfd;
- struct v4l2_buffer v4l2_buf;
- memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
- struct v4l2_event dqevent;
- omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
- pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
- pfd.fd = omx->drv_ctx.video_driver_fd;
- int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
- DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
- prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
- while (1)
- {
- rc = poll(&pfd, 1, POLL_TIMEOUT);
- if (!rc) {
- DEBUG_PRINT_ERROR("Poll timedout\n");
- break;
- } else if (rc < 0) {
- DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
- break;
+ OMX_BUFFERHEADERTYPE *buffer;
+ struct v4l2_plane plane[VIDEO_MAX_PLANES];
+ struct pollfd pfd;
+ struct v4l2_buffer v4l2_buf;
+ memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
+ struct v4l2_event dqevent;
+ omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
+ pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
+ pfd.fd = omx->drv_ctx.video_driver_fd;
+ int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
+ DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
+ prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
+ while (1) {
+ rc = poll(&pfd, 1, POLL_TIMEOUT);
+ if (!rc) {
+ DEBUG_PRINT_ERROR("Poll timedout\n");
+ break;
+ } else if (rc < 0) {
+ DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
+ break;
+ }
+ if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
+ struct vdec_msginfo vdec_msg;
+ v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+ v4l2_buf.length = omx->drv_ctx.num_planes;
+ v4l2_buf.m.planes = plane;
+ while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
+ vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
+ vdec_msg.status_code=VDEC_S_SUCCESS;
+ vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
+ vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
+ vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
+ vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
+ (uint64_t)v4l2_buf.timestamp.tv_usec;
+ if (vdec_msg.msgdata.output_frame.len) {
+ vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
+ vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
+ vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
+ vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
+ }
+ if (omx->async_message_process(input,&vdec_msg) < 0) {
+ DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
+ break;
+ }
+ }
+ }
+ if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
+ struct vdec_msginfo vdec_msg;
+ v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+ v4l2_buf.length = 1;
+ v4l2_buf.m.planes = plane;
+ while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
+ vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
+ vdec_msg.status_code=VDEC_S_SUCCESS;
+ vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
+ if (omx->async_message_process(input,&vdec_msg) < 0) {
+ DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
+ break;
+ }
+ }
+ }
+ if (pfd.revents & POLLPRI) {
+ rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
+ if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
+ struct vdec_msginfo vdec_msg;
+ vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
+ vdec_msg.status_code=VDEC_S_SUCCESS;
+ DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved insufficient\n");
+ if (omx->async_message_process(input,&vdec_msg) < 0) {
+ DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
+ break;
+ }
+ } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
+ struct vdec_msginfo vdec_msg;
+ vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
+ vdec_msg.status_code=VDEC_S_SUCCESS;
+ DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved \n");
+ if (omx->async_message_process(input,&vdec_msg) < 0) {
+ DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
+ break;
+ }
+ vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
+ vdec_msg.status_code=VDEC_S_SUCCESS;
+ DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved \n");
+ if (omx->async_message_process(input,&vdec_msg) < 0) {
+ DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
+ break;
+ }
+ } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
+ DEBUG_PRINT_HIGH("\n VIDC Close Done Recieved and async_message_thread Exited \n");
+ break;
+ } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
+ struct vdec_msginfo vdec_msg;
+ vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
+ vdec_msg.status_code=VDEC_S_SUCCESS;
+ DEBUG_PRINT_HIGH("\n SYS Error Recieved \n");
+ if (omx->async_message_process(input,&vdec_msg) < 0) {
+ DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
+ break;
+ }
+ } else {
+ DEBUG_PRINT_HIGH("\n VIDC Some Event recieved \n");
+ continue;
+ }
+ }
}
- if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
- struct vdec_msginfo vdec_msg;
- v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- v4l2_buf.memory = V4L2_MEMORY_USERPTR;
- v4l2_buf.length = omx->drv_ctx.num_planes;
- v4l2_buf.m.planes = plane;
- while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
- vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
- vdec_msg.status_code=VDEC_S_SUCCESS;
- vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
- vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
- vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
- vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
- (uint64_t)v4l2_buf.timestamp.tv_usec;
- if (vdec_msg.msgdata.output_frame.len) {
- vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
- vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
- vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
- vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
- }
- if (omx->async_message_process(input,&vdec_msg) < 0) {
- DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
- break;
- }
- }
- }
- if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
- struct vdec_msginfo vdec_msg;
- v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- v4l2_buf.memory = V4L2_MEMORY_USERPTR;
- v4l2_buf.length = 1;
- v4l2_buf.m.planes = plane;
- while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
- vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
- vdec_msg.status_code=VDEC_S_SUCCESS;
- vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
- if (omx->async_message_process(input,&vdec_msg) < 0) {
- DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
- break;
- }
- }
- }
- if (pfd.revents & POLLPRI){
- rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
- if(dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
- struct vdec_msginfo vdec_msg;
- vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
- vdec_msg.status_code=VDEC_S_SUCCESS;
- DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved insufficient\n");
- if (omx->async_message_process(input,&vdec_msg) < 0) {
- DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
- break;
- }
- } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
- struct vdec_msginfo vdec_msg;
- vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
- vdec_msg.status_code=VDEC_S_SUCCESS;
- DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved \n");
- if (omx->async_message_process(input,&vdec_msg) < 0) {
- DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
- break;
- }
- vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
- vdec_msg.status_code=VDEC_S_SUCCESS;
- DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved \n");
- if (omx->async_message_process(input,&vdec_msg) < 0) {
- DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
- break;
- }
- } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
- DEBUG_PRINT_HIGH("\n VIDC Close Done Recieved and async_message_thread Exited \n");
- break;
- } else if(dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
- struct vdec_msginfo vdec_msg;
- vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
- vdec_msg.status_code=VDEC_S_SUCCESS;
- DEBUG_PRINT_HIGH("\n SYS Error Recieved \n");
- if (omx->async_message_process(input,&vdec_msg) < 0) {
- DEBUG_PRINT_HIGH("\n async_message_thread Exited \n");
- break;
- }
- } else {
- DEBUG_PRINT_HIGH("\n VIDC Some Event recieved \n");
- continue;
- }
- }
- }
- DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
- return NULL;
+ DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
+ return NULL;
}
void* message_thread(void *input)
{
- omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
- unsigned char id;
- int n;
+ omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
+ unsigned char id;
+ int n;
- DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
- prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
- while (1)
- {
+ DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
+ prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
+ while (1) {
- n = read(omx->m_pipe_in, &id, 1);
+ n = read(omx->m_pipe_in, &id, 1);
- if(0 == n)
- {
- break;
+ if (0 == n) {
+ break;
+ }
+
+ if (1 == n) {
+ omx->process_event_cb(omx, id);
+ }
+ if ((n < 0) && (errno != EINTR)) {
+ DEBUG_PRINT_LOW("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
+ break;
+ }
}
-
- if (1 == n)
- {
- omx->process_event_cb(omx, id);
- }
- if ((n < 0) && (errno != EINTR))
- {
- DEBUG_PRINT_LOW("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
- break;
- }
- }
- DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
- return 0;
+ DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
+ return 0;
}
void post_message(omx_vdec *omx, unsigned char id)
{
- int ret_value;
- DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
- ret_value = write(omx->m_pipe_out, &id, 1);
- DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
+ int ret_value;
+ DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
+ ret_value = write(omx->m_pipe_out, &id, 1);
+ DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
}
// omx_cmd_queue destructor
omx_vdec::omx_cmd_queue::~omx_cmd_queue()
{
- // Nothing to do
+ // Nothing to do
}
// omx cmd queue constructor
@@ -304,49 +299,41 @@
// omx cmd queue insert
bool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
{
- bool ret = true;
- if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
- {
- m_q[m_write].id = id;
- m_q[m_write].param1 = p1;
- m_q[m_write].param2 = p2;
- m_write++;
- m_size ++;
- if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
- {
- m_write = 0;
+ bool ret = true;
+ if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
+ m_q[m_write].id = id;
+ m_q[m_write].param1 = p1;
+ m_q[m_write].param2 = p2;
+ m_write++;
+ m_size ++;
+ if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+ m_write = 0;
+ }
+ } else {
+ ret = false;
+ DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
}
- }
- else
- {
- ret = false;
- DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
- }
- return ret;
+ return ret;
}
// omx cmd queue pop
bool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
{
- bool ret = true;
- if (m_size > 0)
- {
- *id = m_q[m_read].id;
- *p1 = m_q[m_read].param1;
- *p2 = m_q[m_read].param2;
- // Move the read pointer ahead
- ++m_read;
- --m_size;
- if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
- {
- m_read = 0;
+ bool ret = true;
+ if (m_size > 0) {
+ *id = m_q[m_read].id;
+ *p1 = m_q[m_read].param1;
+ *p2 = m_q[m_read].param2;
+ // Move the read pointer ahead
+ ++m_read;
+ --m_size;
+ if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
+ m_read = 0;
+ }
+ } else {
+ ret = false;
}
- }
- else
- {
- ret = false;
- }
- return ret;
+ return ret;
}
// Retrieve the first mesg type in the queue
@@ -358,116 +345,104 @@
#ifdef _ANDROID_
omx_vdec::ts_arr_list::ts_arr_list()
{
- //initialize timestamps array
- memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
+ //initialize timestamps array
+ memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
}
omx_vdec::ts_arr_list::~ts_arr_list()
{
- //free m_ts_arr_list?
+ //free m_ts_arr_list?
}
bool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
{
- bool ret = true;
- bool duplicate_ts = false;
- int idx = 0;
+ bool ret = true;
+ bool duplicate_ts = false;
+ int idx = 0;
- //insert at the first available empty location
- for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
- {
- if (!m_ts_arr_list[idx].valid)
- {
- //found invalid or empty entry, save timestamp
- m_ts_arr_list[idx].valid = true;
- m_ts_arr_list[idx].timestamp = ts;
- DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
- ts, idx);
- break;
+ //insert at the first available empty location
+ for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
+ if (!m_ts_arr_list[idx].valid) {
+ //found invalid or empty entry, save timestamp
+ m_ts_arr_list[idx].valid = true;
+ m_ts_arr_list[idx].timestamp = ts;
+ DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
+ ts, idx);
+ break;
+ }
}
- }
- if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS)
- {
- DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
- ret = false;
- }
- return ret;
+ if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
+ DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
+ ret = false;
+ }
+ return ret;
}
bool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
{
- bool ret = true;
- int min_idx = -1;
- OMX_TICKS min_ts = 0;
- int idx = 0;
+ bool ret = true;
+ int min_idx = -1;
+ OMX_TICKS min_ts = 0;
+ int idx = 0;
- for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
- {
+ for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
- if (m_ts_arr_list[idx].valid)
- {
- //found valid entry, save index
- if (min_idx < 0)
- {
- //first valid entry
- min_ts = m_ts_arr_list[idx].timestamp;
- min_idx = idx;
- }
- else if (m_ts_arr_list[idx].timestamp < min_ts)
- {
- min_ts = m_ts_arr_list[idx].timestamp;
- min_idx = idx;
- }
+ if (m_ts_arr_list[idx].valid) {
+ //found valid entry, save index
+ if (min_idx < 0) {
+ //first valid entry
+ min_ts = m_ts_arr_list[idx].timestamp;
+ min_idx = idx;
+ } else if (m_ts_arr_list[idx].timestamp < min_ts) {
+ min_ts = m_ts_arr_list[idx].timestamp;
+ min_idx = idx;
+ }
+ }
+
}
- }
+ if (min_idx < 0) {
+ //no valid entries found
+ DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
+ ts = 0;
+ ret = false;
+ } else {
+ ts = m_ts_arr_list[min_idx].timestamp;
+ m_ts_arr_list[min_idx].valid = false;
+ DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
+ ts, min_idx);
+ }
- if (min_idx < 0)
- {
- //no valid entries found
- DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
- ts = 0;
- ret = false;
- }
- else
- {
- ts = m_ts_arr_list[min_idx].timestamp;
- m_ts_arr_list[min_idx].valid = false;
- DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
- ts, min_idx);
- }
-
- return ret;
+ return ret;
}
bool omx_vdec::ts_arr_list::reset_ts_list()
{
- bool ret = true;
- int idx = 0;
+ bool ret = true;
+ int idx = 0;
- DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
- for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
- {
- m_ts_arr_list[idx].valid = false;
- }
- return ret;
+ DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
+ for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
+ m_ts_arr_list[idx].valid = false;
+ }
+ return ret;
}
#endif
// factory function executed by the core to create instances
void *get_omx_component_factory_fn(void)
{
- return (new omx_vdec);
+ return (new omx_vdec);
}
#ifdef _ANDROID_
#ifdef USE_ION
VideoHeap::VideoHeap(int devicefd, size_t size, void* base,
- struct ion_handle *handle, int ionMapfd)
+ struct ion_handle *handle, int ionMapfd)
{
-// ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
+ // ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
}
#else
VideoHeap::VideoHeap(int fd, size_t size, void* base)
@@ -478,859 +453,760 @@
#endif
#endif // _ANDROID_
/* ======================================================================
-FUNCTION
- omx_vdec::omx_vdec
+ FUNCTION
+ omx_vdec::omx_vdec
-DESCRIPTION
- Constructor
+ DESCRIPTION
+ Constructor
-PARAMETERS
- None
+ PARAMETERS
+ None
-RETURN VALUE
- None.
-========================================================================== */
+ RETURN VALUE
+ None.
+ ========================================================================== */
omx_vdec::omx_vdec(): m_error_propogated(false),
- m_state(OMX_StateInvalid),
- m_app_data(NULL),
- m_inp_mem_ptr(NULL),
- m_out_mem_ptr(NULL),
- m_inp_err_count(0),
- input_flush_progress (false),
- output_flush_progress (false),
- input_use_buffer (false),
- output_use_buffer (false),
- ouput_egl_buffers(false),
- m_use_output_pmem(OMX_FALSE),
- m_out_mem_region_smi(OMX_FALSE),
- m_out_pvt_entry_pmem(OMX_FALSE),
- pending_input_buffers(0),
- pending_output_buffers(0),
- m_out_bm_count(0),
- m_inp_bm_count(0),
- m_inp_bPopulated(OMX_FALSE),
- m_out_bPopulated(OMX_FALSE),
- m_flags(0),
+ m_state(OMX_StateInvalid),
+ m_app_data(NULL),
+ m_inp_mem_ptr(NULL),
+ m_out_mem_ptr(NULL),
+ m_inp_err_count(0),
+ input_flush_progress (false),
+ output_flush_progress (false),
+ input_use_buffer (false),
+ output_use_buffer (false),
+ ouput_egl_buffers(false),
+ m_use_output_pmem(OMX_FALSE),
+ m_out_mem_region_smi(OMX_FALSE),
+ m_out_pvt_entry_pmem(OMX_FALSE),
+ pending_input_buffers(0),
+ pending_output_buffers(0),
+ m_out_bm_count(0),
+ m_inp_bm_count(0),
+ m_inp_bPopulated(OMX_FALSE),
+ m_out_bPopulated(OMX_FALSE),
+ m_flags(0),
#ifdef _ANDROID_
- m_heap_ptr(NULL),
+ m_heap_ptr(NULL),
#endif
- m_inp_bEnabled(OMX_TRUE),
- m_out_bEnabled(OMX_TRUE),
- m_in_alloc_cnt(0),
- m_platform_list(NULL),
- m_platform_entry(NULL),
- m_pmem_info(NULL),
- arbitrary_bytes (true),
- psource_frame (NULL),
- pdest_frame (NULL),
- m_inp_heap_ptr (NULL),
- m_phdr_pmem_ptr(NULL),
- m_heap_inp_bm_count (0),
- codec_type_parse ((codec_type)0),
- first_frame_meta (true),
- frame_count (0),
- nal_count (0),
- nal_length(0),
- look_ahead_nal (false),
- first_frame(0),
- first_buffer(NULL),
- first_frame_size (0),
- m_device_file_ptr(NULL),
- m_vc1_profile((vc1_profile_type)0),
- m_profile(0),
- h264_last_au_ts(LLONG_MAX),
- h264_last_au_flags(0),
- prev_ts(LLONG_MAX),
- rst_prev_ts(true),
- frm_int(0),
- m_disp_hor_size(0),
- m_disp_vert_size(0),
- in_reconfig(false),
- m_display_id(NULL),
- h264_parser(NULL),
- client_extradata(0),
- m_reject_avc_1080p_mp (0),
+ m_inp_bEnabled(OMX_TRUE),
+ m_out_bEnabled(OMX_TRUE),
+ m_in_alloc_cnt(0),
+ m_platform_list(NULL),
+ m_platform_entry(NULL),
+ m_pmem_info(NULL),
+ arbitrary_bytes (true),
+ psource_frame (NULL),
+ pdest_frame (NULL),
+ m_inp_heap_ptr (NULL),
+ m_phdr_pmem_ptr(NULL),
+ m_heap_inp_bm_count (0),
+ codec_type_parse ((codec_type)0),
+ first_frame_meta (true),
+ frame_count (0),
+ nal_count (0),
+ nal_length(0),
+ look_ahead_nal (false),
+ first_frame(0),
+ first_buffer(NULL),
+ first_frame_size (0),
+ m_device_file_ptr(NULL),
+ m_vc1_profile((vc1_profile_type)0),
+ m_profile(0),
+ h264_last_au_ts(LLONG_MAX),
+ h264_last_au_flags(0),
+ prev_ts(LLONG_MAX),
+ rst_prev_ts(true),
+ frm_int(0),
+ m_disp_hor_size(0),
+ m_disp_vert_size(0),
+ in_reconfig(false),
+ m_display_id(NULL),
+ h264_parser(NULL),
+ client_extradata(0),
+ m_reject_avc_1080p_mp (0),
#ifdef _ANDROID_
- m_enable_android_native_buffers(OMX_FALSE),
- m_use_android_native_buffers(OMX_FALSE),
- iDivXDrmDecrypt(NULL),
+ m_enable_android_native_buffers(OMX_FALSE),
+ m_use_android_native_buffers(OMX_FALSE),
+ iDivXDrmDecrypt(NULL),
#endif
- m_desc_buffer_ptr(NULL),
- secure_mode(false),
- client_set_fps(false)
+ m_desc_buffer_ptr(NULL),
+ secure_mode(false),
+ client_set_fps(false)
{
- /* Assumption is that , to begin with , we have all the frames with decoder */
- DEBUG_PRINT_HIGH("In OMX vdec Constructor");
+ /* Assumption is that , to begin with , we have all the frames with decoder */
+ DEBUG_PRINT_HIGH("In OMX vdec Constructor");
#ifdef _ANDROID_
- char property_value[PROPERTY_VALUE_MAX] = {0};
- property_get("vidc.dec.debug.perf", property_value, "0");
- perf_flag = atoi(property_value);
- if (perf_flag)
- {
- DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
- dec_time.start();
- proc_frms = latency = 0;
- }
- prev_n_filled_len = 0;
- property_value[0] = '\0';
- property_get("vidc.dec.debug.ts", property_value, "0");
- m_debug_timestamp = atoi(property_value);
- DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
- if (m_debug_timestamp)
- {
- time_stamp_dts.set_timestamp_reorder_mode(true);
- time_stamp_dts.enable_debug_print(true);
- }
+ char property_value[PROPERTY_VALUE_MAX] = {0};
+ property_get("vidc.dec.debug.perf", property_value, "0");
+ perf_flag = atoi(property_value);
+ if (perf_flag) {
+ DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
+ dec_time.start();
+ proc_frms = latency = 0;
+ }
+ prev_n_filled_len = 0;
+ property_value[0] = '\0';
+ property_get("vidc.dec.debug.ts", property_value, "0");
+ m_debug_timestamp = atoi(property_value);
+ DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
+ if (m_debug_timestamp) {
+ time_stamp_dts.set_timestamp_reorder_mode(true);
+ time_stamp_dts.enable_debug_print(true);
+ }
- property_value[0] = '\0';
- property_get("vidc.dec.debug.concealedmb", property_value, "0");
- m_debug_concealedmb = atoi(property_value);
- DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
+ property_value[0] = '\0';
+ property_get("vidc.dec.debug.concealedmb", property_value, "0");
+ m_debug_concealedmb = atoi(property_value);
+ DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
- property_value[0] = '\0';
- property_get("vidc.dec.profile.check", property_value, "0");
- m_reject_avc_1080p_mp = atoi(property_value);
- DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp);
+ property_value[0] = '\0';
+ property_get("vidc.dec.profile.check", property_value, "0");
+ m_reject_avc_1080p_mp = atoi(property_value);
+ DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp);
#endif
- memset(&m_cmp,0,sizeof(m_cmp));
- memset(&m_cb,0,sizeof(m_cb));
- memset (&drv_ctx,0,sizeof(drv_ctx));
- memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
- memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
- memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
- m_demux_entries = 0;
- msg_thread_id = 0;
- async_thread_id = 0;
- msg_thread_created = false;
- async_thread_created = false;
+ memset(&m_cmp,0,sizeof(m_cmp));
+ memset(&m_cb,0,sizeof(m_cb));
+ memset (&drv_ctx,0,sizeof(drv_ctx));
+ memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
+ memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
+ memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+ m_demux_entries = 0;
+ msg_thread_id = 0;
+ async_thread_id = 0;
+ msg_thread_created = false;
+ async_thread_created = false;
#ifdef _ANDROID_ICS_
- memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+ memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
#endif
- memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
- drv_ctx.timestamp_adjust = false;
- drv_ctx.video_driver_fd = -1;
- m_vendor_config.pData = NULL;
- pthread_mutex_init(&m_lock, NULL);
- pthread_mutex_init(&c_lock, NULL);
- sem_init(&m_cmd_lock,0,0);
- streaming[CAPTURE_PORT] =
- streaming[OUTPUT_PORT] = false;
+ memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
+ drv_ctx.timestamp_adjust = false;
+ drv_ctx.video_driver_fd = -1;
+ m_vendor_config.pData = NULL;
+ pthread_mutex_init(&m_lock, NULL);
+ pthread_mutex_init(&c_lock, NULL);
+ sem_init(&m_cmd_lock,0,0);
+ streaming[CAPTURE_PORT] =
+ streaming[OUTPUT_PORT] = false;
#ifdef _ANDROID_
- char extradata_value[PROPERTY_VALUE_MAX] = {0};
- property_get("vidc.dec.debug.extradata", extradata_value, "0");
- m_debug_extradata = atoi(extradata_value);
- DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
+ char extradata_value[PROPERTY_VALUE_MAX] = {0};
+ property_get("vidc.dec.debug.extradata", extradata_value, "0");
+ m_debug_extradata = atoi(extradata_value);
+ DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
#endif
- m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
- client_buffers.set_vdec_client(this);
+ m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
+ client_buffers.set_vdec_client(this);
}
static const int event_type[] = {
- V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
- V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
- V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
- V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
- V4L2_EVENT_MSM_VIDC_SYS_ERROR
+ V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
+ V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
+ V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
+ V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
+ V4L2_EVENT_MSM_VIDC_SYS_ERROR
};
static OMX_ERRORTYPE subscribe_to_events(int fd)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- struct v4l2_event_subscription sub;
- int array_sz = sizeof(event_type)/sizeof(int);
- int i,rc;
- if (fd < 0) {
- printf("Invalid input: %d\n", fd);
- return OMX_ErrorBadParameter;
- }
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ struct v4l2_event_subscription sub;
+ int array_sz = sizeof(event_type)/sizeof(int);
+ int i,rc;
+ if (fd < 0) {
+ printf("Invalid input: %d\n", fd);
+ return OMX_ErrorBadParameter;
+ }
- for (i = 0; i < array_sz; ++i) {
- memset(&sub, 0, sizeof(sub));
- sub.type = event_type[i];
- rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
- if (rc) {
- printf("Failed to subscribe event: 0x%x\n", sub.type);
- break;
- }
- }
- if (i < array_sz) {
- for (--i; i >=0 ; i--) {
- memset(&sub, 0, sizeof(sub));
- sub.type = event_type[i];
- rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
- if (rc)
- printf("Failed to unsubscribe event: 0x%x\n", sub.type);
- }
- eRet = OMX_ErrorNotImplemented;
- }
- return eRet;
+ for (i = 0; i < array_sz; ++i) {
+ memset(&sub, 0, sizeof(sub));
+ sub.type = event_type[i];
+ rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
+ if (rc) {
+ printf("Failed to subscribe event: 0x%x\n", sub.type);
+ break;
+ }
+ }
+ if (i < array_sz) {
+ for (--i; i >=0 ; i--) {
+ memset(&sub, 0, sizeof(sub));
+ sub.type = event_type[i];
+ rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+ if (rc)
+ printf("Failed to unsubscribe event: 0x%x\n", sub.type);
+ }
+ eRet = OMX_ErrorNotImplemented;
+ }
+ return eRet;
}
static OMX_ERRORTYPE unsubscribe_to_events(int fd)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- struct v4l2_event_subscription sub;
- int array_sz = sizeof(event_type)/sizeof(int);
- int i,rc;
- if (fd < 0) {
- printf("Invalid input: %d\n", fd);
- return OMX_ErrorBadParameter;
- }
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ struct v4l2_event_subscription sub;
+ int array_sz = sizeof(event_type)/sizeof(int);
+ int i,rc;
+ if (fd < 0) {
+ printf("Invalid input: %d\n", fd);
+ return OMX_ErrorBadParameter;
+ }
- for (i = 0; i < array_sz; ++i) {
- memset(&sub, 0, sizeof(sub));
- sub.type = event_type[i];
- rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
- if (rc) {
- printf("Failed to unsubscribe event: 0x%x\n", sub.type);
- break;
- }
- }
- return eRet;
+ for (i = 0; i < array_sz; ++i) {
+ memset(&sub, 0, sizeof(sub));
+ sub.type = event_type[i];
+ rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+ if (rc) {
+ printf("Failed to unsubscribe event: 0x%x\n", sub.type);
+ break;
+ }
+ }
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::~omx_vdec
+ FUNCTION
+ omx_vdec::~omx_vdec
-DESCRIPTION
- Destructor
+ DESCRIPTION
+ Destructor
-PARAMETERS
- None
+ PARAMETERS
+ None
-RETURN VALUE
- None.
-========================================================================== */
+ RETURN VALUE
+ None.
+ ========================================================================== */
omx_vdec::~omx_vdec()
{
- m_pmem_info = NULL;
- struct v4l2_decoder_cmd dec;
- DEBUG_PRINT_HIGH("In OMX vdec Destructor");
- if(m_pipe_in) close(m_pipe_in);
- if(m_pipe_out) close(m_pipe_out);
- m_pipe_in = -1;
- m_pipe_out = -1;
- DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
- if (msg_thread_created)
- pthread_join(msg_thread_id,NULL);
- DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
- dec.cmd = V4L2_DEC_CMD_STOP;
- if (drv_ctx.video_driver_fd >=0 ) {
- if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
- DEBUG_PRINT_ERROR("\n STOP Command failed\n");
- }
- if (async_thread_created)
- pthread_join(async_thread_id,NULL);
- unsubscribe_to_events(drv_ctx.video_driver_fd);
- close(drv_ctx.video_driver_fd);
- pthread_mutex_destroy(&m_lock);
- pthread_mutex_destroy(&c_lock);
- sem_destroy(&m_cmd_lock);
- if (perf_flag)
- {
- DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
- dec_time.end();
- }
- DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
+ m_pmem_info = NULL;
+ struct v4l2_decoder_cmd dec;
+ DEBUG_PRINT_HIGH("In OMX vdec Destructor");
+ if (m_pipe_in) close(m_pipe_in);
+ if (m_pipe_out) close(m_pipe_out);
+ m_pipe_in = -1;
+ m_pipe_out = -1;
+ DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
+ if (msg_thread_created)
+ pthread_join(msg_thread_id,NULL);
+ DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
+ dec.cmd = V4L2_DEC_CMD_STOP;
+ if (drv_ctx.video_driver_fd >=0 ) {
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
+ DEBUG_PRINT_ERROR("\n STOP Command failed\n");
+ }
+ if (async_thread_created)
+ pthread_join(async_thread_id,NULL);
+ unsubscribe_to_events(drv_ctx.video_driver_fd);
+ close(drv_ctx.video_driver_fd);
+ pthread_mutex_destroy(&m_lock);
+ pthread_mutex_destroy(&c_lock);
+ sem_destroy(&m_cmd_lock);
+ if (perf_flag) {
+ DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
+ dec_time.end();
+ }
+ DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
}
-int release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) {
- struct v4l2_requestbuffers bufreq;
- int rc = 0;
- if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
- bufreq.memory = V4L2_MEMORY_USERPTR;
- bufreq.count = 0;
- bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
- }
- return rc;
+int release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
+{
+ struct v4l2_requestbuffers bufreq;
+ int rc = 0;
+ if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+ bufreq.memory = V4L2_MEMORY_USERPTR;
+ bufreq.count = 0;
+ bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
+ }
+ return rc;
}
/* ======================================================================
-FUNCTION
- omx_vdec::OMXCntrlProcessMsgCb
+ FUNCTION
+ omx_vdec::OMXCntrlProcessMsgCb
-DESCRIPTION
- IL Client callbacks are generated through this routine. The decoder
- provides the thread context for this routine.
+ DESCRIPTION
+ IL Client callbacks are generated through this routine. The decoder
+ provides the thread context for this routine.
-PARAMETERS
- ctxt -- Context information related to the self.
- id -- Event identifier. This could be any of the following:
- 1. Command completion event
- 2. Buffer done callback event
- 3. Frame done callback event
+ PARAMETERS
+ ctxt -- Context information related to the self.
+ id -- Event identifier. This could be any of the following:
+ 1. Command completion event
+ 2. Buffer done callback event
+ 3. Frame done callback event
-RETURN VALUE
- None.
+ RETURN VALUE
+ None.
-========================================================================== */
+ ========================================================================== */
void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
{
- signed p1; // Parameter - 1
- signed p2; // Parameter - 2
- unsigned ident;
- unsigned qsize=0; // qsize
- omx_vdec *pThis = (omx_vdec *) ctxt;
+ signed p1; // Parameter - 1
+ signed p2; // Parameter - 2
+ unsigned ident;
+ unsigned qsize=0; // qsize
+ omx_vdec *pThis = (omx_vdec *) ctxt;
- if(!pThis)
- {
- DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
- __func__);
- return;
- }
-
- // Protect the shared queue data structure
- do
- {
- /*Read the message id's from the queue*/
- pthread_mutex_lock(&pThis->m_lock);
- qsize = pThis->m_cmd_q.m_size;
- if(qsize)
- {
- pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
+ if (!pThis) {
+ DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
+ __func__);
+ return;
}
- if (qsize == 0 && pThis->m_state != OMX_StatePause)
- {
- qsize = pThis->m_ftb_q.m_size;
- if (qsize)
- {
- pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
- }
- }
-
- if (qsize == 0 && pThis->m_state != OMX_StatePause)
- {
- qsize = pThis->m_etb_q.m_size;
- if (qsize)
- {
- pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
- }
- }
- pthread_mutex_unlock(&pThis->m_lock);
-
- /*process message if we have one*/
- if(qsize > 0)
- {
- id = ident;
- switch (id)
- {
- case OMX_COMPONENT_GENERATE_EVENT:
- if (pThis->m_cb.EventHandler)
- {
- switch (p1)
- {
- case OMX_CommandStateSet:
- pThis->m_state = (OMX_STATETYPE) p2;
- DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
- pThis->m_state);
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventCmdComplete, p1, p2, NULL);
- break;
-
- case OMX_EventError:
- if(p2 == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
- pThis->m_state = (OMX_STATETYPE) p2;
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
- }
- else if (p2 == OMX_ErrorHardware)
- {
- pThis->omx_report_error();
- }
- else
- {
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventError, p2, (OMX_U32)NULL, NULL );
- }
- break;
-
- case OMX_CommandPortDisable:
- DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
- if (BITMASK_PRESENT(&pThis->m_flags,
- OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
- {
- BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
- break;
- }
- if (p2 == OMX_CORE_OUTPUT_PORT_INDEX)
- {
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
- if(release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
- DEBUG_PRINT_HIGH("Failed to release output buffers\n");
- OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
- pThis->in_reconfig = false;
- if(eRet != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
- pThis->omx_report_error();
- break;
- }
- }
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventCmdComplete, p1, p2, NULL );
- break;
- case OMX_CommandPortEnable:
- DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
- OMX_EventCmdComplete, p1, p2, NULL );
- break;
-
- default:
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventCmdComplete, p1, p2, NULL );
- break;
-
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
- }
- break;
- case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
- if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
- (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
- pThis->omx_report_error ();
- }
- break;
- case OMX_COMPONENT_GENERATE_ETB:
- if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
- (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
- pThis->omx_report_error ();
- }
- break;
-
- case OMX_COMPONENT_GENERATE_FTB:
- if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
- (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
- pThis->omx_report_error ();
- }
- break;
-
- case OMX_COMPONENT_GENERATE_COMMAND:
- pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
- (OMX_U32)p2,(OMX_PTR)NULL);
- break;
-
- case OMX_COMPONENT_GENERATE_EBD:
-
- if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR)
- {
- DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
- pThis->omx_report_error ();
- }
- else
- {
- if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1)
- {
- pThis->m_inp_err_count++;
- pThis->time_stamp_dts.remove_time_stamp(
- ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
- (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
- ?true:false);
- }
- else
- {
- pThis->m_inp_err_count = 0;
- }
- if ( pThis->empty_buffer_done(&pThis->m_cmp,
- (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
- pThis->omx_report_error ();
- }
- if(pThis->m_inp_err_count >= MAX_INPUT_ERROR)
- {
- DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
- pThis->omx_report_error ();
- }
- }
- break;
- case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
- {
- int64_t *timestamp = (int64_t *)p1;
- if (p1)
- {
- pThis->time_stamp_dts.remove_time_stamp(*timestamp,
- (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
- ?true:false);
- free(timestamp);
- }
- }
- break;
- case OMX_COMPONENT_GENERATE_FBD:
- if (p2 != VDEC_S_SUCCESS)
- {
- DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
- pThis->omx_report_error ();
- }
- else if ( pThis->fill_buffer_done(&pThis->m_cmp,
- (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
- {
- DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
- pThis->omx_report_error ();
- }
- break;
-
- case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
- DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
- if (!pThis->input_flush_progress)
- {
- DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
- }
- else
- {
- pThis->execute_input_flush();
- if (pThis->m_cb.EventHandler)
- {
- if (p2 != VDEC_S_SUCCESS)
- {
- DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
- pThis->omx_report_error ();
- }
- else
- {
- /*Check if we need generate event for Flush done*/
- if(BITMASK_PRESENT(&pThis->m_flags,
- OMX_COMPONENT_INPUT_FLUSH_PENDING))
- {
- BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
- DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventCmdComplete,OMX_CommandFlush,
- OMX_CORE_INPUT_PORT_INDEX,NULL );
- }
- if (BITMASK_PRESENT(&pThis->m_flags,
- OMX_COMPONENT_IDLE_PENDING))
- {
- if(pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
- DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n");
- pThis->omx_report_error ();
- } else {
- pThis->streaming[OUTPUT_PORT] = false;
- }
- if (!pThis->output_flush_progress)
- {
- DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
- pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
- OMX_COMPONENT_GENERATE_STOP_DONE);
- }
- }
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
- }
- }
- break;
-
- case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
- DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
- if (!pThis->output_flush_progress)
- {
- DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
- }
- else
- {
- pThis->execute_output_flush();
- if (pThis->m_cb.EventHandler)
- {
- if (p2 != VDEC_S_SUCCESS)
- {
- DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
- pThis->omx_report_error ();
- }
- else
- {
- /*Check if we need generate event for Flush done*/
- if(BITMASK_PRESENT(&pThis->m_flags,
- OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
- {
- DEBUG_PRINT_LOW("\n Notify Output Flush done");
- BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventCmdComplete,OMX_CommandFlush,
- OMX_CORE_OUTPUT_PORT_INDEX,NULL );
- }
- if(BITMASK_PRESENT(&pThis->m_flags,
- OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
- {
- DEBUG_PRINT_LOW("\n Internal flush complete");
- BITMASK_CLEAR (&pThis->m_flags,
- OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
- if (BITMASK_PRESENT(&pThis->m_flags,
- OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED))
- {
- pThis->post_event(OMX_CommandPortDisable,
- OMX_CORE_OUTPUT_PORT_INDEX,
- OMX_COMPONENT_GENERATE_EVENT);
- BITMASK_CLEAR (&pThis->m_flags,
- OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
-
- }
- }
-
- if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
- {
- if(pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
- DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n");
- pThis->omx_report_error ();
- break;
- }
- pThis->streaming[CAPTURE_PORT] = false;
- if (!pThis->input_flush_progress)
- {
- DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
- pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
- OMX_COMPONENT_GENERATE_STOP_DONE);
- }
- }
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
- }
- }
- break;
-
- case OMX_COMPONENT_GENERATE_START_DONE:
- DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
-
- if (pThis->m_cb.EventHandler)
- {
- if (p2 != VDEC_S_SUCCESS)
- {
- DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
- pThis->omx_report_error ();
- }
- else
- {
- DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
- if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
- {
- DEBUG_PRINT_LOW("\n Move to executing");
- // Send the callback now
- BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
- pThis->m_state = OMX_StateExecuting;
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventCmdComplete,OMX_CommandStateSet,
- OMX_StateExecuting, NULL);
- }
- else if (BITMASK_PRESENT(&pThis->m_flags,
- OMX_COMPONENT_PAUSE_PENDING))
- {
- if (/*ioctl (pThis->drv_ctx.video_driver_fd,
- VDEC_IOCTL_CMD_PAUSE,NULL ) < */0)
- {
- DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
- pThis->omx_report_error ();
- }
- }
- }
- }
- else
- {
- DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
- }
- break;
-
- case OMX_COMPONENT_GENERATE_PAUSE_DONE:
- DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
- if (pThis->m_cb.EventHandler)
- {
- if (p2 != VDEC_S_SUCCESS)
- {
- DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
- pThis->omx_report_error ();
- }
- else
- {
- pThis->complete_pending_buffer_done_cbs();
- if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
- {
- DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
- //Send the callback now
- BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
- pThis->m_state = OMX_StatePause;
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventCmdComplete,OMX_CommandStateSet,
- OMX_StatePause, NULL);
- }
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
- }
-
- break;
-
- case OMX_COMPONENT_GENERATE_RESUME_DONE:
- DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
- if (pThis->m_cb.EventHandler)
- {
- if (p2 != VDEC_S_SUCCESS)
- {
- DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
- pThis->omx_report_error ();
- }
- else
- {
- if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
- {
- DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
- // Send the callback now
- BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
- pThis->m_state = OMX_StateExecuting;
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventCmdComplete,OMX_CommandStateSet,
- OMX_StateExecuting,NULL);
- }
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
- }
-
- break;
-
- case OMX_COMPONENT_GENERATE_STOP_DONE:
- DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
- if (pThis->m_cb.EventHandler)
- {
- if (p2 != VDEC_S_SUCCESS)
- {
- DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
- pThis->omx_report_error ();
- }
- else
- {
- pThis->complete_pending_buffer_done_cbs();
- if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
- {
- DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
- // Send the callback now
- BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
- pThis->m_state = OMX_StateIdle;
- DEBUG_PRINT_LOW("\n Move to Idle State");
- pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
- OMX_EventCmdComplete,OMX_CommandStateSet,
- OMX_StateIdle,NULL);
- }
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
- }
-
- break;
-
- case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
- DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
-
- if (p2 == OMX_IndexParamPortDefinition) {
- pThis->in_reconfig = true;
- }
- if (pThis->m_cb.EventHandler) {
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventPortSettingsChanged, p1, p2, NULL );
- } else {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
- }
-
- if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
- {
- OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
- OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
- if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
- format = OMX_InterlaceInterleaveFrameTopFieldFirst;
- else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
- format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
- else //unsupported interlace format; raise a error
- event = OMX_EventError;
- if (pThis->m_cb.EventHandler) {
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- event, format, 0, NULL );
- } else {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
- }
- }
- break;
-
- case OMX_COMPONENT_GENERATE_EOS_DONE:
- DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
- if (pThis->m_cb.EventHandler) {
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
- OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
- } else {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
- }
- pThis->prev_ts = LLONG_MAX;
- pThis->rst_prev_ts = true;
- break;
-
- case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
- DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
- pThis->omx_report_error ();
- break;
-
- case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
- DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING\n");
- pThis->omx_report_unsupported_setting();
- break;
-
- case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
- {
- DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
- if (pThis->m_cb.EventHandler) {
- pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
- } else {
- DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
- }
+ // Protect the shared queue data structure
+ do {
+ /*Read the message id's from the queue*/
+ pthread_mutex_lock(&pThis->m_lock);
+ qsize = pThis->m_cmd_q.m_size;
+ if (qsize) {
+ pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
}
- default:
- break;
+
+ if (qsize == 0 && pThis->m_state != OMX_StatePause) {
+ qsize = pThis->m_ftb_q.m_size;
+ if (qsize) {
+ pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
+ }
}
- }
- pthread_mutex_lock(&pThis->m_lock);
- qsize = pThis->m_cmd_q.m_size;
- if (pThis->m_state != OMX_StatePause)
- qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
- pthread_mutex_unlock(&pThis->m_lock);
- }
- while(qsize>0);
+
+ if (qsize == 0 && pThis->m_state != OMX_StatePause) {
+ qsize = pThis->m_etb_q.m_size;
+ if (qsize) {
+ pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
+ }
+ }
+ pthread_mutex_unlock(&pThis->m_lock);
+
+ /*process message if we have one*/
+ if (qsize > 0) {
+ id = ident;
+ switch (id) {
+ case OMX_COMPONENT_GENERATE_EVENT:
+ if (pThis->m_cb.EventHandler) {
+ switch (p1) {
+ case OMX_CommandStateSet:
+ pThis->m_state = (OMX_STATETYPE) p2;
+ DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
+ pThis->m_state);
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventCmdComplete, p1, p2, NULL);
+ break;
+
+ case OMX_EventError:
+ if (p2 == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
+ pThis->m_state = (OMX_STATETYPE) p2;
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
+ } else if (p2 == OMX_ErrorHardware) {
+ pThis->omx_report_error();
+ } else {
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventError, p2, (OMX_U32)NULL, NULL );
+ }
+ break;
+
+ case OMX_CommandPortDisable:
+ DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
+ if (BITMASK_PRESENT(&pThis->m_flags,
+ OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
+ BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
+ break;
+ }
+ if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) {
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
+ if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
+ DEBUG_PRINT_HIGH("Failed to release output buffers\n");
+ OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
+ pThis->in_reconfig = false;
+ if (eRet != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
+ pThis->omx_report_error();
+ break;
+ }
+ }
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventCmdComplete, p1, p2, NULL );
+ break;
+ case OMX_CommandPortEnable:
+ DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
+ OMX_EventCmdComplete, p1, p2, NULL );
+ break;
+
+ default:
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventCmdComplete, p1, p2, NULL );
+ break;
+
+ }
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
+ }
+ break;
+ case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
+ if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
+ (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
+ pThis->omx_report_error ();
+ }
+ break;
+ case OMX_COMPONENT_GENERATE_ETB:
+ if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+ (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
+ pThis->omx_report_error ();
+ }
+ break;
+
+ case OMX_COMPONENT_GENERATE_FTB:
+ if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
+ (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
+ pThis->omx_report_error ();
+ }
+ break;
+
+ case OMX_COMPONENT_GENERATE_COMMAND:
+ pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
+ (OMX_U32)p2,(OMX_PTR)NULL);
+ break;
+
+ case OMX_COMPONENT_GENERATE_EBD:
+
+ if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
+ DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
+ pThis->omx_report_error ();
+ } else {
+ if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
+ pThis->m_inp_err_count++;
+ pThis->time_stamp_dts.remove_time_stamp(
+ ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
+ (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+ ?true:false);
+ } else {
+ pThis->m_inp_err_count = 0;
+ }
+ if ( pThis->empty_buffer_done(&pThis->m_cmp,
+ (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
+ pThis->omx_report_error ();
+ }
+ if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) {
+ DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
+ pThis->omx_report_error ();
+ }
+ }
+ break;
+ case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: {
+ int64_t *timestamp = (int64_t *)p1;
+ if (p1) {
+ pThis->time_stamp_dts.remove_time_stamp(*timestamp,
+ (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+ ?true:false);
+ free(timestamp);
+ }
+ }
+ break;
+ case OMX_COMPONENT_GENERATE_FBD:
+ if (p2 != VDEC_S_SUCCESS) {
+ DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
+ pThis->omx_report_error ();
+ } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
+ (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+ DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
+ pThis->omx_report_error ();
+ }
+ break;
+
+ case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
+ DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
+ if (!pThis->input_flush_progress) {
+ DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
+ } else {
+ pThis->execute_input_flush();
+ if (pThis->m_cb.EventHandler) {
+ if (p2 != VDEC_S_SUCCESS) {
+ DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
+ pThis->omx_report_error ();
+ } else {
+ /*Check if we need generate event for Flush done*/
+ if (BITMASK_PRESENT(&pThis->m_flags,
+ OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
+ BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
+ DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventCmdComplete,OMX_CommandFlush,
+ OMX_CORE_INPUT_PORT_INDEX,NULL );
+ }
+ if (BITMASK_PRESENT(&pThis->m_flags,
+ OMX_COMPONENT_IDLE_PENDING)) {
+ if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
+ DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n");
+ pThis->omx_report_error ();
+ } else {
+ pThis->streaming[OUTPUT_PORT] = false;
+ }
+ if (!pThis->output_flush_progress) {
+ DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
+ pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
+ OMX_COMPONENT_GENERATE_STOP_DONE);
+ }
+ }
+ }
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
+ }
+ break;
+
+ case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
+ DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
+ if (!pThis->output_flush_progress) {
+ DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
+ } else {
+ pThis->execute_output_flush();
+ if (pThis->m_cb.EventHandler) {
+ if (p2 != VDEC_S_SUCCESS) {
+ DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
+ pThis->omx_report_error ();
+ } else {
+ /*Check if we need generate event for Flush done*/
+ if (BITMASK_PRESENT(&pThis->m_flags,
+ OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
+ DEBUG_PRINT_LOW("\n Notify Output Flush done");
+ BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventCmdComplete,OMX_CommandFlush,
+ OMX_CORE_OUTPUT_PORT_INDEX,NULL );
+ }
+ if (BITMASK_PRESENT(&pThis->m_flags,
+ OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
+ DEBUG_PRINT_LOW("\n Internal flush complete");
+ BITMASK_CLEAR (&pThis->m_flags,
+ OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
+ if (BITMASK_PRESENT(&pThis->m_flags,
+ OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
+ pThis->post_event(OMX_CommandPortDisable,
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ BITMASK_CLEAR (&pThis->m_flags,
+ OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
+
+ }
+ }
+
+ if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
+ if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
+ DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n");
+ pThis->omx_report_error ();
+ break;
+ }
+ pThis->streaming[CAPTURE_PORT] = false;
+ if (!pThis->input_flush_progress) {
+ DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
+ pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
+ OMX_COMPONENT_GENERATE_STOP_DONE);
+ }
+ }
+ }
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
+ }
+ break;
+
+ case OMX_COMPONENT_GENERATE_START_DONE:
+ DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
+
+ if (pThis->m_cb.EventHandler) {
+ if (p2 != VDEC_S_SUCCESS) {
+ DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
+ pThis->omx_report_error ();
+ } else {
+ DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
+ if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+ DEBUG_PRINT_LOW("\n Move to executing");
+ // Send the callback now
+ BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+ pThis->m_state = OMX_StateExecuting;
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventCmdComplete,OMX_CommandStateSet,
+ OMX_StateExecuting, NULL);
+ } else if (BITMASK_PRESENT(&pThis->m_flags,
+ OMX_COMPONENT_PAUSE_PENDING)) {
+ if (/*ioctl (pThis->drv_ctx.video_driver_fd,
+ VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
+ DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
+ pThis->omx_report_error ();
+ }
+ }
+ }
+ } else {
+ DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
+ }
+ break;
+
+ case OMX_COMPONENT_GENERATE_PAUSE_DONE:
+ DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
+ if (pThis->m_cb.EventHandler) {
+ if (p2 != VDEC_S_SUCCESS) {
+ DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
+ pThis->omx_report_error ();
+ } else {
+ pThis->complete_pending_buffer_done_cbs();
+ if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
+ DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
+ //Send the callback now
+ BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
+ pThis->m_state = OMX_StatePause;
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventCmdComplete,OMX_CommandStateSet,
+ OMX_StatePause, NULL);
+ }
+ }
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
+
+ break;
+
+ case OMX_COMPONENT_GENERATE_RESUME_DONE:
+ DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
+ if (pThis->m_cb.EventHandler) {
+ if (p2 != VDEC_S_SUCCESS) {
+ DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
+ pThis->omx_report_error ();
+ } else {
+ if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
+ DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
+ // Send the callback now
+ BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
+ pThis->m_state = OMX_StateExecuting;
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventCmdComplete,OMX_CommandStateSet,
+ OMX_StateExecuting,NULL);
+ }
+ }
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
+
+ break;
+
+ case OMX_COMPONENT_GENERATE_STOP_DONE:
+ DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
+ if (pThis->m_cb.EventHandler) {
+ if (p2 != VDEC_S_SUCCESS) {
+ DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
+ pThis->omx_report_error ();
+ } else {
+ pThis->complete_pending_buffer_done_cbs();
+ if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+ DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
+ // Send the callback now
+ BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
+ pThis->m_state = OMX_StateIdle;
+ DEBUG_PRINT_LOW("\n Move to Idle State");
+ pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
+ OMX_EventCmdComplete,OMX_CommandStateSet,
+ OMX_StateIdle,NULL);
+ }
+ }
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
+
+ break;
+
+ case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
+ DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
+
+ if (p2 == OMX_IndexParamPortDefinition) {
+ pThis->in_reconfig = true;
+ }
+ if (pThis->m_cb.EventHandler) {
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventPortSettingsChanged, p1, p2, NULL );
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
+
+ if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
+ OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
+ OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
+ if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
+ format = OMX_InterlaceInterleaveFrameTopFieldFirst;
+ else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
+ format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
+ else //unsupported interlace format; raise a error
+ event = OMX_EventError;
+ if (pThis->m_cb.EventHandler) {
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ event, format, 0, NULL );
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
+ }
+ break;
+
+ case OMX_COMPONENT_GENERATE_EOS_DONE:
+ DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
+ if (pThis->m_cb.EventHandler) {
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
+ OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
+ pThis->prev_ts = LLONG_MAX;
+ pThis->rst_prev_ts = true;
+ break;
+
+ case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
+ DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
+ pThis->omx_report_error ();
+ break;
+
+ case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
+ DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING\n");
+ pThis->omx_report_unsupported_setting();
+ break;
+
+ case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: {
+ DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
+ if (pThis->m_cb.EventHandler) {
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
+ }
+ default:
+ break;
+ }
+ }
+ pthread_mutex_lock(&pThis->m_lock);
+ qsize = pThis->m_cmd_q.m_size;
+ if (pThis->m_state != OMX_StatePause)
+ qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
+ pthread_mutex_unlock(&pThis->m_lock);
+ } while (qsize>0);
}
int omx_vdec::update_resolution(int width, int height, int stride, int scan_lines)
{
- int format_changed = 0;
- if ((height != drv_ctx.video_resolution.frame_height) ||
- (width != drv_ctx.video_resolution.frame_width)) {
- DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)\n",
- width, drv_ctx.video_resolution.frame_width,
- height,drv_ctx.video_resolution.frame_height);
- format_changed = 1;
- }
+ int format_changed = 0;
+ if ((height != drv_ctx.video_resolution.frame_height) ||
+ (width != drv_ctx.video_resolution.frame_width)) {
+ DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)\n",
+ width, drv_ctx.video_resolution.frame_width,
+ height,drv_ctx.video_resolution.frame_height);
+ format_changed = 1;
+ }
drv_ctx.video_resolution.frame_height = height;
drv_ctx.video_resolution.frame_width = width;
drv_ctx.video_resolution.scan_lines = scan_lines;
@@ -1339,325 +1215,299 @@
rectangle.nTop = 0;
rectangle.nWidth = drv_ctx.video_resolution.frame_width;
rectangle.nHeight = drv_ctx.video_resolution.frame_height;
- return format_changed;
+ return format_changed;
}
OMX_ERRORTYPE omx_vdec::is_video_session_supported()
{
- if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
- OMX_MAX_STRINGNAME_SIZE) &&
- (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) {
- m_decoder_capability.max_width = 1280;
- m_decoder_capability.max_height = 720;
- DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP");
- }
+ if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
+ OMX_MAX_STRINGNAME_SIZE) &&
+ (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) {
+ m_decoder_capability.max_width = 1280;
+ m_decoder_capability.max_height = 720;
+ DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP");
+ }
- if ((drv_ctx.video_resolution.frame_width *
- drv_ctx.video_resolution.frame_height >
- m_decoder_capability.max_width *
- m_decoder_capability.max_height) ||
- (drv_ctx.video_resolution.frame_width*
- drv_ctx.video_resolution.frame_height <
- m_decoder_capability.min_width *
- m_decoder_capability.min_height))
- {
- DEBUG_PRINT_ERROR(
- "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
- drv_ctx.video_resolution.frame_width,
- drv_ctx.video_resolution.frame_height,
- m_decoder_capability.min_width,
- m_decoder_capability.min_height,
- m_decoder_capability.max_width,
- m_decoder_capability.max_height);
- return OMX_ErrorUnsupportedSetting;
- }
- DEBUG_PRINT_HIGH("\n video session supported\n");
- return OMX_ErrorNone;
+ if ((drv_ctx.video_resolution.frame_width *
+ drv_ctx.video_resolution.frame_height >
+ m_decoder_capability.max_width *
+ m_decoder_capability.max_height) ||
+ (drv_ctx.video_resolution.frame_width*
+ drv_ctx.video_resolution.frame_height <
+ m_decoder_capability.min_width *
+ m_decoder_capability.min_height)) {
+ DEBUG_PRINT_ERROR(
+ "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
+ drv_ctx.video_resolution.frame_width,
+ drv_ctx.video_resolution.frame_height,
+ m_decoder_capability.min_width,
+ m_decoder_capability.min_height,
+ m_decoder_capability.max_width,
+ m_decoder_capability.max_height);
+ return OMX_ErrorUnsupportedSetting;
+ }
+ DEBUG_PRINT_HIGH("\n video session supported\n");
+ return OMX_ErrorNone;
}
/* ======================================================================
-FUNCTION
- omx_vdec::ComponentInit
+ FUNCTION
+ omx_vdec::ComponentInit
-DESCRIPTION
- Initialize the component.
+ DESCRIPTION
+ Initialize the component.
-PARAMETERS
- ctxt -- Context information related to the self.
- id -- Event identifier. This could be any of the following:
- 1. Command completion event
- 2. Buffer done callback event
- 3. Frame done callback event
+ PARAMETERS
+ ctxt -- Context information related to the self.
+ id -- Event identifier. This could be any of the following:
+ 1. Command completion event
+ 2. Buffer done callback event
+ 3. Frame done callback event
-RETURN VALUE
- None.
+ RETURN VALUE
+ None.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- struct v4l2_fmtdesc fdesc;
- struct v4l2_format fmt;
- struct v4l2_requestbuffers bufreq;
- struct v4l2_control control;
- struct v4l2_frmsizeenum frmsize;
- unsigned int alignment = 0,buffer_size = 0;
- int fds[2];
- int r,ret=0;
- bool codec_ambiguous = false;
- OMX_STRING device_name = (OMX_STRING)"/dev/video/venus_dec";
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ struct v4l2_fmtdesc fdesc;
+ struct v4l2_format fmt;
+ struct v4l2_requestbuffers bufreq;
+ struct v4l2_control control;
+ struct v4l2_frmsizeenum frmsize;
+ unsigned int alignment = 0,buffer_size = 0;
+ int fds[2];
+ int r,ret=0;
+ bool codec_ambiguous = false;
+ OMX_STRING device_name = (OMX_STRING)"/dev/video/venus_dec";
#ifdef _ANDROID_
- char platform_name[64];
- property_get("ro.board.platform", platform_name, "0");
- if (!strncmp(platform_name, "msm8610", 7)) {
- device_name = (OMX_STRING)"/dev/video/q6_dec";
- }
+ char platform_name[64];
+ property_get("ro.board.platform", platform_name, "0");
+ if (!strncmp(platform_name, "msm8610", 7)) {
+ device_name = (OMX_STRING)"/dev/video/q6_dec";
+ }
#endif
- if(!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)){
- struct v4l2_control control;
- secure_mode = true;
- arbitrary_bytes = false;
- role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
- }
+ if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)) {
+ struct v4l2_control control;
+ secure_mode = true;
+ arbitrary_bytes = false;
+ role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
+ }
- drv_ctx.video_driver_fd = open(device_name, O_RDWR);
+ drv_ctx.video_driver_fd = open(device_name, O_RDWR);
- DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d",
- drv_ctx.video_driver_fd, errno);
+ DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d",
+ drv_ctx.video_driver_fd, errno);
- if(drv_ctx.video_driver_fd == 0){
- DEBUG_PRINT_ERROR("omx_vdec_msm8974 :: Got fd as 0 for msm_vidc_dec, Opening again\n");
- drv_ctx.video_driver_fd = open(device_name, O_RDWR);
- close(0);
- }
+ if (drv_ctx.video_driver_fd == 0) {
+ DEBUG_PRINT_ERROR("omx_vdec_msm8974 :: Got fd as 0 for msm_vidc_dec, Opening again\n");
+ drv_ctx.video_driver_fd = open(device_name, O_RDWR);
+ close(0);
+ }
- if(drv_ctx.video_driver_fd < 0)
- {
- DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
- return OMX_ErrorInsufficientResources;
- }
- drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
- drv_ctx.frame_rate.fps_denominator = 1;
+ if (drv_ctx.video_driver_fd < 0) {
+ DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
+ return OMX_ErrorInsufficientResources;
+ }
+ drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
+ drv_ctx.frame_rate.fps_denominator = 1;
ret = subscribe_to_events(drv_ctx.video_driver_fd);
if (!ret) {
- async_thread_created = true;
- ret = pthread_create(&async_thread_id,0,async_message_thread,this);
- }
- if(ret) {
- DEBUG_PRINT_ERROR("\n Failed to create async_message_thread \n");
- async_thread_created = false;
- return OMX_ErrorInsufficientResources;
+ async_thread_created = true;
+ ret = pthread_create(&async_thread_id,0,async_message_thread,this);
+ }
+ if (ret) {
+ DEBUG_PRINT_ERROR("\n Failed to create async_message_thread \n");
+ async_thread_created = false;
+ return OMX_ErrorInsufficientResources;
}
#ifdef INPUT_BUFFER_LOG
- strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
+ strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
#endif
#ifdef OUTPUT_BUFFER_LOG
- outputBufferFile1 = fopen (outputfilename, "ab");
+ outputBufferFile1 = fopen (outputfilename, "ab");
#endif
#ifdef OUTPUT_EXTRADATA_LOG
- outputExtradataFile = fopen (ouputextradatafilename, "ab");
+ outputExtradataFile = fopen (ouputextradatafilename, "ab");
#endif
- // Copy the role information which provides the decoder kind
- strlcpy(drv_ctx.kind,role,128);
+ // Copy the role information which provides the decoder kind
+ strlcpy(drv_ctx.kind,role,128);
- if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
- OMX_MAX_STRINGNAME_SIZE);
- drv_ctx.timestamp_adjust = true;
- drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
- eCompressionFormat = OMX_VIDEO_CodingMPEG4;
- output_capability=V4L2_PIX_FMT_MPEG4;
- /*Initialize Start Code for MPEG4*/
- codec_type_parse = CODEC_TYPE_MPEG4;
- m_frame_parser.init_start_codes (codec_type_parse);
+ if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
+ OMX_MAX_STRINGNAME_SIZE);
+ drv_ctx.timestamp_adjust = true;
+ drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
+ eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+ output_capability=V4L2_PIX_FMT_MPEG4;
+ /*Initialize Start Code for MPEG4*/
+ codec_type_parse = CODEC_TYPE_MPEG4;
+ m_frame_parser.init_start_codes (codec_type_parse);
#ifdef INPUT_BUFFER_LOG
- strcat(inputfilename, "m4v");
+ strcat(inputfilename, "m4v");
#endif
- }
- else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
- OMX_MAX_STRINGNAME_SIZE);
- drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
- output_capability = V4L2_PIX_FMT_MPEG2;
- eCompressionFormat = OMX_VIDEO_CodingMPEG2;
- /*Initialize Start Code for MPEG2*/
- codec_type_parse = CODEC_TYPE_MPEG2;
- m_frame_parser.init_start_codes (codec_type_parse);
+ } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
+ OMX_MAX_STRINGNAME_SIZE);
+ drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
+ output_capability = V4L2_PIX_FMT_MPEG2;
+ eCompressionFormat = OMX_VIDEO_CodingMPEG2;
+ /*Initialize Start Code for MPEG2*/
+ codec_type_parse = CODEC_TYPE_MPEG2;
+ m_frame_parser.init_start_codes (codec_type_parse);
#ifdef INPUT_BUFFER_LOG
- strcat(inputfilename, "mpg");
+ strcat(inputfilename, "mpg");
#endif
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_LOW("\n H263 Decoder selected");
- drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
- eCompressionFormat = OMX_VIDEO_CodingH263;
- output_capability = V4L2_PIX_FMT_H263;
- codec_type_parse = CODEC_TYPE_H263;
- m_frame_parser.init_start_codes (codec_type_parse);
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_LOW("\n H263 Decoder selected");
+ drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
+ eCompressionFormat = OMX_VIDEO_CodingH263;
+ output_capability = V4L2_PIX_FMT_H263;
+ codec_type_parse = CODEC_TYPE_H263;
+ m_frame_parser.init_start_codes (codec_type_parse);
#ifdef INPUT_BUFFER_LOG
- strcat(inputfilename, "263");
+ strcat(inputfilename, "263");
#endif
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
- drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
- output_capability = V4L2_PIX_FMT_DIVX_311;
- eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
- codec_type_parse = CODEC_TYPE_DIVX;
- m_frame_parser.init_start_codes (codec_type_parse);
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
+ drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
+ output_capability = V4L2_PIX_FMT_DIVX_311;
+ eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+ codec_type_parse = CODEC_TYPE_DIVX;
+ m_frame_parser.init_start_codes (codec_type_parse);
- eRet = createDivxDrmContext();
- if (eRet != OMX_ErrorNone) {
- DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
- return eRet;
- }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
- drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
- output_capability = V4L2_PIX_FMT_DIVX;
- eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
- codec_type_parse = CODEC_TYPE_DIVX;
- codec_ambiguous = true;
- m_frame_parser.init_start_codes (codec_type_parse);
+ eRet = createDivxDrmContext();
+ if (eRet != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+ return eRet;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
+ drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
+ output_capability = V4L2_PIX_FMT_DIVX;
+ eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+ codec_type_parse = CODEC_TYPE_DIVX;
+ codec_ambiguous = true;
+ m_frame_parser.init_start_codes (codec_type_parse);
- eRet = createDivxDrmContext();
- if (eRet != OMX_ErrorNone) {
- DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
- return eRet;
- }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
- drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
- output_capability = V4L2_PIX_FMT_DIVX;
- eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
- codec_type_parse = CODEC_TYPE_DIVX;
- codec_ambiguous = true;
- m_frame_parser.init_start_codes (codec_type_parse);
+ eRet = createDivxDrmContext();
+ if (eRet != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+ return eRet;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
+ drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
+ output_capability = V4L2_PIX_FMT_DIVX;
+ eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+ codec_type_parse = CODEC_TYPE_DIVX;
+ codec_ambiguous = true;
+ m_frame_parser.init_start_codes (codec_type_parse);
- eRet = createDivxDrmContext();
- if (eRet != OMX_ErrorNone) {
- DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
- return eRet;
- }
+ eRet = createDivxDrmContext();
+ if (eRet != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+ return eRet;
+ }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
- drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
- output_capability=V4L2_PIX_FMT_H264;
- eCompressionFormat = OMX_VIDEO_CodingAVC;
- codec_type_parse = CODEC_TYPE_H264;
- m_frame_parser.init_start_codes (codec_type_parse);
- m_frame_parser.init_nal_length(nal_length);
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+ drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
+ output_capability=V4L2_PIX_FMT_H264;
+ eCompressionFormat = OMX_VIDEO_CodingAVC;
+ codec_type_parse = CODEC_TYPE_H264;
+ m_frame_parser.init_start_codes (codec_type_parse);
+ m_frame_parser.init_nal_length(nal_length);
#ifdef INPUT_BUFFER_LOG
- strcat(inputfilename, "264");
+ strcat(inputfilename, "264");
#endif
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
- drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
- eCompressionFormat = OMX_VIDEO_CodingWMV;
- codec_type_parse = CODEC_TYPE_VC1;
- output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
- m_frame_parser.init_start_codes (codec_type_parse);
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+ drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
+ eCompressionFormat = OMX_VIDEO_CodingWMV;
+ codec_type_parse = CODEC_TYPE_VC1;
+ output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
+ m_frame_parser.init_start_codes (codec_type_parse);
#ifdef INPUT_BUFFER_LOG
- strcat(inputfilename, "vc1");
+ strcat(inputfilename, "vc1");
#endif
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
- drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
- eCompressionFormat = OMX_VIDEO_CodingWMV;
- codec_type_parse = CODEC_TYPE_VC1;
- output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
- m_frame_parser.init_start_codes (codec_type_parse);
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+ drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
+ eCompressionFormat = OMX_VIDEO_CodingWMV;
+ codec_type_parse = CODEC_TYPE_VC1;
+ output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
+ m_frame_parser.init_start_codes (codec_type_parse);
#ifdef INPUT_BUFFER_LOG
- strcat(inputfilename, "vc1");
+ strcat(inputfilename, "vc1");
#endif
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", \
- OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
- output_capability=V4L2_PIX_FMT_VP8;
- eCompressionFormat = OMX_VIDEO_CodingVPX;
- codec_type_parse = CODEC_TYPE_VP8;
- arbitrary_bytes = false;
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", \
+ OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+ output_capability=V4L2_PIX_FMT_VP8;
+ eCompressionFormat = OMX_VIDEO_CodingVPX;
+ codec_type_parse = CODEC_TYPE_VP8;
+ arbitrary_bytes = false;
#ifdef INPUT_BUFFER_LOG
- strcat(inputfilename, "ivf");
+ strcat(inputfilename, "ivf");
#endif
- }
- else
- {
- DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
- eRet = OMX_ErrorInvalidComponentName;
- }
+ } else {
+ DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
+ eRet = OMX_ErrorInvalidComponentName;
+ }
#ifdef INPUT_BUFFER_LOG
- inputBufferFile1 = fopen (inputfilename, "ab");
- if (output_capability == V4L2_PIX_FMT_VP8) {
- struct ivf_file_header
- {
- OMX_U8 signature[4]; //='DKIF';
- OMX_U8 version ; //= 0;
- OMX_U8 headersize ; //= 32;
- OMX_U32 FourCC;
- OMX_U8 width;
- OMX_U8 height;
- OMX_U32 rate;
- OMX_U32 scale;
- OMX_U32 length;
- OMX_U8 unused[4];
- } file_header;
- memset((void *)&file_header,0,sizeof(file_header));
- file_header.signature[0] = 'D';
- file_header.signature[1] = 'K';
- file_header.signature[2] = 'I';
- file_header.signature[3] = 'F';
- file_header.version = 0;
- file_header.headersize = 32;
- file_header.FourCC = 0x30385056;
- if (inputBufferFile1)
- {
- fwrite((const char *)&file_header,
- sizeof(file_header),1,inputBufferFile1);
- }
- }
+ inputBufferFile1 = fopen (inputfilename, "ab");
+ if (output_capability == V4L2_PIX_FMT_VP8) {
+ struct ivf_file_header {
+ OMX_U8 signature[4]; //='DKIF';
+ OMX_U8 version ; //= 0;
+ OMX_U8 headersize ; //= 32;
+ OMX_U32 FourCC;
+ OMX_U8 width;
+ OMX_U8 height;
+ OMX_U32 rate;
+ OMX_U32 scale;
+ OMX_U32 length;
+ OMX_U8 unused[4];
+ } file_header;
+ memset((void *)&file_header,0,sizeof(file_header));
+ file_header.signature[0] = 'D';
+ file_header.signature[1] = 'K';
+ file_header.signature[2] = 'I';
+ file_header.signature[3] = 'F';
+ file_header.version = 0;
+ file_header.headersize = 32;
+ file_header.FourCC = 0x30385056;
+ if (inputBufferFile1) {
+ fwrite((const char *)&file_header,
+ sizeof(file_header),1,inputBufferFile1);
+ }
+ }
#endif
- if (eRet == OMX_ErrorNone)
- {
+ if (eRet == OMX_ErrorNone) {
- drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
+ drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
if (!client_buffers.set_color_format(dest_color_format)) {
@@ -1665,124 +1515,124 @@
eRet = OMX_ErrorInsufficientResources;
}
- capture_capability= V4L2_PIX_FMT_NV12;
+ capture_capability= V4L2_PIX_FMT_NV12;
- struct v4l2_capability cap;
- ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
- if (ret) {
- DEBUG_PRINT_ERROR("Failed to query capabilities\n");
- /*TODO: How to handle this case */
- } else {
- DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
- " version = %d, capabilities = %x\n", cap.driver, cap.card,
- cap.bus_info, cap.version, cap.capabilities);
- }
- ret=0;
- fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- fdesc.index=0;
- while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
- DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
- fdesc.pixelformat, fdesc.flags);
- fdesc.index++;
- }
- fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- fdesc.index=0;
- while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+ struct v4l2_capability cap;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
+ if (ret) {
+ DEBUG_PRINT_ERROR("Failed to query capabilities\n");
+ /*TODO: How to handle this case */
+ } else {
+ DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
+ " version = %d, capabilities = %x\n", cap.driver, cap.card,
+ cap.bus_info, cap.version, cap.capabilities);
+ }
+ ret=0;
+ fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fdesc.index=0;
+ while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+ DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+ fdesc.pixelformat, fdesc.flags);
+ fdesc.index++;
+ }
+ fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fdesc.index=0;
+ while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
- DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
- fdesc.pixelformat, fdesc.flags);
- fdesc.index++;
- }
+ DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+ fdesc.pixelformat, fdesc.flags);
+ fdesc.index++;
+ }
update_resolution(320, 240, 320, 240);
- fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
- fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
- fmt.fmt.pix_mp.pixelformat = output_capability;
- ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
- if (ret) {
- /*TODO: How to handle this case */
- DEBUG_PRINT_ERROR("Failed to set format on output port\n");
- return OMX_ErrorInsufficientResources;
- }
- DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
- if (codec_ambiguous) {
- if (output_capability == V4L2_PIX_FMT_DIVX) {
- struct v4l2_control divx_ctrl;
+ fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+ fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+ fmt.fmt.pix_mp.pixelformat = output_capability;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+ if (ret) {
+ /*TODO: How to handle this case */
+ DEBUG_PRINT_ERROR("Failed to set format on output port\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
+ if (codec_ambiguous) {
+ if (output_capability == V4L2_PIX_FMT_DIVX) {
+ struct v4l2_control divx_ctrl;
- if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
- divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
- } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
- divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
- } else {
- divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
- }
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
+ divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
+ } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
+ divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
+ } else {
+ divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
+ }
- divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
- ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
- if (ret) {
- DEBUG_PRINT_ERROR("Failed to set divx version\n");
- }
- } else {
- DEBUG_PRINT_ERROR("Codec should not be ambiguous");
- }
- }
+ divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
+ if (ret) {
+ DEBUG_PRINT_ERROR("Failed to set divx version\n");
+ }
+ } else {
+ DEBUG_PRINT_ERROR("Codec should not be ambiguous");
+ }
+ }
- //Get the hardware capabilities
- memset((void *)&frmsize,0,sizeof(frmsize));
- frmsize.index = 0;
- frmsize.pixel_format = output_capability;
- ret = ioctl(drv_ctx.video_driver_fd,
- VIDIOC_ENUM_FRAMESIZES, &frmsize);
- if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
- DEBUG_PRINT_ERROR("Failed to get framesizes\n");
- return OMX_ErrorHardware;
- }
+ //Get the hardware capabilities
+ memset((void *)&frmsize,0,sizeof(frmsize));
+ frmsize.index = 0;
+ frmsize.pixel_format = output_capability;
+ ret = ioctl(drv_ctx.video_driver_fd,
+ VIDIOC_ENUM_FRAMESIZES, &frmsize);
+ if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
+ DEBUG_PRINT_ERROR("Failed to get framesizes\n");
+ return OMX_ErrorHardware;
+ }
- if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
- m_decoder_capability.min_width = frmsize.stepwise.min_width;
- m_decoder_capability.max_width = frmsize.stepwise.max_width;
- m_decoder_capability.min_height = frmsize.stepwise.min_height;
- m_decoder_capability.max_height = frmsize.stepwise.max_height;
- }
+ if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
+ m_decoder_capability.min_width = frmsize.stepwise.min_width;
+ m_decoder_capability.max_width = frmsize.stepwise.max_width;
+ m_decoder_capability.min_height = frmsize.stepwise.min_height;
+ m_decoder_capability.max_height = frmsize.stepwise.max_height;
+ }
- fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
- fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
- fmt.fmt.pix_mp.pixelformat = capture_capability;
- ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
- if (ret) {
- /*TODO: How to handle this case */
- DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
- }
- DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
- if(secure_mode){
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
- control.value = 1;
- DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d\n", ret);
- ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
- if (ret) {
- DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d\n", ret);
- return OMX_ErrorInsufficientResources;
- }
- }
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+ fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+ fmt.fmt.pix_mp.pixelformat = capture_capability;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+ if (ret) {
+ /*TODO: How to handle this case */
+ DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
+ }
+ DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
+ if (secure_mode) {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
+ control.value = 1;
+ DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d\n", ret);
+ ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
+ if (ret) {
+ DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d\n", ret);
+ return OMX_ErrorInsufficientResources;
+ }
+ }
- /*Get the Buffer requirements for input and output ports*/
- drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- if (secure_mode) {
- drv_ctx.op_buf.alignment=SZ_1M;
- drv_ctx.ip_buf.alignment=SZ_1M;
- } else {
- drv_ctx.op_buf.alignment=SZ_4K;
- drv_ctx.ip_buf.alignment=SZ_4K;
- }
- drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
- drv_ctx.extradata = 0;
- drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
- control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
- ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
- drv_ctx.idr_only_decoding = 0;
+ /*Get the Buffer requirements for input and output ports*/
+ drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+ drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+ if (secure_mode) {
+ drv_ctx.op_buf.alignment=SZ_1M;
+ drv_ctx.ip_buf.alignment=SZ_1M;
+ } else {
+ drv_ctx.op_buf.alignment=SZ_4K;
+ drv_ctx.ip_buf.alignment=SZ_4K;
+ }
+ drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+ drv_ctx.extradata = 0;
+ drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
+ control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+ drv_ctx.idr_only_decoding = 0;
m_state = OMX_StateLoaded;
#ifdef DEFAULT_EXTRADATA
@@ -1792,155 +1642,135 @@
eRet=get_buffer_req(&drv_ctx.ip_buf);
DEBUG_PRINT_HIGH("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size);
get_buffer_req(&drv_ctx.op_buf);
- if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
- {
- if (m_frame_parser.mutils == NULL)
- {
- m_frame_parser.mutils = new H264_Utils();
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+ if (m_frame_parser.mutils == NULL) {
+ m_frame_parser.mutils = new H264_Utils();
- if (m_frame_parser.mutils == NULL)
- {
- DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
- eRet = OMX_ErrorInsufficientResources;
- }
- else
- {
- h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
- h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
- h264_scratch.nFilledLen = 0;
- h264_scratch.nOffset = 0;
+ if (m_frame_parser.mutils == NULL) {
+ DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
+ eRet = OMX_ErrorInsufficientResources;
+ } else {
+ h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
+ h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
+ h264_scratch.nFilledLen = 0;
+ h264_scratch.nOffset = 0;
- if (h264_scratch.pBuffer == NULL)
- {
- DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
- return OMX_ErrorInsufficientResources;
- }
- m_frame_parser.mutils->initialize_frame_checking_environment();
- m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
- }
- }
+ if (h264_scratch.pBuffer == NULL) {
+ DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
+ m_frame_parser.mutils->initialize_frame_checking_environment();
+ m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
+ }
+ }
- h264_parser = new h264_stream_parser();
- if (!h264_parser)
- {
- DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
- eRet = OMX_ErrorInsufficientResources;
- }
- }
+ h264_parser = new h264_stream_parser();
+ if (!h264_parser) {
+ DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ }
- if(pipe(fds))
- {
- DEBUG_PRINT_ERROR("pipe creation failed\n");
- eRet = OMX_ErrorInsufficientResources;
- }
- else
- {
- int temp1[2];
- if(fds[0] == 0 || fds[1] == 0)
- {
- if (pipe (temp1))
- {
- DEBUG_PRINT_ERROR("pipe creation failed\n");
- return OMX_ErrorInsufficientResources;
- }
- //close (fds[0]);
- //close (fds[1]);
- fds[0] = temp1 [0];
- fds[1] = temp1 [1];
- }
- m_pipe_in = fds[0];
- m_pipe_out = fds[1];
- msg_thread_created = true;
- r = pthread_create(&msg_thread_id,0,message_thread,this);
-
- if(r < 0)
- {
- DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
- msg_thread_created = false;
- eRet = OMX_ErrorInsufficientResources;
- }
- }
- }
+ if (pipe(fds)) {
+ DEBUG_PRINT_ERROR("pipe creation failed\n");
+ eRet = OMX_ErrorInsufficientResources;
+ } else {
+ int temp1[2];
+ if (fds[0] == 0 || fds[1] == 0) {
+ if (pipe (temp1)) {
+ DEBUG_PRINT_ERROR("pipe creation failed\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ //close (fds[0]);
+ //close (fds[1]);
+ fds[0] = temp1 [0];
+ fds[1] = temp1 [1];
+ }
+ m_pipe_in = fds[0];
+ m_pipe_out = fds[1];
+ msg_thread_created = true;
+ r = pthread_create(&msg_thread_id,0,message_thread,this);
- if (eRet != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("\n Component Init Failed");
- }
- else
- {
- DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
- }
- //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
- return eRet;
+ if (r < 0) {
+ DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
+ msg_thread_created = false;
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ }
+ }
+
+ if (eRet != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("\n Component Init Failed");
+ } else {
+ DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
+ }
+ //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::GetComponentVersion
+ FUNCTION
+ omx_vdec::GetComponentVersion
-DESCRIPTION
- Returns the component version.
+ DESCRIPTION
+ Returns the component version.
-PARAMETERS
- TBD.
+ PARAMETERS
+ TBD.
-RETURN VALUE
- OMX_ErrorNone.
+ RETURN VALUE
+ OMX_ErrorNone.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::get_component_version
- (
- OMX_IN OMX_HANDLETYPE hComp,
- OMX_OUT OMX_STRING componentName,
- OMX_OUT OMX_VERSIONTYPE* componentVersion,
- OMX_OUT OMX_VERSIONTYPE* specVersion,
- OMX_OUT OMX_UUIDTYPE* componentUUID
- )
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STRING componentName,
+ OMX_OUT OMX_VERSIONTYPE* componentVersion,
+ OMX_OUT OMX_VERSIONTYPE* specVersion,
+ OMX_OUT OMX_UUIDTYPE* componentUUID
+ )
{
- if(m_state == OMX_StateInvalid)
- {
+ if (m_state == OMX_StateInvalid) {
DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n");
return OMX_ErrorInvalidState;
}
- /* TBD -- Return the proper version */
- if (specVersion)
- {
- specVersion->nVersion = OMX_SPEC_VERSION;
- }
- return OMX_ErrorNone;
+ /* TBD -- Return the proper version */
+ if (specVersion) {
+ specVersion->nVersion = OMX_SPEC_VERSION;
+ }
+ return OMX_ErrorNone;
}
/* ======================================================================
-FUNCTION
- omx_vdec::SendCommand
+ FUNCTION
+ omx_vdec::SendCommand
-DESCRIPTION
- Returns zero if all the buffers released..
+ DESCRIPTION
+ Returns zero if all the buffers released..
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_COMMANDTYPE cmd,
- OMX_IN OMX_U32 param1,
- OMX_IN OMX_PTR cmdData
- )
+ OMX_IN OMX_COMMANDTYPE cmd,
+ OMX_IN OMX_U32 param1,
+ OMX_IN OMX_PTR cmdData
+ )
{
DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client");
- if(m_state == OMX_StateInvalid)
- {
+ if (m_state == OMX_StateInvalid) {
DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
return OMX_ErrorInvalidState;
}
if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
- && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL)
- {
- DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
- "to invalid port: %lu", param1);
- return OMX_ErrorBadPortIndex;
+ && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
+ DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
+ "to invalid port: %lu", param1);
+ return OMX_ErrorBadPortIndex;
}
post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
sem_wait(&m_cmd_lock);
@@ -1949,1133 +1779,953 @@
}
/* ======================================================================
-FUNCTION
- omx_vdec::SendCommand
+ FUNCTION
+ omx_vdec::SendCommand
-DESCRIPTION
- Returns zero if all the buffers released..
+ DESCRIPTION
+ Returns zero if all the buffers released..
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_COMMANDTYPE cmd,
- OMX_IN OMX_U32 param1,
- OMX_IN OMX_PTR cmdData
- )
+ OMX_IN OMX_COMMANDTYPE cmd,
+ OMX_IN OMX_U32 param1,
+ OMX_IN OMX_PTR cmdData
+ )
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- OMX_STATETYPE eState = (OMX_STATETYPE) param1;
- int bFlag = 1,sem_posted = 0,ret=0;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_STATETYPE eState = (OMX_STATETYPE) param1;
+ int bFlag = 1,sem_posted = 0,ret=0;
- DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
- DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
- m_state, eState);
+ DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
+ DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
+ m_state, eState);
- if(cmd == OMX_CommandStateSet)
- {
- DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
- DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
- /***************************/
- /* Current State is Loaded */
- /***************************/
- if(m_state == OMX_StateLoaded)
- {
- if(eState == OMX_StateIdle)
- {
- //if all buffers are allocated or all ports disabled
- if(allocate_done() ||
- (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE))
- {
- DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
- }
- else
- {
- DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
- BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
- // Skip the event notification
- bFlag = 0;
- }
- }
- /* Requesting transition from Loaded to Loaded */
- else if(eState == OMX_StateLoaded)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
- post_event(OMX_EventError,OMX_ErrorSameState,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorSameState;
- }
- /* Requesting transition from Loaded to WaitForResources */
- else if(eState == OMX_StateWaitForResources)
- {
- /* Since error is None , we will post an event
- at the end of this function definition */
- DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
- }
- /* Requesting transition from Loaded to Executing */
- else if(eState == OMX_StateExecuting)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
- post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorIncorrectStateTransition;
- }
- /* Requesting transition from Loaded to Pause */
- else if(eState == OMX_StatePause)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
- post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorIncorrectStateTransition;
- }
- /* Requesting transition from Loaded to Invalid */
- else if(eState == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
- post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorInvalidState;
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
- eState);
- eRet = OMX_ErrorBadParameter;
- }
- }
-
- /***************************/
- /* Current State is IDLE */
- /***************************/
- else if(m_state == OMX_StateIdle)
- {
- if(eState == OMX_StateLoaded)
- {
- if(release_done())
- {
- /*
- Since error is None , we will post an event at the end
- of this function definition
- */
- DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
- }
- else
- {
- DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
- BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
- // Skip the event notification
- bFlag = 0;
- }
- }
- /* Requesting transition from Idle to Executing */
- else if(eState == OMX_StateExecuting)
- {
- DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
- //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
- bFlag = 1;
- DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
- m_state=OMX_StateExecuting;
- DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n");
- }
- /* Requesting transition from Idle to Idle */
- else if(eState == OMX_StateIdle)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
- post_event(OMX_EventError,OMX_ErrorSameState,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorSameState;
- }
- /* Requesting transition from Idle to WaitForResources */
- else if(eState == OMX_StateWaitForResources)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
- post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorIncorrectStateTransition;
- }
- /* Requesting transition from Idle to Pause */
- else if(eState == OMX_StatePause)
- {
- /*To pause the Video core we need to start the driver*/
- if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
- NULL) < */0)
- {
- DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
- omx_report_error ();
- eRet = OMX_ErrorHardware;
- }
- else
- {
- BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
- DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
- bFlag = 0;
- }
- }
- /* Requesting transition from Idle to Invalid */
- else if(eState == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
- post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorInvalidState;
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
- eRet = OMX_ErrorBadParameter;
- }
- }
-
- /******************************/
- /* Current State is Executing */
- /******************************/
- else if(m_state == OMX_StateExecuting)
- {
- DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
- /* Requesting transition from Executing to Idle */
- if(eState == OMX_StateIdle)
- {
- /* Since error is None , we will post an event
- at the end of this function definition
- */
- DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
- BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
- if(!sem_posted)
- {
- sem_posted = 1;
- sem_post (&m_cmd_lock);
- execute_omx_flush(OMX_ALL);
- }
- bFlag = 0;
- }
- /* Requesting transition from Executing to Paused */
- else if(eState == OMX_StatePause)
- {
- DEBUG_PRINT_LOW("\n PAUSE Command Issued");
- m_state = OMX_StatePause;
- bFlag = 1;
- }
- /* Requesting transition from Executing to Loaded */
- else if(eState == OMX_StateLoaded)
- {
- DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
- post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorIncorrectStateTransition;
- }
- /* Requesting transition from Executing to WaitForResources */
- else if(eState == OMX_StateWaitForResources)
- {
- DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
- post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorIncorrectStateTransition;
- }
- /* Requesting transition from Executing to Executing */
- else if(eState == OMX_StateExecuting)
- {
- DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
- post_event(OMX_EventError,OMX_ErrorSameState,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorSameState;
- }
- /* Requesting transition from Executing to Invalid */
- else if(eState == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
- post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorInvalidState;
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
- eRet = OMX_ErrorBadParameter;
- }
- }
- /***************************/
- /* Current State is Pause */
- /***************************/
- else if(m_state == OMX_StatePause)
- {
- /* Requesting transition from Pause to Executing */
- if(eState == OMX_StateExecuting)
- {
- DEBUG_PRINT_LOW("\n Pause --> Executing \n");
- m_state = OMX_StateExecuting;
- bFlag = 1;
- }
- /* Requesting transition from Pause to Idle */
- else if(eState == OMX_StateIdle)
- {
- /* Since error is None , we will post an event
- at the end of this function definition */
- DEBUG_PRINT_LOW("\n Pause --> Idle \n");
- BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
- if(!sem_posted)
- {
- sem_posted = 1;
- sem_post (&m_cmd_lock);
- execute_omx_flush(OMX_ALL);
- }
- bFlag = 0;
- }
- /* Requesting transition from Pause to loaded */
- else if(eState == OMX_StateLoaded)
- {
- DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
- post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorIncorrectStateTransition;
- }
- /* Requesting transition from Pause to WaitForResources */
- else if(eState == OMX_StateWaitForResources)
- {
- DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
- post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorIncorrectStateTransition;
- }
- /* Requesting transition from Pause to Pause */
- else if(eState == OMX_StatePause)
- {
- DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
- post_event(OMX_EventError,OMX_ErrorSameState,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorSameState;
- }
- /* Requesting transition from Pause to Invalid */
- else if(eState == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
- post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorInvalidState;
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
- eRet = OMX_ErrorBadParameter;
- }
- }
- /***************************/
- /* Current State is WaitForResources */
- /***************************/
- else if(m_state == OMX_StateWaitForResources)
- {
- /* Requesting transition from WaitForResources to Loaded */
- if(eState == OMX_StateLoaded)
- {
- /* Since error is None , we will post an event
- at the end of this function definition */
- DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
- }
- /* Requesting transition from WaitForResources to WaitForResources */
- else if (eState == OMX_StateWaitForResources)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
- post_event(OMX_EventError,OMX_ErrorSameState,
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorSameState;
- }
- /* Requesting transition from WaitForResources to Executing */
- else if(eState == OMX_StateExecuting)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
- post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorIncorrectStateTransition;
- }
- /* Requesting transition from WaitForResources to Pause */
- else if(eState == OMX_StatePause)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
- post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorIncorrectStateTransition;
- }
- /* Requesting transition from WaitForResources to Invalid */
- else if(eState == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
- post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorInvalidState;
- }
- /* Requesting transition from WaitForResources to Loaded -
- is NOT tested by Khronos TS */
-
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
- eRet = OMX_ErrorBadParameter;
- }
- }
- /********************************/
- /* Current State is Invalid */
- /*******************************/
- else if(m_state == OMX_StateInvalid)
- {
- /* State Transition from Inavlid to any state */
- if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
- || OMX_StateIdle || OMX_StateExecuting
- || OMX_StatePause || OMX_StateInvalid))
- {
- DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
- post_event(OMX_EventError,OMX_ErrorInvalidState,\
- OMX_COMPONENT_GENERATE_EVENT);
- eRet = OMX_ErrorInvalidState;
- }
- }
- else if (cmd == OMX_CommandFlush)
- {
- DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
- "with param1: %lu", param1);
- if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
- {
- BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
- }
- if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
- {
- BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
- }
- if (!sem_posted){
- sem_posted = 1;
- DEBUG_PRINT_LOW("\n Set the Semaphore");
- sem_post (&m_cmd_lock);
- execute_omx_flush(param1);
- }
- bFlag = 0;
- }
- else if ( cmd == OMX_CommandPortEnable)
- {
- DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
- "with param1: %lu", param1);
- if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
- {
- m_inp_bEnabled = OMX_TRUE;
-
- if( (m_state == OMX_StateLoaded &&
- !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
- || allocate_input_done())
- {
- post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
- OMX_COMPONENT_GENERATE_EVENT);
- }
- else
- {
- DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
- BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
- // Skip the event notification
- bFlag = 0;
- }
- }
- if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
- {
- DEBUG_PRINT_LOW("\n Enable output Port command recieved");
- m_out_bEnabled = OMX_TRUE;
-
- if( (m_state == OMX_StateLoaded &&
- !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
- || (allocate_output_done()))
- {
- post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
- OMX_COMPONENT_GENERATE_EVENT);
-
- }
- else
- {
- DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
- BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
- // Skip the event notification
- bFlag = 0;
- }
- }
- }
- else if (cmd == OMX_CommandPortDisable)
- {
- DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
- "with param1: %lu", param1);
- if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
- {
- m_inp_bEnabled = OMX_FALSE;
- if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
- && release_input_done())
- {
- post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
- OMX_COMPONENT_GENERATE_EVENT);
- }
- else
- {
- BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
- if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
- {
- if(!sem_posted)
- {
- sem_posted = 1;
- sem_post (&m_cmd_lock);
- }
- execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
- }
-
- // Skip the event notification
- bFlag = 0;
- }
- }
- if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
- {
- m_out_bEnabled = OMX_FALSE;
- DEBUG_PRINT_LOW("\n Disable output Port command recieved");
- if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
- && release_output_done())
- {
- post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
- OMX_COMPONENT_GENERATE_EVENT);
- }
- else
- {
- BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
- if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
- {
- if (!sem_posted)
- {
- sem_posted = 1;
- sem_post (&m_cmd_lock);
- }
- BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
- execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
+ if (cmd == OMX_CommandStateSet) {
+ DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
+ DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
+ /***************************/
+ /* Current State is Loaded */
+ /***************************/
+ if (m_state == OMX_StateLoaded) {
+ if (eState == OMX_StateIdle) {
+ //if all buffers are allocated or all ports disabled
+ if (allocate_done() ||
+ (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
+ DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
+ } else {
+ DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
+ BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
+ // Skip the event notification
+ bFlag = 0;
+ }
}
- // Skip the event notification
- bFlag = 0;
+ /* Requesting transition from Loaded to Loaded */
+ else if (eState == OMX_StateLoaded) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
+ post_event(OMX_EventError,OMX_ErrorSameState,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorSameState;
+ }
+ /* Requesting transition from Loaded to WaitForResources */
+ else if (eState == OMX_StateWaitForResources) {
+ /* Since error is None , we will post an event
+ at the end of this function definition */
+ DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
+ }
+ /* Requesting transition from Loaded to Executing */
+ else if (eState == OMX_StateExecuting) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
+ post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+ /* Requesting transition from Loaded to Pause */
+ else if (eState == OMX_StatePause) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
+ post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+ /* Requesting transition from Loaded to Invalid */
+ else if (eState == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
+ post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorInvalidState;
+ } else {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
+ eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
- }
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
- eRet = OMX_ErrorNotImplemented;
- }
- if(eRet == OMX_ErrorNone && bFlag)
- {
- post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
- }
- if(!sem_posted)
- {
- sem_post(&m_cmd_lock);
- }
+ /***************************/
+ /* Current State is IDLE */
+ /***************************/
+ else if (m_state == OMX_StateIdle) {
+ if (eState == OMX_StateLoaded) {
+ if (release_done()) {
+ /*
+ Since error is None , we will post an event at the end
+ of this function definition
+ */
+ DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
+ } else {
+ DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
+ BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
+ // Skip the event notification
+ bFlag = 0;
+ }
+ }
+ /* Requesting transition from Idle to Executing */
+ else if (eState == OMX_StateExecuting) {
+ DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
+ //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
+ bFlag = 1;
+ DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
+ m_state=OMX_StateExecuting;
+ DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n");
+ }
+ /* Requesting transition from Idle to Idle */
+ else if (eState == OMX_StateIdle) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
+ post_event(OMX_EventError,OMX_ErrorSameState,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorSameState;
+ }
+ /* Requesting transition from Idle to WaitForResources */
+ else if (eState == OMX_StateWaitForResources) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
+ post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+ /* Requesting transition from Idle to Pause */
+ else if (eState == OMX_StatePause) {
+ /*To pause the Video core we need to start the driver*/
+ if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
+ NULL) < */0) {
+ DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
+ omx_report_error ();
+ eRet = OMX_ErrorHardware;
+ } else {
+ BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
+ DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
+ bFlag = 0;
+ }
+ }
+ /* Requesting transition from Idle to Invalid */
+ else if (eState == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
+ post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorInvalidState;
+ } else {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
- return eRet;
+ /******************************/
+ /* Current State is Executing */
+ /******************************/
+ else if (m_state == OMX_StateExecuting) {
+ DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
+ /* Requesting transition from Executing to Idle */
+ if (eState == OMX_StateIdle) {
+ /* Since error is None , we will post an event
+ at the end of this function definition
+ */
+ DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
+ BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+ if (!sem_posted) {
+ sem_posted = 1;
+ sem_post (&m_cmd_lock);
+ execute_omx_flush(OMX_ALL);
+ }
+ bFlag = 0;
+ }
+ /* Requesting transition from Executing to Paused */
+ else if (eState == OMX_StatePause) {
+ DEBUG_PRINT_LOW("\n PAUSE Command Issued");
+ m_state = OMX_StatePause;
+ bFlag = 1;
+ }
+ /* Requesting transition from Executing to Loaded */
+ else if (eState == OMX_StateLoaded) {
+ DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
+ post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+ /* Requesting transition from Executing to WaitForResources */
+ else if (eState == OMX_StateWaitForResources) {
+ DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
+ post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+ /* Requesting transition from Executing to Executing */
+ else if (eState == OMX_StateExecuting) {
+ DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
+ post_event(OMX_EventError,OMX_ErrorSameState,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorSameState;
+ }
+ /* Requesting transition from Executing to Invalid */
+ else if (eState == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
+ post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorInvalidState;
+ } else {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ /***************************/
+ /* Current State is Pause */
+ /***************************/
+ else if (m_state == OMX_StatePause) {
+ /* Requesting transition from Pause to Executing */
+ if (eState == OMX_StateExecuting) {
+ DEBUG_PRINT_LOW("\n Pause --> Executing \n");
+ m_state = OMX_StateExecuting;
+ bFlag = 1;
+ }
+ /* Requesting transition from Pause to Idle */
+ else if (eState == OMX_StateIdle) {
+ /* Since error is None , we will post an event
+ at the end of this function definition */
+ DEBUG_PRINT_LOW("\n Pause --> Idle \n");
+ BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+ if (!sem_posted) {
+ sem_posted = 1;
+ sem_post (&m_cmd_lock);
+ execute_omx_flush(OMX_ALL);
+ }
+ bFlag = 0;
+ }
+ /* Requesting transition from Pause to loaded */
+ else if (eState == OMX_StateLoaded) {
+ DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
+ post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+ /* Requesting transition from Pause to WaitForResources */
+ else if (eState == OMX_StateWaitForResources) {
+ DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
+ post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+ /* Requesting transition from Pause to Pause */
+ else if (eState == OMX_StatePause) {
+ DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
+ post_event(OMX_EventError,OMX_ErrorSameState,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorSameState;
+ }
+ /* Requesting transition from Pause to Invalid */
+ else if (eState == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
+ post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorInvalidState;
+ } else {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ /***************************/
+ /* Current State is WaitForResources */
+ /***************************/
+ else if (m_state == OMX_StateWaitForResources) {
+ /* Requesting transition from WaitForResources to Loaded */
+ if (eState == OMX_StateLoaded) {
+ /* Since error is None , we will post an event
+ at the end of this function definition */
+ DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
+ }
+ /* Requesting transition from WaitForResources to WaitForResources */
+ else if (eState == OMX_StateWaitForResources) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
+ post_event(OMX_EventError,OMX_ErrorSameState,
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorSameState;
+ }
+ /* Requesting transition from WaitForResources to Executing */
+ else if (eState == OMX_StateExecuting) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
+ post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+ /* Requesting transition from WaitForResources to Pause */
+ else if (eState == OMX_StatePause) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
+ post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+ /* Requesting transition from WaitForResources to Invalid */
+ else if (eState == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
+ post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorInvalidState;
+ }
+ /* Requesting transition from WaitForResources to Loaded -
+ is NOT tested by Khronos TS */
+
+ } else {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ /********************************/
+ /* Current State is Invalid */
+ /*******************************/
+ else if (m_state == OMX_StateInvalid) {
+ /* State Transition from Inavlid to any state */
+ if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
+ || OMX_StateIdle || OMX_StateExecuting
+ || OMX_StatePause || OMX_StateInvalid)) {
+ DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
+ post_event(OMX_EventError,OMX_ErrorInvalidState,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorInvalidState;
+ }
+ } else if (cmd == OMX_CommandFlush) {
+ DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
+ "with param1: %lu", param1);
+ if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
+ BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
+ }
+ if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
+ BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
+ }
+ if (!sem_posted) {
+ sem_posted = 1;
+ DEBUG_PRINT_LOW("\n Set the Semaphore");
+ sem_post (&m_cmd_lock);
+ execute_omx_flush(param1);
+ }
+ bFlag = 0;
+ } else if ( cmd == OMX_CommandPortEnable) {
+ DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
+ "with param1: %lu", param1);
+ if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
+ m_inp_bEnabled = OMX_TRUE;
+
+ if ( (m_state == OMX_StateLoaded &&
+ !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+ || allocate_input_done()) {
+ post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ } else {
+ DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
+ BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
+ // Skip the event notification
+ bFlag = 0;
+ }
+ }
+ if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
+ DEBUG_PRINT_LOW("\n Enable output Port command recieved");
+ m_out_bEnabled = OMX_TRUE;
+
+ if ( (m_state == OMX_StateLoaded &&
+ !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+ || (allocate_output_done())) {
+ post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+
+ } else {
+ DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
+ BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+ // Skip the event notification
+ bFlag = 0;
+ }
+ }
+ } else if (cmd == OMX_CommandPortDisable) {
+ DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
+ "with param1: %lu", param1);
+ if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
+ m_inp_bEnabled = OMX_FALSE;
+ if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+ && release_input_done()) {
+ post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ } else {
+ BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
+ if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+ if (!sem_posted) {
+ sem_posted = 1;
+ sem_post (&m_cmd_lock);
+ }
+ execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
+ }
+
+ // Skip the event notification
+ bFlag = 0;
+ }
+ }
+ if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
+ m_out_bEnabled = OMX_FALSE;
+ DEBUG_PRINT_LOW("\n Disable output Port command recieved");
+ if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+ && release_output_done()) {
+ post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ } else {
+ BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+ if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
+ if (!sem_posted) {
+ sem_posted = 1;
+ sem_post (&m_cmd_lock);
+ }
+ BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
+ execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
+ }
+ // Skip the event notification
+ bFlag = 0;
+
+ }
+ }
+ } else {
+ DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
+ eRet = OMX_ErrorNotImplemented;
+ }
+ if (eRet == OMX_ErrorNone && bFlag) {
+ post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
+ }
+ if (!sem_posted) {
+ sem_post(&m_cmd_lock);
+ }
+
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::ExecuteOmxFlush
+ FUNCTION
+ omx_vdec::ExecuteOmxFlush
-DESCRIPTION
- Executes the OMX flush.
+ DESCRIPTION
+ Executes the OMX flush.
-PARAMETERS
- flushtype - input flush(1)/output flush(0)/ both.
+ PARAMETERS
+ flushtype - input flush(1)/output flush(0)/ both.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
bool omx_vdec::execute_omx_flush(OMX_U32 flushType)
{
- bool bRet = false;
- struct v4l2_plane plane;
- struct v4l2_buffer v4l2_buf;
- struct v4l2_decoder_cmd dec;
- DEBUG_PRINT_LOW("in %s, flushing %d", __func__, flushType);
- memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
- dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
+ bool bRet = false;
+ struct v4l2_plane plane;
+ struct v4l2_buffer v4l2_buf;
+ struct v4l2_decoder_cmd dec;
+ DEBUG_PRINT_LOW("in %s, flushing %d", __func__, flushType);
+ memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
+ dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
- DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig);
+ DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig);
- if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX)
- {
- output_flush_progress = true;
- dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
- }
- else
- {
- /* XXX: The driver/hardware does not support flushing of individual ports
- * in all states. So we pretty much need to flush both ports internally,
- * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
- * requested. Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
- * we automatically omit sending the FLUSH done for the "opposite" port. */
- input_flush_progress = true;
- output_flush_progress = true;
- dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
- }
+ if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) {
+ output_flush_progress = true;
+ dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
+ } else {
+ /* XXX: The driver/hardware does not support flushing of individual ports
+ * in all states. So we pretty much need to flush both ports internally,
+ * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
+ * requested. Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
+ * we automatically omit sending the FLUSH done for the "opposite" port. */
+ input_flush_progress = true;
+ output_flush_progress = true;
+ dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
+ }
- if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
- {
- DEBUG_PRINT_ERROR("\n Flush Port (%lu) Failed ", flushType);
- bRet = false;
- }
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
+ DEBUG_PRINT_ERROR("\n Flush Port (%lu) Failed ", flushType);
+ bRet = false;
+ }
- return bRet;
+ return bRet;
}
/*=========================================================================
FUNCTION : execute_output_flush
DESCRIPTION
- Executes the OMX flush at OUTPUT PORT.
+Executes the OMX flush at OUTPUT PORT.
PARAMETERS
- None.
+None.
RETURN VALUE
- true/false
+true/false
==========================================================================*/
bool omx_vdec::execute_output_flush()
{
- unsigned p1 = 0; // Parameter - 1
- unsigned p2 = 0; // Parameter - 2
- unsigned ident = 0;
- bool bRet = true;
+ unsigned p1 = 0; // Parameter - 1
+ unsigned p2 = 0; // Parameter - 2
+ unsigned ident = 0;
+ bool bRet = true;
- /*Generate FBD for all Buffers in the FTBq*/
- pthread_mutex_lock(&m_lock);
- DEBUG_PRINT_LOW("\n Initiate Output Flush");
- while (m_ftb_q.m_size)
- {
- DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
- m_ftb_q.m_size,pending_output_buffers);
- m_ftb_q.pop_entry(&p1,&p2,&ident);
- DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
- if(ident == m_fill_output_msg )
- {
- m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+ /*Generate FBD for all Buffers in the FTBq*/
+ pthread_mutex_lock(&m_lock);
+ DEBUG_PRINT_LOW("\n Initiate Output Flush");
+ while (m_ftb_q.m_size) {
+ DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
+ m_ftb_q.m_size,pending_output_buffers);
+ m_ftb_q.pop_entry(&p1,&p2,&ident);
+ DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
+ if (ident == m_fill_output_msg ) {
+ m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+ } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
+ fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+ }
}
- else if (ident == OMX_COMPONENT_GENERATE_FBD)
- {
- fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
- }
- }
- pthread_mutex_unlock(&m_lock);
- output_flush_progress = false;
+ pthread_mutex_unlock(&m_lock);
+ output_flush_progress = false;
- if (arbitrary_bytes)
- {
- prev_ts = LLONG_MAX;
- rst_prev_ts = true;
- }
- DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
- return bRet;
+ if (arbitrary_bytes) {
+ prev_ts = LLONG_MAX;
+ rst_prev_ts = true;
+ }
+ DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
+ return bRet;
}
/*=========================================================================
FUNCTION : execute_input_flush
DESCRIPTION
- Executes the OMX flush at INPUT PORT.
+Executes the OMX flush at INPUT PORT.
PARAMETERS
- None.
+None.
RETURN VALUE
- true/false
+true/false
==========================================================================*/
bool omx_vdec::execute_input_flush()
{
- unsigned i =0;
- unsigned p1 = 0; // Parameter - 1
- unsigned p2 = 0; // Parameter - 2
- unsigned ident = 0;
- bool bRet = true;
+ unsigned i =0;
+ unsigned p1 = 0; // Parameter - 1
+ unsigned p2 = 0; // Parameter - 2
+ unsigned ident = 0;
+ bool bRet = true;
- /*Generate EBD for all Buffers in the ETBq*/
- DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
+ /*Generate EBD for all Buffers in the ETBq*/
+ DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
- pthread_mutex_lock(&m_lock);
- DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
- while (m_etb_q.m_size)
- {
- m_etb_q.pop_entry(&p1,&p2,&ident);
+ pthread_mutex_lock(&m_lock);
+ DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
+ while (m_etb_q.m_size) {
+ m_etb_q.pop_entry(&p1,&p2,&ident);
- if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
- {
- DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
- m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+ if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
+ DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
+ m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
+ } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
+ pending_input_buffers++;
+ DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
+ (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
+ empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+ } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
+ DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
+ (OMX_BUFFERHEADERTYPE *)p1);
+ empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+ }
}
- else if(ident == OMX_COMPONENT_GENERATE_ETB)
- {
- pending_input_buffers++;
- DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
- (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
- empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
- }
- else if (ident == OMX_COMPONENT_GENERATE_EBD)
- {
- DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
- (OMX_BUFFERHEADERTYPE *)p1);
- empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
- }
- }
- time_stamp_dts.flush_timestamp();
- /*Check if Heap Buffers are to be flushed*/
- if (arbitrary_bytes && !(codec_config_flag))
- {
- DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
- h264_scratch.nFilledLen = 0;
- nal_count = 0;
- look_ahead_nal = false;
- frame_count = 0;
- h264_last_au_ts = LLONG_MAX;
- h264_last_au_flags = 0;
- memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
- m_demux_entries = 0;
- DEBUG_PRINT_LOW("\n Initialize parser");
- if (m_frame_parser.mutils)
- {
- m_frame_parser.mutils->initialize_frame_checking_environment();
- }
+ time_stamp_dts.flush_timestamp();
+ /*Check if Heap Buffers are to be flushed*/
+ if (arbitrary_bytes && !(codec_config_flag)) {
+ DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
+ h264_scratch.nFilledLen = 0;
+ nal_count = 0;
+ look_ahead_nal = false;
+ frame_count = 0;
+ h264_last_au_ts = LLONG_MAX;
+ h264_last_au_flags = 0;
+ memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+ m_demux_entries = 0;
+ DEBUG_PRINT_LOW("\n Initialize parser");
+ if (m_frame_parser.mutils) {
+ m_frame_parser.mutils->initialize_frame_checking_environment();
+ }
- while (m_input_pending_q.m_size)
- {
- m_input_pending_q.pop_entry(&p1,&p2,&ident);
- m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
- }
+ while (m_input_pending_q.m_size) {
+ m_input_pending_q.pop_entry(&p1,&p2,&ident);
+ m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
+ }
- if (psource_frame)
- {
- m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
- psource_frame = NULL;
- }
+ if (psource_frame) {
+ m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
+ psource_frame = NULL;
+ }
- if (pdest_frame)
- {
- pdest_frame->nFilledLen = 0;
- m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
- (unsigned int)NULL);
- pdest_frame = NULL;
+ if (pdest_frame) {
+ pdest_frame->nFilledLen = 0;
+ m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
+ (unsigned int)NULL);
+ pdest_frame = NULL;
+ }
+ m_frame_parser.flush();
+ } else if (codec_config_flag) {
+ DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
+ "is not sent to the driver yet");
}
- m_frame_parser.flush();
- }
- else if (codec_config_flag)
- {
- DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
- "is not sent to the driver yet");
- }
- pthread_mutex_unlock(&m_lock);
- input_flush_progress = false;
- if (!arbitrary_bytes)
- {
- prev_ts = LLONG_MAX;
- rst_prev_ts = true;
- }
+ pthread_mutex_unlock(&m_lock);
+ input_flush_progress = false;
+ if (!arbitrary_bytes) {
+ prev_ts = LLONG_MAX;
+ rst_prev_ts = true;
+ }
#ifdef _ANDROID_
- if (m_debug_timestamp)
- {
- m_timestamp_list.reset_ts_list();
- }
+ if (m_debug_timestamp) {
+ m_timestamp_list.reset_ts_list();
+ }
#endif
- DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
- return bRet;
+ DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
+ return bRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::SendCommandEvent
+ FUNCTION
+ omx_vdec::SendCommandEvent
-DESCRIPTION
- Send the event to decoder pipe. This is needed to generate the callbacks
- in decoder thread context.
+ DESCRIPTION
+ Send the event to decoder pipe. This is needed to generate the callbacks
+ in decoder thread context.
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
bool omx_vdec::post_event(unsigned int p1,
- unsigned int p2,
- unsigned int id)
+ unsigned int p2,
+ unsigned int id)
{
- bool bRet = false;
+ bool bRet = false;
- pthread_mutex_lock(&m_lock);
+ pthread_mutex_lock(&m_lock);
- if (id == m_fill_output_msg ||
- id == OMX_COMPONENT_GENERATE_FBD)
- {
- m_ftb_q.insert_entry(p1,p2,id);
- }
- else if (id == OMX_COMPONENT_GENERATE_ETB ||
- id == OMX_COMPONENT_GENERATE_EBD ||
- id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
- {
- m_etb_q.insert_entry(p1,p2,id);
- }
- else
- {
- m_cmd_q.insert_entry(p1,p2,id);
- }
+ if (id == m_fill_output_msg ||
+ id == OMX_COMPONENT_GENERATE_FBD) {
+ m_ftb_q.insert_entry(p1,p2,id);
+ } else if (id == OMX_COMPONENT_GENERATE_ETB ||
+ id == OMX_COMPONENT_GENERATE_EBD ||
+ id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
+ m_etb_q.insert_entry(p1,p2,id);
+ } else {
+ m_cmd_q.insert_entry(p1,p2,id);
+ }
- bRet = true;
- DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
- post_message(this, id);
+ bRet = true;
+ DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
+ post_message(this, id);
- pthread_mutex_unlock(&m_lock);
+ pthread_mutex_unlock(&m_lock);
- return bRet;
+ return bRet;
}
OMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- if(!profileLevelType)
- return OMX_ErrorBadParameter;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ if (!profileLevelType)
+ return OMX_ErrorBadParameter;
- if(profileLevelType->nPortIndex == 0) {
- if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
- {
- if (profileLevelType->nProfileIndex == 0)
- {
- profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
- profileLevelType->eLevel = OMX_VIDEO_AVCLevel4;
+ if (profileLevelType->nPortIndex == 0) {
+ if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+ if (profileLevelType->nProfileIndex == 0) {
+ profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
+ profileLevelType->eLevel = OMX_VIDEO_AVCLevel4;
- }
- else if (profileLevelType->nProfileIndex == 1)
- {
- profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
- profileLevelType->eLevel = OMX_VIDEO_AVCLevel4;
- }
- else if(profileLevelType->nProfileIndex == 2)
- {
- profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
- profileLevelType->eLevel = OMX_VIDEO_AVCLevel4;
- }
- else
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n",
- profileLevelType->nProfileIndex);
- eRet = OMX_ErrorNoMore;
- }
+ } else if (profileLevelType->nProfileIndex == 1) {
+ profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+ profileLevelType->eLevel = OMX_VIDEO_AVCLevel4;
+ } else if (profileLevelType->nProfileIndex == 2) {
+ profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+ profileLevelType->eLevel = OMX_VIDEO_AVCLevel4;
+ } else {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n",
+ profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
+ if (profileLevelType->nProfileIndex == 0) {
+ profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
+ profileLevelType->eLevel = OMX_VIDEO_H263Level70;
+ } else {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+ if (profileLevelType->nProfileIndex == 0) {
+ profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+ profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5;
+ } else if (profileLevelType->nProfileIndex == 1) {
+ profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+ profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5;
+ } else {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+ eRet = OMX_ErrorNoMore;
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+ if (profileLevelType->nProfileIndex == 0) {
+ profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
+ profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL;
+ } else if (profileLevelType->nProfileIndex == 1) {
+ profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
+ profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL;
+ } else {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ } else {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s\n", drv_ctx.kind);
+ eRet = OMX_ErrorNoMore;
+ }
+ } else {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
}
- else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)))
- {
- if (profileLevelType->nProfileIndex == 0)
- {
- profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
- profileLevelType->eLevel = OMX_VIDEO_H263Level70;
- }
- else
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
- eRet = OMX_ErrorNoMore;
- }
- }
- else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
- {
- if (profileLevelType->nProfileIndex == 0)
- {
- profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
- profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5;
- }
- else if(profileLevelType->nProfileIndex == 1)
- {
- profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
- profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5;
- }
- else
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
- eRet = OMX_ErrorNoMore;
- }
- }
- else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE))
- {
- eRet = OMX_ErrorNoMore;
- }
- else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
- {
- if (profileLevelType->nProfileIndex == 0)
- {
- profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
- profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL;
- }
- else if(profileLevelType->nProfileIndex == 1)
- {
- profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
- profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL;
- }
- else
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
- eRet = OMX_ErrorNoMore;
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s\n", drv_ctx.kind);
- eRet = OMX_ErrorNoMore;
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex);
- eRet = OMX_ErrorBadPortIndex;
- }
- return eRet;
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::GetParameter
+ FUNCTION
+ omx_vdec::GetParameter
-DESCRIPTION
- OMX Get Parameter method implementation
+ DESCRIPTION
+ OMX Get Parameter method implementation
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- Error None if successful.
+ RETURN VALUE
+ Error None if successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_INDEXTYPE paramIndex,
- OMX_INOUT OMX_PTR paramData)
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_INOUT OMX_PTR paramData)
{
OMX_ERRORTYPE eRet = OMX_ErrorNone;
DEBUG_PRINT_LOW("get_parameter: \n");
- if(m_state == OMX_StateInvalid)
- {
+ if (m_state == OMX_StateInvalid) {
DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
return OMX_ErrorInvalidState;
}
- if(paramData == NULL)
- {
+ if (paramData == NULL) {
DEBUG_PRINT_LOW("Get Param in Invalid paramData \n");
return OMX_ErrorBadParameter;
}
- switch((unsigned long)paramIndex)
- {
- case OMX_IndexParamPortDefinition:
- {
- OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
- (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
- eRet = update_portdef(portDefn);
- if (eRet == OMX_ErrorNone)
- m_port_def = *portDefn;
- break;
- }
- case OMX_IndexParamVideoInit:
- {
- OMX_PORT_PARAM_TYPE *portParamType =
- (OMX_PORT_PARAM_TYPE *) paramData;
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
+ switch ((unsigned long)paramIndex) {
+ case OMX_IndexParamPortDefinition: {
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
+ (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
+ eRet = update_portdef(portDefn);
+ if (eRet == OMX_ErrorNone)
+ m_port_def = *portDefn;
+ break;
+ }
+ case OMX_IndexParamVideoInit: {
+ OMX_PORT_PARAM_TYPE *portParamType =
+ (OMX_PORT_PARAM_TYPE *) paramData;
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
- portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
- portParamType->nSize = sizeof(portParamType);
- portParamType->nPorts = 2;
- portParamType->nStartPortNumber = 0;
- break;
- }
- case OMX_IndexParamVideoPortFormat:
- {
- OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
- (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
+ portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+ portParamType->nSize = sizeof(portParamType);
+ portParamType->nPorts = 2;
+ portParamType->nStartPortNumber = 0;
+ break;
+ }
+ case OMX_IndexParamVideoPortFormat: {
+ OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+ (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
- portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
- portFmt->nSize = sizeof(portFmt);
+ portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
+ portFmt->nSize = sizeof(portFmt);
- if (0 == portFmt->nPortIndex)
- {
- if (0 == portFmt->nIndex)
- {
- portFmt->eColorFormat = OMX_COLOR_FormatUnused;
- portFmt->eCompressionFormat = eCompressionFormat;
- }
- else
- {
- DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
- " NoMore compression formats\n");
- eRet = OMX_ErrorNoMore;
- }
- }
- else if (1 == portFmt->nPortIndex)
- {
- portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused;
+ if (0 == portFmt->nPortIndex) {
+ if (0 == portFmt->nIndex) {
+ portFmt->eColorFormat = OMX_COLOR_FormatUnused;
+ portFmt->eCompressionFormat = eCompressionFormat;
+ } else {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
+ " NoMore compression formats\n");
+ eRet = OMX_ErrorNoMore;
+ }
+ } else if (1 == portFmt->nPortIndex) {
+ portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused;
- if(0 == portFmt->nIndex)
- portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
- QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
- else if (1 == portFmt->nIndex)
- portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
- else
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
- " NoMore Color formats\n");
- eRet = OMX_ErrorNoMore;
- }
- DEBUG_PRINT_LOW("returning %d\n", portFmt->eColorFormat);
- }
- else
- {
- DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
- (int)portFmt->nPortIndex);
- eRet = OMX_ErrorBadPortIndex;
- }
- break;
- }
- /*Component should support this port definition*/
- case OMX_IndexParamAudioInit:
- {
- OMX_PORT_PARAM_TYPE *audioPortParamType =
- (OMX_PORT_PARAM_TYPE *) paramData;
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
- audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
- audioPortParamType->nSize = sizeof(audioPortParamType);
- audioPortParamType->nPorts = 0;
- audioPortParamType->nStartPortNumber = 0;
- break;
- }
- /*Component should support this port definition*/
- case OMX_IndexParamImageInit:
- {
- OMX_PORT_PARAM_TYPE *imagePortParamType =
- (OMX_PORT_PARAM_TYPE *) paramData;
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
- imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
- imagePortParamType->nSize = sizeof(imagePortParamType);
- imagePortParamType->nPorts = 0;
- imagePortParamType->nStartPortNumber = 0;
- break;
+ if (0 == portFmt->nIndex)
+ portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+ else if (1 == portFmt->nIndex)
+ portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
+ else {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
+ " NoMore Color formats\n");
+ eRet = OMX_ErrorNoMore;
+ }
+ DEBUG_PRINT_LOW("returning %d\n", portFmt->eColorFormat);
+ } else {
+ DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
+ (int)portFmt->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
+ /*Component should support this port definition*/
+ case OMX_IndexParamAudioInit: {
+ OMX_PORT_PARAM_TYPE *audioPortParamType =
+ (OMX_PORT_PARAM_TYPE *) paramData;
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
+ audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+ audioPortParamType->nSize = sizeof(audioPortParamType);
+ audioPortParamType->nPorts = 0;
+ audioPortParamType->nStartPortNumber = 0;
+ break;
+ }
+ /*Component should support this port definition*/
+ case OMX_IndexParamImageInit: {
+ OMX_PORT_PARAM_TYPE *imagePortParamType =
+ (OMX_PORT_PARAM_TYPE *) paramData;
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
+ imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+ imagePortParamType->nSize = sizeof(imagePortParamType);
+ imagePortParamType->nPorts = 0;
+ imagePortParamType->nStartPortNumber = 0;
+ break;
- }
- /*Component should support this port definition*/
- case OMX_IndexParamOtherInit:
- {
- DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
- paramIndex);
- eRet =OMX_ErrorUnsupportedIndex;
- break;
- }
- case OMX_IndexParamStandardComponentRole:
- {
- OMX_PARAM_COMPONENTROLETYPE *comp_role;
- comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
- comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
- comp_role->nSize = sizeof(*comp_role);
+ }
+ /*Component should support this port definition*/
+ case OMX_IndexParamOtherInit: {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
+ paramIndex);
+ eRet =OMX_ErrorUnsupportedIndex;
+ break;
+ }
+ case OMX_IndexParamStandardComponentRole: {
+ OMX_PARAM_COMPONENTROLETYPE *comp_role;
+ comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+ comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
+ comp_role->nSize = sizeof(*comp_role);
- DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
- paramIndex);
- strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
- OMX_MAX_STRINGNAME_SIZE);
- break;
- }
- /* Added for parameter test */
- case OMX_IndexParamPriorityMgmt:
- {
+ DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
+ paramIndex);
+ strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
+ OMX_MAX_STRINGNAME_SIZE);
+ break;
+ }
+ /* Added for parameter test */
+ case OMX_IndexParamPriorityMgmt: {
- OMX_PRIORITYMGMTTYPE *priorityMgmType =
- (OMX_PRIORITYMGMTTYPE *) paramData;
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
- priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
- priorityMgmType->nSize = sizeof(priorityMgmType);
+ OMX_PRIORITYMGMTTYPE *priorityMgmType =
+ (OMX_PRIORITYMGMTTYPE *) paramData;
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
+ priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
+ priorityMgmType->nSize = sizeof(priorityMgmType);
- break;
- }
- /* Added for parameter test */
- case OMX_IndexParamCompBufferSupplier:
- {
- OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
- (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
+ break;
+ }
+ /* Added for parameter test */
+ case OMX_IndexParamCompBufferSupplier: {
+ OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
+ (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
- bufferSupplierType->nSize = sizeof(bufferSupplierType);
- bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
- if(0 == bufferSupplierType->nPortIndex)
- bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
- else if (1 == bufferSupplierType->nPortIndex)
- bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
- else
- eRet = OMX_ErrorBadPortIndex;
+ bufferSupplierType->nSize = sizeof(bufferSupplierType);
+ bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
+ if (0 == bufferSupplierType->nPortIndex)
+ bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
+ else if (1 == bufferSupplierType->nPortIndex)
+ bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
+ else
+ eRet = OMX_ErrorBadPortIndex;
- break;
- }
- case OMX_IndexParamVideoAvc:
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
- paramIndex);
- break;
- }
- case OMX_IndexParamVideoH263:
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
- paramIndex);
- break;
- }
- case OMX_IndexParamVideoMpeg4:
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
- paramIndex);
- break;
- }
- case OMX_IndexParamVideoMpeg2:
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
- paramIndex);
- break;
- }
- case OMX_IndexParamVideoProfileLevelQuerySupported:
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
- OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
- (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
- eRet = get_supported_profile_level_for_1080p(profileLevelType);
- break;
- }
+ break;
+ }
+ case OMX_IndexParamVideoAvc: {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
+ paramIndex);
+ break;
+ }
+ case OMX_IndexParamVideoH263: {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
+ paramIndex);
+ break;
+ }
+ case OMX_IndexParamVideoMpeg4: {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
+ paramIndex);
+ break;
+ }
+ case OMX_IndexParamVideoMpeg2: {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
+ paramIndex);
+ break;
+ }
+ case OMX_IndexParamVideoProfileLevelQuerySupported: {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
+ OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
+ (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
+ eRet = get_supported_profile_level_for_1080p(profileLevelType);
+ break;
+ }
#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
- case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
- {
- DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
- GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
- if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
+ case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: {
+ DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
+ GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
+ if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
- if(secure_mode) {
- nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
- GRALLOC_USAGE_PRIVATE_UNCACHED);
- } else {
- nativeBuffersUsage->nUsage =
- (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP |
- GRALLOC_USAGE_PRIVATE_UNCACHED);
- }
- } else {
- DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
- eRet = OMX_ErrorBadParameter;
- }
- }
- break;
+ if (secure_mode) {
+ nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
+ GRALLOC_USAGE_PRIVATE_UNCACHED);
+ } else {
+ nativeBuffersUsage->nUsage =
+ (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP |
+ GRALLOC_USAGE_PRIVATE_UNCACHED);
+ }
+ } else {
+ DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ break;
#endif
- default:
- {
- DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
- eRet =OMX_ErrorUnsupportedIndex;
+ default: {
+ DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
+ eRet =OMX_ErrorUnsupportedIndex;
+ }
+
}
- }
+ DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
+ drv_ctx.video_resolution.frame_width,
+ drv_ctx.video_resolution.frame_height,
+ drv_ctx.video_resolution.stride,
+ drv_ctx.video_resolution.scan_lines);
- DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
- drv_ctx.video_resolution.frame_width,
- drv_ctx.video_resolution.frame_height,
- drv_ctx.video_resolution.stride,
- drv_ctx.video_resolution.scan_lines);
-
- return eRet;
+ return eRet;
}
#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
@@ -3085,22 +2735,22 @@
OMX_ERRORTYPE eRet = OMX_ErrorNone;
UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
- if((params == NULL) ||
- (params->nativeBuffer == NULL) ||
- (params->nativeBuffer->handle == NULL) ||
- !m_enable_android_native_buffers)
+ if ((params == NULL) ||
+ (params->nativeBuffer == NULL) ||
+ (params->nativeBuffer->handle == NULL) ||
+ !m_enable_android_native_buffers)
return OMX_ErrorBadParameter;
m_use_android_native_buffers = OMX_TRUE;
sp<android_native_buffer_t> nBuf = params->nativeBuffer;
private_handle_t *handle = (private_handle_t *)nBuf->handle;
- if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
+ if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
OMX_U8 *buffer = NULL;
- if(!secure_mode) {
- buffer = (OMX_U8*)mmap(0, handle->size,
+ if (!secure_mode) {
+ buffer = (OMX_U8*)mmap(0, handle->size,
PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
- if(buffer == MAP_FAILED) {
- DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
- return OMX_ErrorInsufficientResources;
+ if (buffer == MAP_FAILED) {
+ DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
+ return OMX_ErrorInsufficientResources;
}
}
eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
@@ -3111,1077 +2761,906 @@
}
#endif
/* ======================================================================
-FUNCTION
- omx_vdec::Setparameter
+ FUNCTION
+ omx_vdec::Setparameter
-DESCRIPTION
- OMX Set Parameter method implementation.
+ DESCRIPTION
+ OMX Set Parameter method implementation.
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- OMX Error None if successful.
+ RETURN VALUE
+ OMX Error None if successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_INDEXTYPE paramIndex,
- OMX_IN OMX_PTR paramData)
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_IN OMX_PTR paramData)
{
OMX_ERRORTYPE eRet = OMX_ErrorNone;
int ret=0;
struct v4l2_format fmt;
- if(m_state == OMX_StateInvalid)
- {
+ if (m_state == OMX_StateInvalid) {
DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
return OMX_ErrorInvalidState;
}
- if(paramData == NULL)
- {
- DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
- return OMX_ErrorBadParameter;
+ if (paramData == NULL) {
+ DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
+ return OMX_ErrorBadParameter;
}
- if((m_state != OMX_StateLoaded) &&
- BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
- (m_out_bEnabled == OMX_TRUE) &&
- BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
- (m_inp_bEnabled == OMX_TRUE)) {
+ if ((m_state != OMX_StateLoaded) &&
+ BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
+ (m_out_bEnabled == OMX_TRUE) &&
+ BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
+ (m_inp_bEnabled == OMX_TRUE)) {
DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
return OMX_ErrorIncorrectStateOperation;
}
- switch((unsigned long)paramIndex)
- {
- case OMX_IndexParamPortDefinition:
- {
- OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
- portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
- //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
- //been called.
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
- (int)portDefn->format.video.nFrameHeight,
- (int)portDefn->format.video.nFrameWidth);
- if(OMX_DirOutput == portDefn->eDir)
- {
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
- m_display_id = portDefn->format.video.pNativeWindow;
- unsigned int buffer_size;
- if (!client_buffers.get_buffer_req(buffer_size)) {
- DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
- eRet = OMX_ErrorBadParameter;
- } else {
- if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
- portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size )
- {
- drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
- drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
- drv_ctx.extradata_info.count = drv_ctx.op_buf.actualcount;
- drv_ctx.extradata_info.size = drv_ctx.extradata_info.count *
- drv_ctx.extradata_info.buffer_size;
- eRet = set_buffer_req(&drv_ctx.op_buf);
- if (eRet == OMX_ErrorNone)
- m_port_def = *portDefn;
- }
- else
- {
- DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
- drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
- portDefn->nBufferCountActual, portDefn->nBufferSize);
- eRet = OMX_ErrorBadParameter;
- }
- }
- }
- else if(OMX_DirInput == portDefn->eDir)
- {
- bool port_format_changed = false;
- if((portDefn->format.video.xFramerate >> 16) > 0 &&
- (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
- {
- // Frame rate only should be set if this is a "known value" or to
- // activate ts prediction logic (arbitrary mode only) sending input
- // timestamps with max value (LLONG_MAX).
- DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
- portDefn->format.video.xFramerate >> 16);
- Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
- drv_ctx.frame_rate.fps_denominator);
- if(!drv_ctx.frame_rate.fps_numerator)
- {
- DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
- drv_ctx.frame_rate.fps_numerator = 30;
- }
- if(drv_ctx.frame_rate.fps_denominator)
- drv_ctx.frame_rate.fps_numerator = (int)
- drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
- drv_ctx.frame_rate.fps_denominator = 1;
- frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
- drv_ctx.frame_rate.fps_numerator;
- DEBUG_PRINT_LOW("set_parameter: frm_int(%lu) fps(%.2f)",
- frm_int, drv_ctx.frame_rate.fps_numerator /
- (float)drv_ctx.frame_rate.fps_denominator);
- }
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
- if(drv_ctx.video_resolution.frame_height !=
- portDefn->format.video.nFrameHeight ||
- drv_ctx.video_resolution.frame_width !=
- portDefn->format.video.nFrameWidth)
- {
- DEBUG_PRINT_LOW("\n SetParam IP: WxH(%lu x %lu)\n",
- portDefn->format.video.nFrameWidth,
- portDefn->format.video.nFrameHeight);
- port_format_changed = true;
- if (portDefn->format.video.nFrameHeight != 0x0 &&
- portDefn->format.video.nFrameWidth != 0x0)
- {
- update_resolution(portDefn->format.video.nFrameWidth,
- portDefn->format.video.nFrameHeight,
- portDefn->format.video.nFrameWidth,
- portDefn->format.video.nFrameHeight);
- eRet = is_video_session_supported();
- if (eRet)
- break;
- fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
- fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
- fmt.fmt.pix_mp.pixelformat = output_capability;
- DEBUG_PRINT_LOW("\n fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d \n",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
- ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
- if (ret)
- {
- DEBUG_PRINT_ERROR("\n Set Resolution failed");
- eRet = OMX_ErrorUnsupportedSetting;
- }
- else
- eRet = get_buffer_req(&drv_ctx.op_buf);
- }
- }
- if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
- || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)
- {
- port_format_changed = true;
- vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
- drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
- drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
- (~(buffer_prop->alignment - 1));
- eRet = set_buffer_req(buffer_prop);
- }
- if (false == port_format_changed)
- {
- DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
- drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
- portDefn->nBufferCountActual, portDefn->nBufferSize);
- eRet = OMX_ErrorBadParameter;
- }
- }
- else if (portDefn->eDir == OMX_DirMax)
- {
- DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
- (int)portDefn->nPortIndex);
- eRet = OMX_ErrorBadPortIndex;
- }
- }
- break;
- case OMX_IndexParamVideoPortFormat:
- {
- OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
- (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
- int ret=0;
- struct v4l2_format fmt;
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
- portFmt->eColorFormat);
+ switch ((unsigned long)paramIndex) {
+ case OMX_IndexParamPortDefinition: {
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+ portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+ //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
+ //been called.
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
+ (int)portDefn->format.video.nFrameHeight,
+ (int)portDefn->format.video.nFrameWidth);
+ if (OMX_DirOutput == portDefn->eDir) {
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
+ m_display_id = portDefn->format.video.pNativeWindow;
+ unsigned int buffer_size;
+ if (!client_buffers.get_buffer_req(buffer_size)) {
+ DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
+ eRet = OMX_ErrorBadParameter;
+ } else {
+ if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
+ portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size ) {
+ drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
+ drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
+ drv_ctx.extradata_info.count = drv_ctx.op_buf.actualcount;
+ drv_ctx.extradata_info.size = drv_ctx.extradata_info.count *
+ drv_ctx.extradata_info.buffer_size;
+ eRet = set_buffer_req(&drv_ctx.op_buf);
+ if (eRet == OMX_ErrorNone)
+ m_port_def = *portDefn;
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
+ drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
+ portDefn->nBufferCountActual, portDefn->nBufferSize);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ } else if (OMX_DirInput == portDefn->eDir) {
+ bool port_format_changed = false;
+ if ((portDefn->format.video.xFramerate >> 16) > 0 &&
+ (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
+ // Frame rate only should be set if this is a "known value" or to
+ // activate ts prediction logic (arbitrary mode only) sending input
+ // timestamps with max value (LLONG_MAX).
+ DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
+ portDefn->format.video.xFramerate >> 16);
+ Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
+ drv_ctx.frame_rate.fps_denominator);
+ if (!drv_ctx.frame_rate.fps_numerator) {
+ DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
+ drv_ctx.frame_rate.fps_numerator = 30;
+ }
+ if (drv_ctx.frame_rate.fps_denominator)
+ drv_ctx.frame_rate.fps_numerator = (int)
+ drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
+ drv_ctx.frame_rate.fps_denominator = 1;
+ frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
+ drv_ctx.frame_rate.fps_numerator;
+ DEBUG_PRINT_LOW("set_parameter: frm_int(%lu) fps(%.2f)",
+ frm_int, drv_ctx.frame_rate.fps_numerator /
+ (float)drv_ctx.frame_rate.fps_denominator);
+ }
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
+ if (drv_ctx.video_resolution.frame_height !=
+ portDefn->format.video.nFrameHeight ||
+ drv_ctx.video_resolution.frame_width !=
+ portDefn->format.video.nFrameWidth) {
+ DEBUG_PRINT_LOW("\n SetParam IP: WxH(%lu x %lu)\n",
+ portDefn->format.video.nFrameWidth,
+ portDefn->format.video.nFrameHeight);
+ port_format_changed = true;
+ if (portDefn->format.video.nFrameHeight != 0x0 &&
+ portDefn->format.video.nFrameWidth != 0x0) {
+ update_resolution(portDefn->format.video.nFrameWidth,
+ portDefn->format.video.nFrameHeight,
+ portDefn->format.video.nFrameWidth,
+ portDefn->format.video.nFrameHeight);
+ eRet = is_video_session_supported();
+ if (eRet)
+ break;
+ fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+ fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+ fmt.fmt.pix_mp.pixelformat = output_capability;
+ DEBUG_PRINT_LOW("\n fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d \n",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+ if (ret) {
+ DEBUG_PRINT_ERROR("\n Set Resolution failed");
+ eRet = OMX_ErrorUnsupportedSetting;
+ } else
+ eRet = get_buffer_req(&drv_ctx.op_buf);
+ }
+ }
+ if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
+ || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
+ port_format_changed = true;
+ vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
+ drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
+ drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
+ (~(buffer_prop->alignment - 1));
+ eRet = set_buffer_req(buffer_prop);
+ }
+ if (false == port_format_changed) {
+ DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
+ drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
+ portDefn->nBufferCountActual, portDefn->nBufferSize);
+ eRet = OMX_ErrorBadParameter;
+ }
+ } else if (portDefn->eDir == OMX_DirMax) {
+ DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
+ (int)portDefn->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ }
+ break;
+ case OMX_IndexParamVideoPortFormat: {
+ OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
+ (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+ int ret=0;
+ struct v4l2_format fmt;
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
+ portFmt->eColorFormat);
- if(1 == portFmt->nPortIndex)
- {
- fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
- fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
- fmt.fmt.pix_mp.pixelformat = capture_capability;
- enum vdec_output_fromat op_format;
- if((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
- QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
- (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
- op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
- else if(portFmt->eColorFormat ==
- (OMX_COLOR_FORMATTYPE)
- QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
- op_format = VDEC_YUV_FORMAT_TILE_4x2;
- else
- eRet = OMX_ErrorBadParameter;
+ if (1 == portFmt->nPortIndex) {
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+ fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+ fmt.fmt.pix_mp.pixelformat = capture_capability;
+ enum vdec_output_fromat op_format;
+ if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
+ (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
+ op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
+ else if (portFmt->eColorFormat ==
+ (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
+ op_format = VDEC_YUV_FORMAT_TILE_4x2;
+ else
+ eRet = OMX_ErrorBadParameter;
- if(eRet == OMX_ErrorNone)
- {
- drv_ctx.output_format = op_format;
- ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
- if(ret)
- {
- DEBUG_PRINT_ERROR("\n Set output format failed");
- eRet = OMX_ErrorUnsupportedSetting;
- /*TODO: How to handle this case */
- }
- else
- {
- eRet = get_buffer_req(&drv_ctx.op_buf);
- }
- }
- if (eRet == OMX_ErrorNone){
- if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
- DEBUG_PRINT_ERROR("\n Set color format failed");
- eRet = OMX_ErrorBadParameter;
- }
- }
- }
- }
- break;
+ if (eRet == OMX_ErrorNone) {
+ drv_ctx.output_format = op_format;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+ if (ret) {
+ DEBUG_PRINT_ERROR("\n Set output format failed");
+ eRet = OMX_ErrorUnsupportedSetting;
+ /*TODO: How to handle this case */
+ } else {
+ eRet = get_buffer_req(&drv_ctx.op_buf);
+ }
+ }
+ if (eRet == OMX_ErrorNone) {
+ if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
+ DEBUG_PRINT_ERROR("\n Set color format failed");
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ }
+ }
+ break;
- case OMX_QcomIndexPortDefn:
- {
- OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
- (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %lu\n",
- portFmt->nFramePackingFormat);
+ case OMX_QcomIndexPortDefn: {
+ OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
+ (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %lu\n",
+ portFmt->nFramePackingFormat);
- /* Input port */
- if (portFmt->nPortIndex == 0)
- {
- if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
- {
- if(secure_mode) {
- arbitrary_bytes = false;
- DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
- eRet = OMX_ErrorUnsupportedSetting;
- } else {
- arbitrary_bytes = true;
- }
- }
- else if (portFmt->nFramePackingFormat ==
- OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
- {
- arbitrary_bytes = false;
- }
- else
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu\n",
- portFmt->nFramePackingFormat);
- eRet = OMX_ErrorUnsupportedSetting;
- }
- }
- else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
- {
- DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
- if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
- portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
- portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
- {
- m_out_mem_region_smi = OMX_TRUE;
- if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
- {
- DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
- m_use_output_pmem = OMX_TRUE;
- }
- }
- }
- }
- break;
+ /* Input port */
+ if (portFmt->nPortIndex == 0) {
+ if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
+ if (secure_mode) {
+ arbitrary_bytes = false;
+ DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
+ eRet = OMX_ErrorUnsupportedSetting;
+ } else {
+ arbitrary_bytes = true;
+ }
+ } else if (portFmt->nFramePackingFormat ==
+ OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
+ arbitrary_bytes = false;
+ } else {
+ DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu\n",
+ portFmt->nFramePackingFormat);
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
+ DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
+ if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
+ portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
+ portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
+ m_out_mem_region_smi = OMX_TRUE;
+ if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
+ DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
+ m_use_output_pmem = OMX_TRUE;
+ }
+ }
+ }
+ }
+ break;
- case OMX_IndexParamStandardComponentRole:
- {
- OMX_PARAM_COMPONENTROLETYPE *comp_role;
- comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
- comp_role->cRole);
+ case OMX_IndexParamStandardComponentRole: {
+ OMX_PARAM_COMPONENTROLETYPE *comp_role;
+ comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
+ comp_role->cRole);
- if((m_state == OMX_StateLoaded)&&
- !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
- {
- DEBUG_PRINT_LOW("Set Parameter called in valid state");
- }
- else
- {
- DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
- return OMX_ErrorIncorrectStateOperation;
- }
+ if ((m_state == OMX_StateLoaded)&&
+ !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+ DEBUG_PRINT_LOW("Set Parameter called in valid state");
+ } else {
+ DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
+ return OMX_ErrorIncorrectStateOperation;
+ }
- if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
- {
- if(!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
- }
- else
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
- eRet =OMX_ErrorUnsupportedSetting;
- }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
- {
- if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
- }
- else
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
- eRet = OMX_ErrorUnsupportedSetting;
- }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
- {
- if(!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
- }
- else
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
- eRet =OMX_ErrorUnsupportedSetting;
- }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
- {
- if(!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
- }
- else
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
- eRet = OMX_ErrorUnsupportedSetting;
- }
- }
- else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
- (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
- )
- {
- if(!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
- }
- else
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
- eRet =OMX_ErrorUnsupportedSetting;
- }
- }
- else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
- (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
- )
- {
- if(!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
- {
- strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
- }
- else
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
- eRet =OMX_ErrorUnsupportedSetting;
- }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE))
- {
- if(!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
- (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE)))
- {
- strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
- }
- else
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
- eRet = OMX_ErrorUnsupportedSetting;
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
- eRet = OMX_ErrorInvalidComponentName;
- }
- break;
- }
+ if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+ if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+ } else {
+ DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+ eRet =OMX_ErrorUnsupportedSetting;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+ if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+ } else {
+ DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+ if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+ } else {
+ DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+ eRet =OMX_ErrorUnsupportedSetting;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+ if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
+ } else {
+ DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
+ (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
+ ) {
+ if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+ } else {
+ DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+ eRet =OMX_ErrorUnsupportedSetting;
+ }
+ } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
+ (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
+ ) {
+ if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
+ strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+ } else {
+ DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+ eRet =OMX_ErrorUnsupportedSetting;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+ if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
+ (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) {
+ strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+ } else {
+ DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ } else {
+ DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
+ eRet = OMX_ErrorInvalidComponentName;
+ }
+ break;
+ }
- case OMX_IndexParamPriorityMgmt:
- {
- if(m_state != OMX_StateLoaded)
- {
- DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
- return OMX_ErrorIncorrectStateOperation;
- }
- OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %lu\n",
- priorityMgmtype->nGroupID);
+ case OMX_IndexParamPriorityMgmt: {
+ if (m_state != OMX_StateLoaded) {
+ DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
+ return OMX_ErrorIncorrectStateOperation;
+ }
+ OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %lu\n",
+ priorityMgmtype->nGroupID);
- DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %lu\n",
- priorityMgmtype->nGroupPriority);
+ DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %lu\n",
+ priorityMgmtype->nGroupPriority);
- m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
- m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
+ m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
+ m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
- break;
- }
+ break;
+ }
- case OMX_IndexParamCompBufferSupplier:
- {
- OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
- bufferSupplierType->eBufferSupplier);
- if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
- m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
+ case OMX_IndexParamCompBufferSupplier: {
+ OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
+ bufferSupplierType->eBufferSupplier);
+ if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
+ m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
- else
+ else
- eRet = OMX_ErrorBadPortIndex;
+ eRet = OMX_ErrorBadPortIndex;
- break;
+ break;
- }
- case OMX_IndexParamVideoAvc:
- {
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
- paramIndex);
- break;
- }
- case OMX_IndexParamVideoH263:
- {
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
- paramIndex);
- break;
- }
- case OMX_IndexParamVideoMpeg4:
- {
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
- paramIndex);
- break;
- }
- case OMX_IndexParamVideoMpeg2:
- {
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
- paramIndex);
- break;
- }
- case OMX_QcomIndexParamVideoDecoderPictureOrder:
- {
- QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
- (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
- struct v4l2_control control;
- int pic_order,rc=0;
- DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
- pictureOrder->eOutputPictureOrder);
- if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
- pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
- }
- else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
- pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
- time_stamp_dts.set_timestamp_reorder_mode(false);
- }
- else
- eRet = OMX_ErrorBadParameter;
- if (eRet == OMX_ErrorNone)
- {
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
- control.value = pic_order;
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
- if(rc)
- {
- DEBUG_PRINT_ERROR("\n Set picture order failed");
- eRet = OMX_ErrorUnsupportedSetting;
- }
- }
- break;
- }
- case OMX_QcomIndexParamConcealMBMapExtraData:
- if(!secure_mode)
- eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
- ((QOMX_ENABLETYPE *)paramData)->bEnable);
- else {
- DEBUG_PRINT_ERROR("\n secure mode setting not supported");
- eRet = OMX_ErrorUnsupportedSetting;
- }
- break;
- case OMX_QcomIndexParamFrameInfoExtraData:
- {
- if(!secure_mode)
- eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
- ((QOMX_ENABLETYPE *)paramData)->bEnable);
- else {
- DEBUG_PRINT_ERROR("\n secure mode setting not supported");
- eRet = OMX_ErrorUnsupportedSetting;
- }
- break;
- }
- case OMX_QcomIndexParamInterlaceExtraData:
- if(!secure_mode)
- eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
- ((QOMX_ENABLETYPE *)paramData)->bEnable);
- else {
- DEBUG_PRINT_ERROR("\n secure mode setting not supported");
- eRet = OMX_ErrorUnsupportedSetting;
- }
- break;
- case OMX_QcomIndexParamH264TimeInfo:
- if(!secure_mode)
- eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
- ((QOMX_ENABLETYPE *)paramData)->bEnable);
- else {
- DEBUG_PRINT_ERROR("\n secure mode setting not supported");
- eRet = OMX_ErrorUnsupportedSetting;
- }
- break;
- case OMX_QcomIndexParamVideoDivx:
- {
- QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
- }
- break;
- case OMX_QcomIndexPlatformPvt:
- {
- DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
- OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
- if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
- {
- DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
- eRet = OMX_ErrorUnsupportedSetting;
- }
- else
- {
- m_out_pvt_entry_pmem = OMX_TRUE;
- if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
- {
- DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
- m_use_output_pmem = OMX_TRUE;
- }
- }
+ }
+ case OMX_IndexParamVideoAvc: {
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
+ paramIndex);
+ break;
+ }
+ case OMX_IndexParamVideoH263: {
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
+ paramIndex);
+ break;
+ }
+ case OMX_IndexParamVideoMpeg4: {
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
+ paramIndex);
+ break;
+ }
+ case OMX_IndexParamVideoMpeg2: {
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
+ paramIndex);
+ break;
+ }
+ case OMX_QcomIndexParamVideoDecoderPictureOrder: {
+ QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
+ (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
+ struct v4l2_control control;
+ int pic_order,rc=0;
+ DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
+ pictureOrder->eOutputPictureOrder);
+ if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
+ pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
+ } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
+ pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
+ time_stamp_dts.set_timestamp_reorder_mode(false);
+ } else
+ eRet = OMX_ErrorBadParameter;
+ if (eRet == OMX_ErrorNone) {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
+ control.value = pic_order;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ DEBUG_PRINT_ERROR("\n Set picture order failed");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ }
+ break;
+ }
+ case OMX_QcomIndexParamConcealMBMapExtraData:
+ if (!secure_mode)
+ eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
+ ((QOMX_ENABLETYPE *)paramData)->bEnable);
+ else {
+ DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ case OMX_QcomIndexParamFrameInfoExtraData: {
+ if (!secure_mode)
+ eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
+ ((QOMX_ENABLETYPE *)paramData)->bEnable);
+ else {
+ DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ }
+ case OMX_QcomIndexParamInterlaceExtraData:
+ if (!secure_mode)
+ eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
+ ((QOMX_ENABLETYPE *)paramData)->bEnable);
+ else {
+ DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ case OMX_QcomIndexParamH264TimeInfo:
+ if (!secure_mode)
+ eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
+ ((QOMX_ENABLETYPE *)paramData)->bEnable);
+ else {
+ DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ case OMX_QcomIndexParamVideoDivx: {
+ QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
+ }
+ break;
+ case OMX_QcomIndexPlatformPvt: {
+ DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
+ OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
+ if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
+ DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
+ eRet = OMX_ErrorUnsupportedSetting;
+ } else {
+ m_out_pvt_entry_pmem = OMX_TRUE;
+ if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
+ DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
+ m_use_output_pmem = OMX_TRUE;
+ }
+ }
- }
- break;
- case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
- {
- DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
- DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
- struct v4l2_control control;
- int rc;
- drv_ctx.idr_only_decoding = 1;
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
- control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
- if(rc)
- {
- DEBUG_PRINT_ERROR("\n Set picture order failed");
- eRet = OMX_ErrorUnsupportedSetting;
- } else {
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
- control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
- if(rc)
- {
- DEBUG_PRINT_ERROR("\n Sync frame setting failed");
- eRet = OMX_ErrorUnsupportedSetting;
- }
- /*Setting sync frame decoding on driver might change buffer
- * requirements so update them here*/
- if (get_buffer_req(&drv_ctx.ip_buf)) {
- DEBUG_PRINT_ERROR("\n Sync frame setting failed: falied to get buffer i/p requirements");
- eRet = OMX_ErrorUnsupportedSetting;
- }
- if (get_buffer_req(&drv_ctx.op_buf)) {
- DEBUG_PRINT_ERROR("\n Sync frame setting failed: falied to get buffer o/p requirements");
- eRet = OMX_ErrorUnsupportedSetting;
- }
- }
- }
- break;
+ }
+ break;
+ case OMX_QcomIndexParamVideoSyncFrameDecodingMode: {
+ DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
+ DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
+ struct v4l2_control control;
+ int rc;
+ drv_ctx.idr_only_decoding = 1;
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
+ control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ DEBUG_PRINT_ERROR("\n Set picture order failed");
+ eRet = OMX_ErrorUnsupportedSetting;
+ } else {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
+ control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ DEBUG_PRINT_ERROR("\n Sync frame setting failed");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ /*Setting sync frame decoding on driver might change buffer
+ * requirements so update them here*/
+ if (get_buffer_req(&drv_ctx.ip_buf)) {
+ DEBUG_PRINT_ERROR("\n Sync frame setting failed: falied to get buffer i/p requirements");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ if (get_buffer_req(&drv_ctx.op_buf)) {
+ DEBUG_PRINT_ERROR("\n Sync frame setting failed: falied to get buffer o/p requirements");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ }
+ }
+ break;
- case OMX_QcomIndexParamIndexExtraDataType:
- {
- if(!secure_mode) {
- QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
- if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
- (extradataIndexType->bEnabled == OMX_TRUE) &&
- (extradataIndexType->nPortIndex == 1))
- {
- DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
- eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
+ case OMX_QcomIndexParamIndexExtraDataType: {
+ if (!secure_mode) {
+ QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
+ if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
+ (extradataIndexType->bEnabled == OMX_TRUE) &&
+ (extradataIndexType->nPortIndex == 1)) {
+ DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
+ eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
- }
- }
- }
- break;
- case OMX_QcomIndexParamEnableSmoothStreaming:
- {
+ }
+ }
+ }
+ break;
+ case OMX_QcomIndexParamEnableSmoothStreaming: {
#ifndef SMOOTH_STREAMING_DISABLED
- struct v4l2_control control;
- struct v4l2_format fmt;
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
- control.value = 1;
- int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
- if(rc < 0) {
- DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
- eRet = OMX_ErrorHardware;
- }
+ struct v4l2_control control;
+ struct v4l2_format fmt;
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
+ control.value = 1;
+ int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
+ if (rc < 0) {
+ DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
+ eRet = OMX_ErrorHardware;
+ }
#else
- eRet = OMX_ErrorUnsupportedSetting;
+ eRet = OMX_ErrorUnsupportedSetting;
#endif
- }
- break;
+ }
+ break;
#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
- /* Need to allow following two set_parameters even in Idle
- * state. This is ANDROID architecture which is not in sync
- * with openmax standard. */
- case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
- {
- EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
- if(enableNativeBuffers) {
- m_enable_android_native_buffers = enableNativeBuffers->enable;
- }
- }
- break;
- case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
- {
- eRet = use_android_native_buffer(hComp, paramData);
- }
- break;
+ /* Need to allow following two set_parameters even in Idle
+ * state. This is ANDROID architecture which is not in sync
+ * with openmax standard. */
+ case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: {
+ EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
+ if (enableNativeBuffers) {
+ m_enable_android_native_buffers = enableNativeBuffers->enable;
+ }
+ }
+ break;
+ case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: {
+ eRet = use_android_native_buffer(hComp, paramData);
+ }
+ break;
#endif
- case OMX_QcomIndexParamEnableTimeStampReorder:
- {
- QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
- if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
- if (reorder->bEnable == OMX_TRUE) {
- frm_int =0;
- time_stamp_dts.set_timestamp_reorder_mode(true);
- }
- else
- time_stamp_dts.set_timestamp_reorder_mode(false);
- } else {
- time_stamp_dts.set_timestamp_reorder_mode(false);
- if (reorder->bEnable == OMX_TRUE)
- {
- eRet = OMX_ErrorUnsupportedSetting;
- }
- }
- }
- break;
- case OMX_IndexParamVideoProfileLevelCurrent:
- {
- OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam =
- (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
- if (pParam) {
- m_profile_lvl.eProfile = pParam->eProfile;
- m_profile_lvl.eLevel = pParam->eLevel;
- }
- break;
+ case OMX_QcomIndexParamEnableTimeStampReorder: {
+ QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
+ if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
+ if (reorder->bEnable == OMX_TRUE) {
+ frm_int =0;
+ time_stamp_dts.set_timestamp_reorder_mode(true);
+ } else
+ time_stamp_dts.set_timestamp_reorder_mode(false);
+ } else {
+ time_stamp_dts.set_timestamp_reorder_mode(false);
+ if (reorder->bEnable == OMX_TRUE) {
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ }
+ }
+ break;
+ case OMX_IndexParamVideoProfileLevelCurrent: {
+ OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam =
+ (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
+ if (pParam) {
+ m_profile_lvl.eProfile = pParam->eProfile;
+ m_profile_lvl.eLevel = pParam->eLevel;
+ }
+ break;
- }
- default:
- {
- DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
- eRet = OMX_ErrorUnsupportedIndex;
+ }
+ default: {
+ DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
+ eRet = OMX_ErrorUnsupportedIndex;
+ }
}
- }
- return eRet;
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::GetConfig
+ FUNCTION
+ omx_vdec::GetConfig
-DESCRIPTION
- OMX Get Config Method implementation.
+ DESCRIPTION
+ OMX Get Config Method implementation.
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- OMX Error None if successful.
+ RETURN VALUE
+ OMX Error None if successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_INDEXTYPE configIndex,
- OMX_INOUT OMX_PTR configData)
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_INOUT OMX_PTR configData)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
- if (m_state == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
- return OMX_ErrorInvalidState;
- }
-
- switch ((unsigned long)configIndex)
- {
- case OMX_QcomIndexConfigInterlaced:
- {
- OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
- (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
- if (configFmt->nPortIndex == 1)
- {
- if (configFmt->nIndex == 0)
- {
- configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
- }
- else if (configFmt->nIndex == 1)
- {
- configFmt->eInterlaceType =
- OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
- }
- else if (configFmt->nIndex == 2)
- {
- configFmt->eInterlaceType =
- OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
- }
- else
- {
- DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
- " NoMore Interlaced formats\n");
- eRet = OMX_ErrorNoMore;
- }
-
- }
- else
- {
- DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
- (int)configFmt->nPortIndex);
- eRet = OMX_ErrorBadPortIndex;
- }
- break;
- }
- case OMX_QcomIndexQueryNumberOfVideoDecInstance:
- {
- QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
- (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
- decoderinstances->nNumOfInstances = 16;
- /*TODO: How to handle this case */
- break;
- }
- case OMX_QcomIndexConfigVideoFramePackingArrangement:
- {
- if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
- {
- OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
- (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
- h264_parser->get_frame_pack_data(configFmt);
- }
- else
- {
- DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
- }
- break;
- }
- case OMX_IndexConfigCommonOutputCrop:
- {
- OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
- memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
- break;
- }
- default:
- {
- DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
- eRet = OMX_ErrorBadParameter;
- }
-
- }
-
- return eRet;
-}
-
-/* ======================================================================
-FUNCTION
- omx_vdec::SetConfig
-
-DESCRIPTION
- OMX Set Config method implementation
-
-PARAMETERS
- <TBD>.
-
-RETURN VALUE
- OMX Error None if successful.
-========================================================================== */
-OMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_INDEXTYPE configIndex,
- OMX_IN OMX_PTR configData)
-{
- if(m_state == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
- return OMX_ErrorInvalidState;
- }
-
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- OMX_VIDEO_CONFIG_NALSIZE *pNal;
-
- DEBUG_PRINT_LOW("\n Set Config Called");
-
- if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData)
- {
- OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
- DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
- if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
- {
- DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
- OMX_U32 extra_size;
- // Parsing done here for the AVC atom is definitely not generic
- // Currently this piece of code is working, but certainly
- // not tested with all .mp4 files.
- // Incase of failure, we might need to revisit this
- // for a generic piece of code.
-
- // Retrieve size of NAL length field
- // byte #4 contains the size of NAL lenght field
- nal_length = (config->pData[4] & 0x03) + 1;
-
- extra_size = 0;
- if (nal_length > 2)
- {
- /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
- extra_size = (nal_length - 2) * 2;
- }
-
- // SPS starts from byte #6
- OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
- OMX_U8 *pDestBuf;
- m_vendor_config.nPortIndex = config->nPortIndex;
-
- // minus 6 --> SPS starts from byte #6
- // minus 1 --> picture param set byte to be ignored from avcatom
- m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
- m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
- OMX_U32 len;
- OMX_U8 index = 0;
- // case where SPS+PPS is sent as part of set_config
- pDestBuf = m_vendor_config.pData;
-
- DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%lu] len[%lu] data[%p]\n",
- m_vendor_config.nPortIndex,
- m_vendor_config.nDataSize,
- m_vendor_config.pData);
- while (index < 2)
- {
- uint8 *psize;
- len = *pSrcBuf;
- len = len << 8;
- len |= *(pSrcBuf + 1);
- psize = (uint8 *) & len;
- memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
- for (unsigned int i = 0; i < nal_length; i++)
- {
- pDestBuf[i] = psize[nal_length - 1 - i];
- }
- //memcpy(pDestBuf,pSrcBuf,(len+2));
- pDestBuf += len + nal_length;
- pSrcBuf += len + 2;
- index++;
- pSrcBuf++; // skip picture param set
- len = 0;
- }
- }
- else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
- !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2"))
- {
- m_vendor_config.nPortIndex = config->nPortIndex;
- m_vendor_config.nDataSize = config->nDataSize;
- m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
- memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
- }
- else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
- {
- if(m_vendor_config.pData)
- {
- free(m_vendor_config.pData);
- m_vendor_config.pData = NULL;
- m_vendor_config.nDataSize = 0;
- }
-
- if (((*((OMX_U32 *) config->pData)) &
- VC1_SP_MP_START_CODE_MASK) ==
- VC1_SP_MP_START_CODE)
- {
- DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
- m_vendor_config.nPortIndex = config->nPortIndex;
- m_vendor_config.nDataSize = config->nDataSize;
- m_vendor_config.pData =
- (OMX_U8 *) malloc(config->nDataSize);
- memcpy(m_vendor_config.pData, config->pData,
- config->nDataSize);
- m_vc1_profile = VC1_SP_MP_RCV;
- }
- else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE)
- {
- DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
- m_vendor_config.nPortIndex = config->nPortIndex;
- m_vendor_config.nDataSize = config->nDataSize;
- m_vendor_config.pData =
- (OMX_U8 *) malloc((config->nDataSize));
- memcpy(m_vendor_config.pData, config->pData,
- config->nDataSize);
- m_vc1_profile = VC1_AP;
- }
- else if ((config->nDataSize == VC1_STRUCT_C_LEN))
- {
- DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
- m_vendor_config.nPortIndex = config->nPortIndex;
- m_vendor_config.nDataSize = config->nDataSize;
- m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
- memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
- m_vc1_profile = VC1_SP_MP_RCV;
- }
- else
- {
- DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
- }
- }
- return ret;
- }
- else if (configIndex == OMX_IndexConfigVideoNalSize)
- {
- struct v4l2_control temp;
- temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT;
-
- pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
- switch (pNal->nNaluBytes) {
- case 0:
- temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES;
- break;
- case 2:
- temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH;
- break;
- case 4:
- temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH;
- break;
- default:
- return OMX_ErrorUnsupportedSetting;
- }
-
- if (!arbitrary_bytes) {
- /* In arbitrary bytes mode, the assembler strips out nal size and replaces
- * with start code, so only need to notify driver in frame by frame mode */
- if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp))
- {
- DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT");
- return OMX_ErrorHardware;
- }
- }
-
- nal_length = pNal->nNaluBytes;
- m_frame_parser.init_nal_length(nal_length);
-
- DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d", nal_length);
- return ret;
- }
- else if (configIndex == OMX_IndexVendorVideoFrameRate)
- {
- OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData;
- DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %d", config->nFps);
-
- if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX)
- {
- if (config->bEnabled)
- {
- if ((config->nFps >> 16) > 0)
- {
- DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %d",
- config->nFps >> 16);
- Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator,
- drv_ctx.frame_rate.fps_denominator);
-
- if (!drv_ctx.frame_rate.fps_numerator)
- {
- DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
- drv_ctx.frame_rate.fps_numerator = 30;
- }
-
- if (drv_ctx.frame_rate.fps_denominator)
- {
- drv_ctx.frame_rate.fps_numerator = (int)
- drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
- }
-
- drv_ctx.frame_rate.fps_denominator = 1;
- frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
- drv_ctx.frame_rate.fps_numerator;
-
- struct v4l2_outputparm oparm;
- /*XXX: we're providing timing info as seconds per frame rather than frames
- * per second.*/
- oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
- oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
-
- struct v4l2_streamparm sparm;
- sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- sparm.parm.output = oparm;
- if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm))
- {
- DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
- performance might be affected");
- ret = OMX_ErrorHardware;
- }
- client_set_fps = true;
- }
- else
- {
- DEBUG_PRINT_ERROR("Frame rate not supported.");
- ret = OMX_ErrorUnsupportedSetting;
- }
- }
- else
- {
- DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate");
- client_set_fps = false;
- }
- }
- else
- {
- DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d",
- (int)config->nPortIndex);
- ret = OMX_ErrorBadPortIndex;
- }
-
- return ret;
- }
-
- return OMX_ErrorNotImplemented;
-}
-
-/* ======================================================================
-FUNCTION
- omx_vdec::GetExtensionIndex
-
-DESCRIPTION
- OMX GetExtensionIndex method implementaion. <TBD>
-
-PARAMETERS
- <TBD>.
-
-RETURN VALUE
- OMX Error None if everything successful.
-
-========================================================================== */
-OMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_STRING paramName,
- OMX_OUT OMX_INDEXTYPE* indexType)
-{
- if(m_state == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
+ if (m_state == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
return OMX_ErrorInvalidState;
}
- else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
- *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
+
+ switch ((unsigned long)configIndex) {
+ case OMX_QcomIndexConfigInterlaced: {
+ OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
+ (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
+ if (configFmt->nPortIndex == 1) {
+ if (configFmt->nIndex == 0) {
+ configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
+ } else if (configFmt->nIndex == 1) {
+ configFmt->eInterlaceType =
+ OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
+ } else if (configFmt->nIndex == 2) {
+ configFmt->eInterlaceType =
+ OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
+ } else {
+ DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
+ " NoMore Interlaced formats\n");
+ eRet = OMX_ErrorNoMore;
+ }
+
+ } else {
+ DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
+ (int)configFmt->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
+ case OMX_QcomIndexQueryNumberOfVideoDecInstance: {
+ QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
+ (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
+ decoderinstances->nNumOfInstances = 16;
+ /*TODO: How to handle this case */
+ break;
+ }
+ case OMX_QcomIndexConfigVideoFramePackingArrangement: {
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
+ OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
+ (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
+ h264_parser->get_frame_pack_data(configFmt);
+ } else {
+ DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
+ }
+ break;
+ }
+ case OMX_IndexConfigCommonOutputCrop: {
+ OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
+ memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
+ break;
+ }
+ default: {
+ DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
+ eRet = OMX_ErrorBadParameter;
+ }
+
}
- else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
- {
+
+ return eRet;
+}
+
+/* ======================================================================
+ FUNCTION
+ omx_vdec::SetConfig
+
+ DESCRIPTION
+ OMX Set Config method implementation
+
+ PARAMETERS
+ <TBD>.
+
+ RETURN VALUE
+ OMX Error None if successful.
+ ========================================================================== */
+OMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_IN OMX_PTR configData)
+{
+ if (m_state == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_VIDEO_CONFIG_NALSIZE *pNal;
+
+ DEBUG_PRINT_LOW("\n Set Config Called");
+
+ if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) {
+ OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
+ DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
+ if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) {
+ DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
+ OMX_U32 extra_size;
+ // Parsing done here for the AVC atom is definitely not generic
+ // Currently this piece of code is working, but certainly
+ // not tested with all .mp4 files.
+ // Incase of failure, we might need to revisit this
+ // for a generic piece of code.
+
+ // Retrieve size of NAL length field
+ // byte #4 contains the size of NAL lenght field
+ nal_length = (config->pData[4] & 0x03) + 1;
+
+ extra_size = 0;
+ if (nal_length > 2) {
+ /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
+ extra_size = (nal_length - 2) * 2;
+ }
+
+ // SPS starts from byte #6
+ OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
+ OMX_U8 *pDestBuf;
+ m_vendor_config.nPortIndex = config->nPortIndex;
+
+ // minus 6 --> SPS starts from byte #6
+ // minus 1 --> picture param set byte to be ignored from avcatom
+ m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
+ m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
+ OMX_U32 len;
+ OMX_U8 index = 0;
+ // case where SPS+PPS is sent as part of set_config
+ pDestBuf = m_vendor_config.pData;
+
+ DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%lu] len[%lu] data[%p]\n",
+ m_vendor_config.nPortIndex,
+ m_vendor_config.nDataSize,
+ m_vendor_config.pData);
+ while (index < 2) {
+ uint8 *psize;
+ len = *pSrcBuf;
+ len = len << 8;
+ len |= *(pSrcBuf + 1);
+ psize = (uint8 *) & len;
+ memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
+ for (unsigned int i = 0; i < nal_length; i++) {
+ pDestBuf[i] = psize[nal_length - 1 - i];
+ }
+ //memcpy(pDestBuf,pSrcBuf,(len+2));
+ pDestBuf += len + nal_length;
+ pSrcBuf += len + 2;
+ index++;
+ pSrcBuf++; // skip picture param set
+ len = 0;
+ }
+ } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
+ !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) {
+ m_vendor_config.nPortIndex = config->nPortIndex;
+ m_vendor_config.nDataSize = config->nDataSize;
+ m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
+ memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
+ } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) {
+ if (m_vendor_config.pData) {
+ free(m_vendor_config.pData);
+ m_vendor_config.pData = NULL;
+ m_vendor_config.nDataSize = 0;
+ }
+
+ if (((*((OMX_U32 *) config->pData)) &
+ VC1_SP_MP_START_CODE_MASK) ==
+ VC1_SP_MP_START_CODE) {
+ DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
+ m_vendor_config.nPortIndex = config->nPortIndex;
+ m_vendor_config.nDataSize = config->nDataSize;
+ m_vendor_config.pData =
+ (OMX_U8 *) malloc(config->nDataSize);
+ memcpy(m_vendor_config.pData, config->pData,
+ config->nDataSize);
+ m_vc1_profile = VC1_SP_MP_RCV;
+ } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) {
+ DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
+ m_vendor_config.nPortIndex = config->nPortIndex;
+ m_vendor_config.nDataSize = config->nDataSize;
+ m_vendor_config.pData =
+ (OMX_U8 *) malloc((config->nDataSize));
+ memcpy(m_vendor_config.pData, config->pData,
+ config->nDataSize);
+ m_vc1_profile = VC1_AP;
+ } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) {
+ DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
+ m_vendor_config.nPortIndex = config->nPortIndex;
+ m_vendor_config.nDataSize = config->nDataSize;
+ m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
+ memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
+ m_vc1_profile = VC1_SP_MP_RCV;
+ } else {
+ DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
+ }
+ }
+ return ret;
+ } else if (configIndex == OMX_IndexConfigVideoNalSize) {
+ struct v4l2_control temp;
+ temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT;
+
+ pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
+ switch (pNal->nNaluBytes) {
+ case 0:
+ temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES;
+ break;
+ case 2:
+ temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH;
+ break;
+ case 4:
+ temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH;
+ break;
+ default:
+ return OMX_ErrorUnsupportedSetting;
+ }
+
+ if (!arbitrary_bytes) {
+ /* In arbitrary bytes mode, the assembler strips out nal size and replaces
+ * with start code, so only need to notify driver in frame by frame mode */
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) {
+ DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT");
+ return OMX_ErrorHardware;
+ }
+ }
+
+ nal_length = pNal->nNaluBytes;
+ m_frame_parser.init_nal_length(nal_length);
+
+ DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d", nal_length);
+ return ret;
+ } else if (configIndex == OMX_IndexVendorVideoFrameRate) {
+ OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData;
+ DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %d", config->nFps);
+
+ if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
+ if (config->bEnabled) {
+ if ((config->nFps >> 16) > 0) {
+ DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %d",
+ config->nFps >> 16);
+ Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator,
+ drv_ctx.frame_rate.fps_denominator);
+
+ if (!drv_ctx.frame_rate.fps_numerator) {
+ DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
+ drv_ctx.frame_rate.fps_numerator = 30;
+ }
+
+ if (drv_ctx.frame_rate.fps_denominator) {
+ drv_ctx.frame_rate.fps_numerator = (int)
+ drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
+ }
+
+ drv_ctx.frame_rate.fps_denominator = 1;
+ frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
+ drv_ctx.frame_rate.fps_numerator;
+
+ struct v4l2_outputparm oparm;
+ /*XXX: we're providing timing info as seconds per frame rather than frames
+ * per second.*/
+ oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
+ oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
+
+ struct v4l2_streamparm sparm;
+ sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ sparm.parm.output = oparm;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
+ DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
+ performance might be affected");
+ ret = OMX_ErrorHardware;
+ }
+ client_set_fps = true;
+ } else {
+ DEBUG_PRINT_ERROR("Frame rate not supported.");
+ ret = OMX_ErrorUnsupportedSetting;
+ }
+ } else {
+ DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate");
+ client_set_fps = false;
+ }
+ } else {
+ DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d",
+ (int)config->nPortIndex);
+ ret = OMX_ErrorBadPortIndex;
+ }
+
+ return ret;
+ }
+
+ return OMX_ErrorNotImplemented;
+}
+
+/* ======================================================================
+ FUNCTION
+ omx_vdec::GetExtensionIndex
+
+ DESCRIPTION
+ OMX GetExtensionIndex method implementaion. <TBD>
+
+ PARAMETERS
+ <TBD>.
+
+ RETURN VALUE
+ OMX Error None if everything successful.
+
+ ========================================================================== */
+OMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_STRING paramName,
+ OMX_OUT OMX_INDEXTYPE* indexType)
+{
+ if (m_state == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
+ *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
+ } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) {
*indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
}
#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
- else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
+ else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
*indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
- }
- else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
+ } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
*indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
- }
- else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
+ } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
*indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
- }
- else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
+ } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
*indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
}
#endif
- else {
+ else {
DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
return OMX_ErrorNotImplemented;
}
@@ -4189,1318 +3668,1231 @@
}
/* ======================================================================
-FUNCTION
- omx_vdec::GetState
+ FUNCTION
+ omx_vdec::GetState
-DESCRIPTION
- Returns the state information back to the caller.<TBD>
+ DESCRIPTION
+ Returns the state information back to the caller.<TBD>
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- Error None if everything is successful.
-========================================================================== */
+ RETURN VALUE
+ Error None if everything is successful.
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp,
- OMX_OUT OMX_STATETYPE* state)
+ OMX_OUT OMX_STATETYPE* state)
{
- *state = m_state;
- DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
- return OMX_ErrorNone;
+ *state = m_state;
+ DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
+ return OMX_ErrorNone;
}
/* ======================================================================
-FUNCTION
- omx_vdec::ComponentTunnelRequest
+ FUNCTION
+ omx_vdec::ComponentTunnelRequest
-DESCRIPTION
- OMX Component Tunnel Request method implementation. <TBD>
+ DESCRIPTION
+ OMX Component Tunnel Request method implementation. <TBD>
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- OMX Error None if everything successful.
+ RETURN VALUE
+ OMX Error None if everything successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_U32 port,
- OMX_IN OMX_HANDLETYPE peerComponent,
- OMX_IN OMX_U32 peerPort,
- OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_HANDLETYPE peerComponent,
+ OMX_IN OMX_U32 peerPort,
+ OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
{
- DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
- return OMX_ErrorNotImplemented;
+ DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
+ return OMX_ErrorNotImplemented;
}
/* ======================================================================
-FUNCTION
- omx_vdec::UseOutputBuffer
+ FUNCTION
+ omx_vdec::UseOutputBuffer
-DESCRIPTION
- Helper function for Use buffer in the input pin
+ DESCRIPTION
+ Helper function for Use buffer in the input pin
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::allocate_extradata()
{
#ifdef USE_ION
- if (drv_ctx.extradata_info.buffer_size) {
- if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
- munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
- close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
- free_ion_memory(&drv_ctx.extradata_info.ion);
+ if (drv_ctx.extradata_info.buffer_size) {
+ if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
+ munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
+ close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
+ free_ion_memory(&drv_ctx.extradata_info.ion);
+ }
+ drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
+ drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
+ drv_ctx.extradata_info.size, 4096,
+ &drv_ctx.extradata_info.ion.ion_alloc_data,
+ &drv_ctx.extradata_info.ion.fd_ion_data, 0);
+ if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
+ DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
+ drv_ctx.extradata_info.size,
+ PROT_READ|PROT_WRITE, MAP_SHARED,
+ drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
+ if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
+ DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
+ close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
+ free_ion_memory(&drv_ctx.extradata_info.ion);
+ return OMX_ErrorInsufficientResources;
+ }
}
- drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
- drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
- drv_ctx.extradata_info.size, 4096,
- &drv_ctx.extradata_info.ion.ion_alloc_data,
- &drv_ctx.extradata_info.ion.fd_ion_data, 0);
- if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
- DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
- return OMX_ErrorInsufficientResources;
- }
- drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
- drv_ctx.extradata_info.size,
- PROT_READ|PROT_WRITE, MAP_SHARED,
- drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
- if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
- DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
- close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
- free_ion_memory(&drv_ctx.extradata_info.ion);
- return OMX_ErrorInsufficientResources;
- }
- }
#endif
- return OMX_ErrorNone;
+ return OMX_ErrorNone;
}
-void omx_vdec::free_extradata() {
+void omx_vdec::free_extradata()
+{
#ifdef USE_ION
- if (drv_ctx.extradata_info.uaddr) {
- munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
- close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
- free_ion_memory(&drv_ctx.extradata_info.ion);
- }
- memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
+ if (drv_ctx.extradata_info.uaddr) {
+ munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
+ close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
+ free_ion_memory(&drv_ctx.extradata_info.ion);
+ }
+ memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
#endif
}
OMX_ERRORTYPE omx_vdec::use_output_buffer(
- OMX_IN OMX_HANDLETYPE hComp,
- OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
- OMX_IN OMX_U32 port,
- OMX_IN OMX_PTR appData,
- OMX_IN OMX_U32 bytes,
- OMX_IN OMX_U8* buffer)
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes,
+ OMX_IN OMX_U8* buffer)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
- unsigned i= 0; // Temporary counter
- struct vdec_setbuffer_cmd setbuffers;
- OMX_PTR privateAppData = NULL;
- private_handle_t *handle = NULL;
- OMX_U8 *buff = buffer;
- struct v4l2_buffer buf;
- struct v4l2_plane plane[VIDEO_MAX_PLANES];
- int extra_idx = 0;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
+ unsigned i= 0; // Temporary counter
+ struct vdec_setbuffer_cmd setbuffers;
+ OMX_PTR privateAppData = NULL;
+ private_handle_t *handle = NULL;
+ OMX_U8 *buff = buffer;
+ struct v4l2_buffer buf;
+ struct v4l2_plane plane[VIDEO_MAX_PLANES];
+ int extra_idx = 0;
- if (!m_out_mem_ptr) {
- DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
- eRet = allocate_output_headers();
- if (eRet == OMX_ErrorNone)
- eRet = allocate_extradata();
- }
-
- if (eRet == OMX_ErrorNone) {
- for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
- if(BITMASK_ABSENT(&m_out_bm_count,i))
- {
- break;
- }
+ if (!m_out_mem_ptr) {
+ DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
+ eRet = allocate_output_headers();
+ if (eRet == OMX_ErrorNone)
+ eRet = allocate_extradata();
}
- }
- if(i >= drv_ctx.op_buf.actualcount) {
- DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount);
- eRet = OMX_ErrorInsufficientResources;
- }
+ if (eRet == OMX_ErrorNone) {
+ for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
+ if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+ break;
+ }
+ }
+ }
- if (eRet == OMX_ErrorNone) {
+ if (i >= drv_ctx.op_buf.actualcount) {
+ DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount);
+ eRet = OMX_ErrorInsufficientResources;
+ }
+
+ if (eRet == OMX_ErrorNone) {
#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
- if(m_enable_android_native_buffers) {
- if (m_use_android_native_buffers) {
- UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
- sp<android_native_buffer_t> nBuf = params->nativeBuffer;
- handle = (private_handle_t *)nBuf->handle;
- privateAppData = params->pAppPrivate;
- } else {
- handle = (private_handle_t *)buff;
- privateAppData = appData;
- }
+ if (m_enable_android_native_buffers) {
+ if (m_use_android_native_buffers) {
+ UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
+ sp<android_native_buffer_t> nBuf = params->nativeBuffer;
+ handle = (private_handle_t *)nBuf->handle;
+ privateAppData = params->pAppPrivate;
+ } else {
+ handle = (private_handle_t *)buff;
+ privateAppData = appData;
+ }
- if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
- DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
- " expected %u, got %lu",
- drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
- return OMX_ErrorBadParameter;
- }
+ if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
+ DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
+ " expected %u, got %lu",
+ drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
+ return OMX_ErrorBadParameter;
+ }
- if (!m_use_android_native_buffers) {
- if (!secure_mode) {
- buff = (OMX_U8*)mmap(0, handle->size,
- PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
- if (buff == MAP_FAILED) {
- DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
- return OMX_ErrorInsufficientResources;
+ if (!m_use_android_native_buffers) {
+ if (!secure_mode) {
+ buff = (OMX_U8*)mmap(0, handle->size,
+ PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
+ if (buff == MAP_FAILED) {
+ DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
+ return OMX_ErrorInsufficientResources;
+ }
}
}
- }
#if defined(_ANDROID_ICS_)
- native_buffer[i].nativehandle = handle;
- native_buffer[i].privatehandle = handle;
+ native_buffer[i].nativehandle = handle;
+ native_buffer[i].privatehandle = handle;
#endif
- if(!handle) {
- DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
+ if (!handle) {
+ DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
+ return OMX_ErrorBadParameter;
+ }
+ drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
+ drv_ctx.ptr_outputbuffer[i].offset = 0;
+ drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
+ drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
+ drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size;
+ } else
+#endif
+
+ if (!ouput_egl_buffers && !m_use_output_pmem) {
+#ifdef USE_ION
+ drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
+ drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
+ &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
+ &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
+ if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
+ DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd);
+ return OMX_ErrorInsufficientResources;
+ }
+ drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+ drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
+#else
+ drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+ open (MEM_DEVICE,O_RDWR);
+
+ if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
+ DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
+ return OMX_ErrorInsufficientResources;
+ }
+
+ /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
+ if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
+ drv_ctx.ptr_outputbuffer[i].pmem_fd = \
+ open (MEM_DEVICE,O_RDWR);
+ if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
+ DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+
+ if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
+ drv_ctx.op_buf.buffer_size,
+ drv_ctx.op_buf.alignment)) {
+ DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+ close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
+ return OMX_ErrorInsufficientResources;
+ }
+#endif
+ if (!secure_mode) {
+ drv_ctx.ptr_outputbuffer[i].bufferaddr =
+ (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
+ PROT_READ|PROT_WRITE, MAP_SHARED,
+ drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
+ if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
+ close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
+#ifdef USE_ION
+ free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
+#endif
+ DEBUG_PRINT_ERROR("Unable to mmap output buffer\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+ drv_ctx.ptr_outputbuffer[i].offset = 0;
+ privateAppData = appData;
+ } else {
+
+ DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
+ if (!appData || !bytes ) {
+ if (!secure_mode && !buffer) {
+ DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
+ return OMX_ErrorBadParameter;
+ }
+ }
+
+ OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
+ OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
+ pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
+ if (!pmem_list->entryList || !pmem_list->entryList->entry ||
+ !pmem_list->nEntries ||
+ pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
+ DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
+ return OMX_ErrorBadParameter;
+ }
+ pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+ pmem_list->entryList->entry;
+ DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx",
+ pmem_info->pmem_fd);
+ drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
+ drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
+ drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
+ drv_ctx.ptr_outputbuffer[i].mmaped_size =
+ drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
+ privateAppData = appData;
+ }
+ m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
+ m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
+
+ *bufferHdr = (m_out_mem_ptr + i );
+ if (secure_mode)
+ drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
+ //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+ memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
+ sizeof (vdec_bufferpayload));
+
+ DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
+ drv_ctx.ptr_outputbuffer[i].bufferaddr,
+ drv_ctx.ptr_outputbuffer[i].pmem_fd );
+
+ buf.index = i;
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane[0].length = drv_ctx.op_buf.buffer_size;
+ plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
+ (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
+ plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
+ plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
+ plane[0].data_offset = 0;
+ extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+ if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+ plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
+ plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
+#ifdef USE_ION
+ plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
+#endif
+ plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
+ plane[extra_idx].data_offset = 0;
+ } else if (extra_idx >= VIDEO_MAX_PLANES) {
+ DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
return OMX_ErrorBadParameter;
}
- drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
- drv_ctx.ptr_outputbuffer[i].offset = 0;
- drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
- drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
- drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size;
- } else
-#endif
+ buf.m.planes = plane;
+ buf.length = drv_ctx.num_planes;
- if (!ouput_egl_buffers && !m_use_output_pmem) {
-#ifdef USE_ION
- drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
- drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
- &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
- &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
- if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
- DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd);
- return OMX_ErrorInsufficientResources;
- }
- drv_ctx.ptr_outputbuffer[i].pmem_fd = \
- drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
-#else
- drv_ctx.ptr_outputbuffer[i].pmem_fd = \
- open (MEM_DEVICE,O_RDWR);
-
- if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
- DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
- return OMX_ErrorInsufficientResources;
- }
-
- /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
- if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
- {
- drv_ctx.ptr_outputbuffer[i].pmem_fd = \
- open (MEM_DEVICE,O_RDWR);
- if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
- DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
+ DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
+ /*TODO: How to handle this case */
return OMX_ErrorInsufficientResources;
- }
}
- if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
- drv_ctx.op_buf.buffer_size,
- drv_ctx.op_buf.alignment))
- {
- DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
- close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
- return OMX_ErrorInsufficientResources;
- }
-#endif
- if(!secure_mode) {
- drv_ctx.ptr_outputbuffer[i].bufferaddr =
- (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
- PROT_READ|PROT_WRITE, MAP_SHARED,
- drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
- if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
- close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
-#ifdef USE_ION
- free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
-#endif
- DEBUG_PRINT_ERROR("Unable to mmap output buffer\n");
- return OMX_ErrorInsufficientResources;
+ if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
+ enum v4l2_buf_type buf_type;
+ buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
+ return OMX_ErrorInsufficientResources;
+ } else {
+ streaming[CAPTURE_PORT] = true;
+ DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
}
}
- drv_ctx.ptr_outputbuffer[i].offset = 0;
- privateAppData = appData;
- }
- else {
- DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
- if (!appData || !bytes ) {
- if(!secure_mode && !buffer) {
- DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
- return OMX_ErrorBadParameter;
- }
+ (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
+ if (m_enable_android_native_buffers) {
+ DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
+ (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
+ } else {
+ (*bufferHdr)->pBuffer = buff;
}
-
- OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
- OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
- pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
- if (!pmem_list->entryList || !pmem_list->entryList->entry ||
- !pmem_list->nEntries ||
- pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
- DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
- return OMX_ErrorBadParameter;
- }
- pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
- pmem_list->entryList->entry;
- DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx",
- pmem_info->pmem_fd);
- drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
- drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
- drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
- drv_ctx.ptr_outputbuffer[i].mmaped_size =
- drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
- privateAppData = appData;
- }
- m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
- m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
-
- *bufferHdr = (m_out_mem_ptr + i );
- if(secure_mode)
- drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
- //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
- sizeof (vdec_bufferpayload));
-
- DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
- drv_ctx.ptr_outputbuffer[i].bufferaddr,
- drv_ctx.ptr_outputbuffer[i].pmem_fd );
-
- buf.index = i;
- buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- buf.memory = V4L2_MEMORY_USERPTR;
- plane[0].length = drv_ctx.op_buf.buffer_size;
- plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
- (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
- plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
- plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
- plane[0].data_offset = 0;
- extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
- if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
- plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
- plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
-#ifdef USE_ION
- plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
-#endif
- plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
- plane[extra_idx].data_offset = 0;
- } else if (extra_idx >= VIDEO_MAX_PLANES) {
- DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
- return OMX_ErrorBadParameter;
- }
- buf.m.planes = plane;
- buf.length = drv_ctx.num_planes;
-
- if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
- DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
- /*TODO: How to handle this case */
- return OMX_ErrorInsufficientResources;
- }
-
- if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
- enum v4l2_buf_type buf_type;
- buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
- return OMX_ErrorInsufficientResources;
- } else {
- streaming[CAPTURE_PORT] = true;
- DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
- }
- }
-
- (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
- if (m_enable_android_native_buffers) {
- DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
- (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
- } else {
- (*bufferHdr)->pBuffer = buff;
- }
- (*bufferHdr)->pAppPrivate = privateAppData;
- BITMASK_SET(&m_out_bm_count,i);
- }
- return eRet;
+ (*bufferHdr)->pAppPrivate = privateAppData;
+ BITMASK_SET(&m_out_bm_count,i);
+ }
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::use_input_heap_buffers
+ FUNCTION
+ omx_vdec::use_input_heap_buffers
-DESCRIPTION
- OMX Use Buffer Heap allocation method implementation.
+ DESCRIPTION
+ OMX Use Buffer Heap allocation method implementation.
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- OMX Error None , if everything successful.
+ RETURN VALUE
+ OMX Error None , if everything successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::use_input_heap_buffers(
- OMX_IN OMX_HANDLETYPE hComp,
- OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
- OMX_IN OMX_U32 port,
- OMX_IN OMX_PTR appData,
- OMX_IN OMX_U32 bytes,
- OMX_IN OMX_U8* buffer)
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes,
+ OMX_IN OMX_U8* buffer)
{
- DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- if(!m_inp_heap_ptr)
- m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
- calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
- drv_ctx.ip_buf.actualcount);
- if(!m_phdr_pmem_ptr)
- m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
- calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
- drv_ctx.ip_buf.actualcount);
- if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
- {
- DEBUG_PRINT_ERROR("Insufficent memory");
- eRet = OMX_ErrorInsufficientResources;
- }
- else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
- {
- input_use_buffer = true;
- memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
- m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
- m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
- m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
- m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
- m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
- *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
- eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
- DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
- if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
- (unsigned)NULL, (unsigned)NULL))
- {
- DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
- return OMX_ErrorInsufficientResources;
+ DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ if (!m_inp_heap_ptr)
+ m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
+ calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
+ drv_ctx.ip_buf.actualcount);
+ if (!m_phdr_pmem_ptr)
+ m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
+ calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
+ drv_ctx.ip_buf.actualcount);
+ if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
+ DEBUG_PRINT_ERROR("Insufficent memory");
+ eRet = OMX_ErrorInsufficientResources;
+ } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
+ input_use_buffer = true;
+ memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
+ m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
+ m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
+ m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
+ m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
+ m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
+ *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
+ eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
+ DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
+ if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
+ (unsigned)NULL, (unsigned)NULL)) {
+ DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+ return OMX_ErrorInsufficientResources;
+ }
+ m_in_alloc_cnt++;
+ } else {
+ DEBUG_PRINT_ERROR("All i/p buffers have been set!");
+ eRet = OMX_ErrorInsufficientResources;
}
- m_in_alloc_cnt++;
- }
- else
- {
- DEBUG_PRINT_ERROR("All i/p buffers have been set!");
- eRet = OMX_ErrorInsufficientResources;
- }
- return eRet;
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::UseBuffer
+ FUNCTION
+ omx_vdec::UseBuffer
-DESCRIPTION
- OMX Use Buffer method implementation.
+ DESCRIPTION
+ OMX Use Buffer method implementation.
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- OMX Error None , if everything successful.
+ RETURN VALUE
+ OMX Error None , if everything successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::use_buffer(
- OMX_IN OMX_HANDLETYPE hComp,
- OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
- OMX_IN OMX_U32 port,
- OMX_IN OMX_PTR appData,
- OMX_IN OMX_U32 bytes,
- OMX_IN OMX_U8* buffer)
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes,
+ OMX_IN OMX_U8* buffer)
{
- OMX_ERRORTYPE error = OMX_ErrorNone;
- struct vdec_setbuffer_cmd setbuffers;
-
- if (bufferHdr == NULL || bytes == 0)
- {
- if(!secure_mode && buffer == NULL) {
- DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
- return OMX_ErrorBadParameter;
- }
- }
- if(m_state == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
- return OMX_ErrorInvalidState;
- }
- if(port == OMX_CORE_INPUT_PORT_INDEX)
- error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
- else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
- error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
- else
- {
- DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
- error = OMX_ErrorBadPortIndex;
- }
- DEBUG_PRINT_LOW("Use Buffer: port %lu, buffer %p, eRet %d", port, *bufferHdr, error);
- if(error == OMX_ErrorNone)
- {
- if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
- {
- // Send the callback now
- BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
- post_event(OMX_CommandStateSet,OMX_StateIdle,
- OMX_COMPONENT_GENERATE_EVENT);
+ OMX_ERRORTYPE error = OMX_ErrorNone;
+ struct vdec_setbuffer_cmd setbuffers;
+
+ if (bufferHdr == NULL || bytes == 0) {
+ if (!secure_mode && buffer == NULL) {
+ DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
+ return OMX_ErrorBadParameter;
+ }
}
- if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
- BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
- {
- BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
- post_event(OMX_CommandPortEnable,
- OMX_CORE_INPUT_PORT_INDEX,
- OMX_COMPONENT_GENERATE_EVENT);
+ if (m_state == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
+ return OMX_ErrorInvalidState;
}
- else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
- BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
- {
- BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
- post_event(OMX_CommandPortEnable,
- OMX_CORE_OUTPUT_PORT_INDEX,
- OMX_COMPONENT_GENERATE_EVENT);
+ if (port == OMX_CORE_INPUT_PORT_INDEX)
+ error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
+ else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
+ error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
+ else {
+ DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
+ error = OMX_ErrorBadPortIndex;
}
- }
- return error;
+ DEBUG_PRINT_LOW("Use Buffer: port %lu, buffer %p, eRet %d", port, *bufferHdr, error);
+ if (error == OMX_ErrorNone) {
+ if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+ // Send the callback now
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
+ post_event(OMX_CommandStateSet,OMX_StateIdle,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+ if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
+ BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+ post_event(OMX_CommandPortEnable,
+ OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
+ BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+ post_event(OMX_CommandPortEnable,
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+ }
+ return error;
}
OMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
- OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
+ OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
{
- if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
- {
- if(m_inp_heap_ptr[bufferindex].pBuffer)
- free(m_inp_heap_ptr[bufferindex].pBuffer);
- m_inp_heap_ptr[bufferindex].pBuffer = NULL;
- }
- if (pmem_bufferHdr)
- free_input_buffer(pmem_bufferHdr);
- return OMX_ErrorNone;
+ if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
+ if (m_inp_heap_ptr[bufferindex].pBuffer)
+ free(m_inp_heap_ptr[bufferindex].pBuffer);
+ m_inp_heap_ptr[bufferindex].pBuffer = NULL;
+ }
+ if (pmem_bufferHdr)
+ free_input_buffer(pmem_bufferHdr);
+ return OMX_ErrorNone;
}
OMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
{
- unsigned int index = 0;
- if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
- {
- return OMX_ErrorBadParameter;
- }
-
- index = bufferHdr - m_inp_mem_ptr;
- DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
-
- if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
- {
- DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
- if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
- {
- struct vdec_setbuffer_cmd setbuffers;
- setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
- sizeof (vdec_bufferpayload));
- if(!secure_mode) {
- DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
- drv_ctx.ptr_inputbuffer[index].pmem_fd);
- DEBUG_PRINT_LOW("\n unmap the input buffer size=%d address = %p",
- drv_ctx.ptr_inputbuffer[index].mmaped_size,
- drv_ctx.ptr_inputbuffer[index].bufferaddr);
- munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
- drv_ctx.ptr_inputbuffer[index].mmaped_size);
- }
- close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
- drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
- if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
- {
- free(m_desc_buffer_ptr[index].buf_addr);
- m_desc_buffer_ptr[index].buf_addr = NULL;
- m_desc_buffer_ptr[index].desc_data_size = 0;
- }
-#ifdef USE_ION
- free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
-#endif
+ unsigned int index = 0;
+ if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
+ return OMX_ErrorBadParameter;
}
- }
- return OMX_ErrorNone;
+ index = bufferHdr - m_inp_mem_ptr;
+ DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
+
+ if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
+ DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
+ if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) {
+ struct vdec_setbuffer_cmd setbuffers;
+ setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+ memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
+ sizeof (vdec_bufferpayload));
+ if (!secure_mode) {
+ DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
+ drv_ctx.ptr_inputbuffer[index].pmem_fd);
+ DEBUG_PRINT_LOW("\n unmap the input buffer size=%d address = %p",
+ drv_ctx.ptr_inputbuffer[index].mmaped_size,
+ drv_ctx.ptr_inputbuffer[index].bufferaddr);
+ munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
+ drv_ctx.ptr_inputbuffer[index].mmaped_size);
+ }
+ close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
+ drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
+ if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
+ free(m_desc_buffer_ptr[index].buf_addr);
+ m_desc_buffer_ptr[index].buf_addr = NULL;
+ m_desc_buffer_ptr[index].desc_data_size = 0;
+ }
+#ifdef USE_ION
+ free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
+#endif
+ }
+ }
+
+ return OMX_ErrorNone;
}
OMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
{
- unsigned int index = 0;
+ unsigned int index = 0;
- if (bufferHdr == NULL || m_out_mem_ptr == NULL)
- {
- return OMX_ErrorBadParameter;
- }
+ if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
+ return OMX_ErrorBadParameter;
+ }
- index = bufferHdr - m_out_mem_ptr;
- DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
+ index = bufferHdr - m_out_mem_ptr;
+ DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
- if (index < drv_ctx.op_buf.actualcount
- && drv_ctx.ptr_outputbuffer)
- {
- DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %p", index,
- drv_ctx.ptr_outputbuffer[index].bufferaddr);
+ if (index < drv_ctx.op_buf.actualcount
+ && drv_ctx.ptr_outputbuffer) {
+ DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %p", index,
+ drv_ctx.ptr_outputbuffer[index].bufferaddr);
- struct vdec_setbuffer_cmd setbuffers;
- setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
- sizeof (vdec_bufferpayload));
+ struct vdec_setbuffer_cmd setbuffers;
+ setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+ memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
+ sizeof (vdec_bufferpayload));
#ifdef _ANDROID_
- if(m_enable_android_native_buffers) {
+ if (m_enable_android_native_buffers) {
if (!secure_mode) {
- if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
- munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
- drv_ctx.ptr_outputbuffer[index].mmaped_size);
+ if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
+ munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
+ drv_ctx.ptr_outputbuffer[index].mmaped_size);
+ }
}
- }
- drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
- } else {
+ drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
+ } else {
#endif
- if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
- {
- if (!secure_mode) {
- DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
- drv_ctx.ptr_outputbuffer[0].pmem_fd);
- DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d address = %p",
- drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
- drv_ctx.ptr_outputbuffer[0].bufferaddr);
- munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
- drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
- }
- close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
- drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
+ if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
+ if (!secure_mode) {
+ DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
+ drv_ctx.ptr_outputbuffer[0].pmem_fd);
+ DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d address = %p",
+ drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
+ drv_ctx.ptr_outputbuffer[0].bufferaddr);
+ munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
+ drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
+ }
+ close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
+ drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
#ifdef USE_ION
- free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
+ free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
#endif
- }
+ }
#ifdef _ANDROID_
- }
+ }
#endif
- if (release_output_done()) {
- free_extradata();
+ if (release_output_done()) {
+ free_extradata();
+ }
}
- }
- return OMX_ErrorNone;
+ return OMX_ErrorNone;
}
OMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp,
- OMX_BUFFERHEADERTYPE **bufferHdr,
- OMX_U32 port,
- OMX_PTR appData,
- OMX_U32 bytes)
+ OMX_BUFFERHEADERTYPE **bufferHdr,
+ OMX_U32 port,
+ OMX_PTR appData,
+ OMX_U32 bytes)
{
- OMX_BUFFERHEADERTYPE *input = NULL;
- unsigned char *buf_addr = NULL;
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- unsigned i = 0;
+ OMX_BUFFERHEADERTYPE *input = NULL;
+ unsigned char *buf_addr = NULL;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ unsigned i = 0;
- /* Sanity Check*/
- if (bufferHdr == NULL)
- {
- return OMX_ErrorBadParameter;
- }
-
- if (m_inp_heap_ptr == NULL)
- {
- m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
- calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
- drv_ctx.ip_buf.actualcount);
- m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
- calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
- drv_ctx.ip_buf.actualcount);
-
- if (m_inp_heap_ptr == NULL)
- {
- DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
- return OMX_ErrorInsufficientResources;
- }
- }
-
- /*Find a Free index*/
- for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
- {
- if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
- {
- DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
- break;
- }
- }
-
- if (i < drv_ctx.ip_buf.actualcount)
- {
- buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
-
- if (buf_addr == NULL)
- {
- return OMX_ErrorInsufficientResources;
+ /* Sanity Check*/
+ if (bufferHdr == NULL) {
+ return OMX_ErrorBadParameter;
}
- *bufferHdr = (m_inp_heap_ptr + i);
- input = *bufferHdr;
- BITMASK_SET(&m_heap_inp_bm_count,i);
+ if (m_inp_heap_ptr == NULL) {
+ m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
+ calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
+ drv_ctx.ip_buf.actualcount);
+ m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
+ calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
+ drv_ctx.ip_buf.actualcount);
- input->pBuffer = (OMX_U8 *)buf_addr;
- input->nSize = sizeof(OMX_BUFFERHEADERTYPE);
- input->nVersion.nVersion = OMX_SPEC_VERSION;
- input->nAllocLen = drv_ctx.ip_buf.buffer_size;
- input->pAppPrivate = appData;
- input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
- DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
- eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
- DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
- /*Add the Buffers to freeq*/
- if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
- (unsigned)NULL, (unsigned)NULL))
- {
- DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
- return OMX_ErrorInsufficientResources;
+ if (m_inp_heap_ptr == NULL) {
+ DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
}
- }
- else
- {
- return OMX_ErrorBadParameter;
- }
- return eRet;
+ /*Find a Free index*/
+ for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
+ if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
+ DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
+ break;
+ }
+ }
+
+ if (i < drv_ctx.ip_buf.actualcount) {
+ buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
+
+ if (buf_addr == NULL) {
+ return OMX_ErrorInsufficientResources;
+ }
+
+ *bufferHdr = (m_inp_heap_ptr + i);
+ input = *bufferHdr;
+ BITMASK_SET(&m_heap_inp_bm_count,i);
+
+ input->pBuffer = (OMX_U8 *)buf_addr;
+ input->nSize = sizeof(OMX_BUFFERHEADERTYPE);
+ input->nVersion.nVersion = OMX_SPEC_VERSION;
+ input->nAllocLen = drv_ctx.ip_buf.buffer_size;
+ input->pAppPrivate = appData;
+ input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
+ DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
+ eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
+ DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
+ /*Add the Buffers to freeq*/
+ if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
+ (unsigned)NULL, (unsigned)NULL)) {
+ DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+ return OMX_ErrorInsufficientResources;
+ }
+ } else {
+ return OMX_ErrorBadParameter;
+ }
+
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::AllocateInputBuffer
+ FUNCTION
+ omx_vdec::AllocateInputBuffer
-DESCRIPTION
- Helper function for allocate buffer in the input pin
+ DESCRIPTION
+ Helper function for allocate buffer in the input pin
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::allocate_input_buffer(
- OMX_IN OMX_HANDLETYPE hComp,
- OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
- OMX_IN OMX_U32 port,
- OMX_IN OMX_PTR appData,
- OMX_IN OMX_U32 bytes)
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- struct vdec_setbuffer_cmd setbuffers;
- OMX_BUFFERHEADERTYPE *input = NULL;
- unsigned i = 0;
- unsigned char *buf_addr = NULL;
- int pmem_fd = -1;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ struct vdec_setbuffer_cmd setbuffers;
+ OMX_BUFFERHEADERTYPE *input = NULL;
+ unsigned i = 0;
+ unsigned char *buf_addr = NULL;
+ int pmem_fd = -1;
- if(bytes != drv_ctx.ip_buf.buffer_size)
- {
- DEBUG_PRINT_LOW("\n Requested Size is wrong %lu epected is %d",
- bytes, drv_ctx.ip_buf.buffer_size);
- return OMX_ErrorBadParameter;
- }
-
- if(!m_inp_mem_ptr)
- {
- DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
- drv_ctx.ip_buf.actualcount,
- drv_ctx.ip_buf.buffer_size);
-
- m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
- calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
-
- if (m_inp_mem_ptr == NULL)
- {
- return OMX_ErrorInsufficientResources;
+ if (bytes != drv_ctx.ip_buf.buffer_size) {
+ DEBUG_PRINT_LOW("\n Requested Size is wrong %lu epected is %d",
+ bytes, drv_ctx.ip_buf.buffer_size);
+ return OMX_ErrorBadParameter;
}
- drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
- calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
+ if (!m_inp_mem_ptr) {
+ DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
+ drv_ctx.ip_buf.actualcount,
+ drv_ctx.ip_buf.buffer_size);
- if (drv_ctx.ptr_inputbuffer == NULL)
- {
- return OMX_ErrorInsufficientResources;
- }
+ m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
+ calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
+
+ if (m_inp_mem_ptr == NULL) {
+ return OMX_ErrorInsufficientResources;
+ }
+
+ drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
+ calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
+
+ if (drv_ctx.ptr_inputbuffer == NULL) {
+ return OMX_ErrorInsufficientResources;
+ }
#ifdef USE_ION
- drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
- calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
+ drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
+ calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
- if (drv_ctx.ip_buf_ion_info == NULL)
- {
- return OMX_ErrorInsufficientResources;
- }
+ if (drv_ctx.ip_buf_ion_info == NULL) {
+ return OMX_ErrorInsufficientResources;
+ }
#endif
- for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
- {
- drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
+ for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
+ drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
#ifdef USE_ION
- drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
+ drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
#endif
- }
- }
-
- for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
- {
- if(BITMASK_ABSENT(&m_inp_bm_count,i))
- {
- DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
- break;
- }
- }
-
- if(i < drv_ctx.ip_buf.actualcount)
- {
- struct v4l2_buffer buf;
- struct v4l2_plane plane;
- int rc;
- DEBUG_PRINT_LOW("\n Allocate input Buffer");
-#ifdef USE_ION
- drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
- drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
- &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
- &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
- if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
- return OMX_ErrorInsufficientResources;
- }
- pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
-#else
- pmem_fd = open (MEM_DEVICE,O_RDWR);
-
- if (pmem_fd < 0)
- {
- DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
- return OMX_ErrorInsufficientResources;
- }
-
- if (pmem_fd == 0)
- {
- pmem_fd = open (MEM_DEVICE,O_RDWR);
-
- if (pmem_fd < 0)
- {
- DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
- return OMX_ErrorInsufficientResources;
- }
- }
-
- if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
- drv_ctx.ip_buf.alignment))
- {
- DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
- close(pmem_fd);
- return OMX_ErrorInsufficientResources;
- }
-#endif
- if (!secure_mode) {
- buf_addr = (unsigned char *)mmap(NULL,
- drv_ctx.ip_buf.buffer_size,
- PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
-
- if (buf_addr == MAP_FAILED)
- {
- close(pmem_fd);
-#ifdef USE_ION
- free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
-#endif
- DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
- return OMX_ErrorInsufficientResources;
}
}
- *bufferHdr = (m_inp_mem_ptr + i);
- if (secure_mode)
- drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
- else
- drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
- drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
- drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
- drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
- drv_ctx.ptr_inputbuffer [i].offset = 0;
-
- buf.index = i;
- buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- buf.memory = V4L2_MEMORY_USERPTR;
- plane.bytesused = 0;
- plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
- plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
- plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
- plane.reserved[1] = 0;
- plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
- buf.m.planes = &plane;
- buf.length = 1;
-
- DEBUG_PRINT_LOW("\n Set the input Buffer Idx: %d Addr: %p", i,
- drv_ctx.ptr_inputbuffer[i].bufferaddr);
-
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
-
- if (rc) {
- DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
- /*TODO: How to handle this case */
- return OMX_ErrorInsufficientResources;
- }
-
- input = *bufferHdr;
- BITMASK_SET(&m_inp_bm_count,i);
- DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
- if (secure_mode)
- input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
- else
- input->pBuffer = (OMX_U8 *)buf_addr;
- input->nSize = sizeof(OMX_BUFFERHEADERTYPE);
- input->nVersion.nVersion = OMX_SPEC_VERSION;
- input->nAllocLen = drv_ctx.ip_buf.buffer_size;
- input->pAppPrivate = appData;
- input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
- input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
-
- if (drv_ctx.disable_dmx)
- {
- eRet = allocate_desc_buffer(i);
+ for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
+ if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+ DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
+ break;
+ }
}
- }
- else
- {
- DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
- eRet = OMX_ErrorInsufficientResources;
- }
- return eRet;
+
+ if (i < drv_ctx.ip_buf.actualcount) {
+ struct v4l2_buffer buf;
+ struct v4l2_plane plane;
+ int rc;
+ DEBUG_PRINT_LOW("\n Allocate input Buffer");
+#ifdef USE_ION
+ drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
+ drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
+ &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
+ &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
+ if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
+ return OMX_ErrorInsufficientResources;
+ }
+ pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
+#else
+ pmem_fd = open (MEM_DEVICE,O_RDWR);
+
+ if (pmem_fd < 0) {
+ DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
+ return OMX_ErrorInsufficientResources;
+ }
+
+ if (pmem_fd == 0) {
+ pmem_fd = open (MEM_DEVICE,O_RDWR);
+
+ if (pmem_fd < 0) {
+ DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+
+ if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
+ drv_ctx.ip_buf.alignment)) {
+ DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+ close(pmem_fd);
+ return OMX_ErrorInsufficientResources;
+ }
+#endif
+ if (!secure_mode) {
+ buf_addr = (unsigned char *)mmap(NULL,
+ drv_ctx.ip_buf.buffer_size,
+ PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
+
+ if (buf_addr == MAP_FAILED) {
+ close(pmem_fd);
+#ifdef USE_ION
+ free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
+#endif
+ DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+ *bufferHdr = (m_inp_mem_ptr + i);
+ if (secure_mode)
+ drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
+ else
+ drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
+ drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
+ drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
+ drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
+ drv_ctx.ptr_inputbuffer [i].offset = 0;
+
+
+ buf.index = i;
+ buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane.bytesused = 0;
+ plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
+ plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
+ plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
+ plane.reserved[1] = 0;
+ plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
+ buf.m.planes = &plane;
+ buf.length = 1;
+
+ DEBUG_PRINT_LOW("\n Set the input Buffer Idx: %d Addr: %p", i,
+ drv_ctx.ptr_inputbuffer[i].bufferaddr);
+
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
+
+ if (rc) {
+ DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
+ /*TODO: How to handle this case */
+ return OMX_ErrorInsufficientResources;
+ }
+
+ input = *bufferHdr;
+ BITMASK_SET(&m_inp_bm_count,i);
+ DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
+ if (secure_mode)
+ input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
+ else
+ input->pBuffer = (OMX_U8 *)buf_addr;
+ input->nSize = sizeof(OMX_BUFFERHEADERTYPE);
+ input->nVersion.nVersion = OMX_SPEC_VERSION;
+ input->nAllocLen = drv_ctx.ip_buf.buffer_size;
+ input->pAppPrivate = appData;
+ input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
+ input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
+
+ if (drv_ctx.disable_dmx) {
+ eRet = allocate_desc_buffer(i);
+ }
+ } else {
+ DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::AllocateOutputBuffer
+ FUNCTION
+ omx_vdec::AllocateOutputBuffer
-DESCRIPTION
- Helper fn for AllocateBuffer in the output pin
+ DESCRIPTION
+ Helper fn for AllocateBuffer in the output pin
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- OMX Error None if everything went well.
+ RETURN VALUE
+ OMX Error None if everything went well.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::allocate_output_buffer(
- OMX_IN OMX_HANDLETYPE hComp,
- OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
- OMX_IN OMX_U32 port,
- OMX_IN OMX_PTR appData,
- OMX_IN OMX_U32 bytes)
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
- unsigned i= 0; // Temporary counter
- struct vdec_setbuffer_cmd setbuffers;
- int extra_idx = 0;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
+ unsigned i= 0; // Temporary counter
+ struct vdec_setbuffer_cmd setbuffers;
+ int extra_idx = 0;
#ifdef USE_ION
- int ion_device_fd =-1;
- struct ion_allocation_data ion_alloc_data;
- struct ion_fd_data fd_ion_data;
+ int ion_device_fd =-1;
+ struct ion_allocation_data ion_alloc_data;
+ struct ion_fd_data fd_ion_data;
#endif
- if(!m_out_mem_ptr)
- {
- DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
- drv_ctx.op_buf.actualcount,
- drv_ctx.op_buf.buffer_size);
- int nBufHdrSize = 0;
- int nPlatformEntrySize = 0;
- int nPlatformListSize = 0;
- int nPMEMInfoSize = 0;
- int pmem_fd = -1;
- unsigned char *pmem_baseaddress = NULL;
+ if (!m_out_mem_ptr) {
+ DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
+ drv_ctx.op_buf.actualcount,
+ drv_ctx.op_buf.buffer_size);
+ int nBufHdrSize = 0;
+ int nPlatformEntrySize = 0;
+ int nPlatformListSize = 0;
+ int nPMEMInfoSize = 0;
+ int pmem_fd = -1;
+ unsigned char *pmem_baseaddress = NULL;
- OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList;
- OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry;
- OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
+ OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList;
+ OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry;
+ OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
- DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
- drv_ctx.op_buf.actualcount);
- nBufHdrSize = drv_ctx.op_buf.actualcount *
- sizeof(OMX_BUFFERHEADERTYPE);
+ DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
+ drv_ctx.op_buf.actualcount);
+ nBufHdrSize = drv_ctx.op_buf.actualcount *
+ sizeof(OMX_BUFFERHEADERTYPE);
- nPMEMInfoSize = drv_ctx.op_buf.actualcount *
- sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
- nPlatformListSize = drv_ctx.op_buf.actualcount *
- sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
- nPlatformEntrySize = drv_ctx.op_buf.actualcount *
- sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
+ nPMEMInfoSize = drv_ctx.op_buf.actualcount *
+ sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
+ nPlatformListSize = drv_ctx.op_buf.actualcount *
+ sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
+ nPlatformEntrySize = drv_ctx.op_buf.actualcount *
+ sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
- DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
- sizeof(OMX_BUFFERHEADERTYPE),
- nPMEMInfoSize,
- nPlatformListSize);
- DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
- drv_ctx.op_buf.actualcount);
+ DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
+ sizeof(OMX_BUFFERHEADERTYPE),
+ nPMEMInfoSize,
+ nPlatformListSize);
+ DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
+ drv_ctx.op_buf.actualcount);
#ifdef USE_ION
- ion_device_fd = alloc_map_ion_memory(
- drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
- drv_ctx.op_buf.alignment,
- &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
- if (ion_device_fd < 0) {
- return OMX_ErrorInsufficientResources;
- }
- pmem_fd = fd_ion_data.fd;
+ ion_device_fd = alloc_map_ion_memory(
+ drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
+ drv_ctx.op_buf.alignment,
+ &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
+ if (ion_device_fd < 0) {
+ return OMX_ErrorInsufficientResources;
+ }
+ pmem_fd = fd_ion_data.fd;
#else
- pmem_fd = open (MEM_DEVICE,O_RDWR);
+ pmem_fd = open (MEM_DEVICE,O_RDWR);
- if (pmem_fd < 0)
- {
- DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
- drv_ctx.op_buf.buffer_size);
- return OMX_ErrorInsufficientResources;
- }
+ if (pmem_fd < 0) {
+ DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
+ drv_ctx.op_buf.buffer_size);
+ return OMX_ErrorInsufficientResources;
+ }
- if(pmem_fd == 0)
- {
- pmem_fd = open (MEM_DEVICE,O_RDWR);
+ if (pmem_fd == 0) {
+ pmem_fd = open (MEM_DEVICE,O_RDWR);
- if (pmem_fd < 0)
- {
- DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
- drv_ctx.op_buf.buffer_size);
- return OMX_ErrorInsufficientResources;
- }
- }
+ if (pmem_fd < 0) {
+ DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
+ drv_ctx.op_buf.buffer_size);
+ return OMX_ErrorInsufficientResources;
+ }
+ }
- if(!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
- drv_ctx.op_buf.actualcount,
- drv_ctx.op_buf.alignment))
- {
- DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
- close(pmem_fd);
- return OMX_ErrorInsufficientResources;
- }
+ if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
+ drv_ctx.op_buf.actualcount,
+ drv_ctx.op_buf.alignment)) {
+ DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
+ close(pmem_fd);
+ return OMX_ErrorInsufficientResources;
+ }
#endif
- if (!secure_mode) {
- pmem_baseaddress = (unsigned char *)mmap(NULL,
- (drv_ctx.op_buf.buffer_size *
- drv_ctx.op_buf.actualcount),
- PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
- if (pmem_baseaddress == MAP_FAILED)
- {
- DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
- drv_ctx.op_buf.buffer_size);
- close(pmem_fd);
+ if (!secure_mode) {
+ pmem_baseaddress = (unsigned char *)mmap(NULL,
+ (drv_ctx.op_buf.buffer_size *
+ drv_ctx.op_buf.actualcount),
+ PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
+ if (pmem_baseaddress == MAP_FAILED) {
+ DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
+ drv_ctx.op_buf.buffer_size);
+ close(pmem_fd);
#ifdef USE_ION
- free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
+ free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
#endif
- return OMX_ErrorInsufficientResources;
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+ m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1);
+ // Alloc mem for platform specific info
+ char *pPtr=NULL;
+ pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
+ nPMEMInfoSize,1);
+ drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
+ calloc (sizeof(struct vdec_bufferpayload),
+ drv_ctx.op_buf.actualcount);
+ drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\
+ calloc (sizeof (struct vdec_output_frameinfo),
+ drv_ctx.op_buf.actualcount);
+#ifdef USE_ION
+ drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
+ calloc (sizeof(struct vdec_ion),
+ drv_ctx.op_buf.actualcount);
+#endif
+
+ if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
+ && drv_ctx.ptr_respbuffer) {
+ drv_ctx.ptr_outputbuffer[0].mmaped_size =
+ (drv_ctx.op_buf.buffer_size *
+ drv_ctx.op_buf.actualcount);
+ bufHdr = m_out_mem_ptr;
+ m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
+ m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
+ (((char *) m_platform_list) + nPlatformListSize);
+ m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+ (((char *) m_platform_entry) + nPlatformEntrySize);
+ pPlatformList = m_platform_list;
+ pPlatformEntry = m_platform_entry;
+ pPMEMInfo = m_pmem_info;
+
+ DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
+
+ // Settting the entire storage nicely
+ DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
+ DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
+ for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
+ bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
+ bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
+ // Set the values when we determine the right HxW param
+ bufHdr->nAllocLen = bytes;
+ bufHdr->nFilledLen = 0;
+ bufHdr->pAppPrivate = appData;
+ bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ // Platform specific PMEM Information
+ // Initialize the Platform Entry
+ //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
+ pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+ pPlatformEntry->entry = pPMEMInfo;
+ // Initialize the Platform List
+ pPlatformList->nEntries = 1;
+ pPlatformList->entryList = pPlatformEntry;
+ // Keep pBuffer NULL till vdec is opened
+ bufHdr->pBuffer = NULL;
+ bufHdr->nOffset = 0;
+
+ pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i;
+ pPMEMInfo->pmem_fd = 0;
+ bufHdr->pPlatformPrivate = pPlatformList;
+
+ drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
+ m_pmem_info[i].pmem_fd = pmem_fd;
+#ifdef USE_ION
+ drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
+ drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
+ drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
+#endif
+
+ /*Create a mapping between buffers*/
+ bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
+ drv_ctx.ptr_respbuffer[i].client_data = (void *)\
+ &drv_ctx.ptr_outputbuffer[i];
+ drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
+ drv_ctx.ptr_outputbuffer[i].bufferaddr =
+ pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
+
+ DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",
+ pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
+ drv_ctx.ptr_outputbuffer[i].bufferaddr);
+ // Move the buffer and buffer header pointers
+ bufHdr++;
+ pPMEMInfo++;
+ pPlatformEntry++;
+ pPlatformList++;
+ }
+ } else {
+ DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
+ m_out_mem_ptr, pPtr);
+ if (m_out_mem_ptr) {
+ free(m_out_mem_ptr);
+ m_out_mem_ptr = NULL;
+ }
+ if (pPtr) {
+ free(pPtr);
+ pPtr = NULL;
+ }
+ if (drv_ctx.ptr_outputbuffer) {
+ free(drv_ctx.ptr_outputbuffer);
+ drv_ctx.ptr_outputbuffer = NULL;
+ }
+ if (drv_ctx.ptr_respbuffer) {
+ free(drv_ctx.ptr_respbuffer);
+ drv_ctx.ptr_respbuffer = NULL;
+ }
+#ifdef USE_ION
+ if (drv_ctx.op_buf_ion_info) {
+ DEBUG_PRINT_LOW("\n Free o/p ion context");
+ free(drv_ctx.op_buf_ion_info);
+ drv_ctx.op_buf_ion_info = NULL;
+ }
+#endif
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ if (eRet == OMX_ErrorNone)
+ eRet = allocate_extradata();
+ }
+
+ for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
+ if (BITMASK_ABSENT(&m_out_bm_count,i)) {
+ DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
+ break;
}
}
- m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1);
- // Alloc mem for platform specific info
- char *pPtr=NULL;
- pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
- nPMEMInfoSize,1);
- drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
- calloc (sizeof(struct vdec_bufferpayload),
- drv_ctx.op_buf.actualcount);
- drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\
- calloc (sizeof (struct vdec_output_frameinfo),
- drv_ctx.op_buf.actualcount);
+
+ if (eRet == OMX_ErrorNone) {
+ if (i < drv_ctx.op_buf.actualcount) {
+ struct v4l2_buffer buf;
+ struct v4l2_plane plane[VIDEO_MAX_PLANES];
+ int rc;
+ m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
+
+ drv_ctx.ptr_outputbuffer[i].buffer_len =
+ drv_ctx.op_buf.buffer_size;
+
+ *bufferHdr = (m_out_mem_ptr + i );
+ if (secure_mode) {
+ drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
+ }
+ drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
+
+ buf.index = i;
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane[0].length = drv_ctx.op_buf.buffer_size;
+ plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
+ (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
#ifdef USE_ION
- drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
- calloc (sizeof(struct vdec_ion),
- drv_ctx.op_buf.actualcount);
+ plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
#endif
-
- if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
- && drv_ctx.ptr_respbuffer)
- {
- drv_ctx.ptr_outputbuffer[0].mmaped_size =
- (drv_ctx.op_buf.buffer_size *
- drv_ctx.op_buf.actualcount);
- bufHdr = m_out_mem_ptr;
- m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
- m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
- (((char *) m_platform_list) + nPlatformListSize);
- m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
- (((char *) m_platform_entry) + nPlatformEntrySize);
- pPlatformList = m_platform_list;
- pPlatformEntry = m_platform_entry;
- pPMEMInfo = m_pmem_info;
-
- DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
-
- // Settting the entire storage nicely
- DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
- DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
- for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
- {
- bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
- bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
- // Set the values when we determine the right HxW param
- bufHdr->nAllocLen = bytes;
- bufHdr->nFilledLen = 0;
- bufHdr->pAppPrivate = appData;
- bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
- // Platform specific PMEM Information
- // Initialize the Platform Entry
- //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
- pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
- pPlatformEntry->entry = pPMEMInfo;
- // Initialize the Platform List
- pPlatformList->nEntries = 1;
- pPlatformList->entryList = pPlatformEntry;
- // Keep pBuffer NULL till vdec is opened
- bufHdr->pBuffer = NULL;
- bufHdr->nOffset = 0;
-
- pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i;
- pPMEMInfo->pmem_fd = 0;
- bufHdr->pPlatformPrivate = pPlatformList;
-
- drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
- m_pmem_info[i].pmem_fd = pmem_fd;
+ plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
+ plane[0].data_offset = 0;
+ extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+ if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+ plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
+ plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
#ifdef USE_ION
- drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
- drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
- drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
+ plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
#endif
+ plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
+ plane[extra_idx].data_offset = 0;
+ } else if (extra_idx >= VIDEO_MAX_PLANES) {
+ DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d\n", extra_idx);
+ return OMX_ErrorBadParameter;
+ }
+ buf.m.planes = plane;
+ buf.length = drv_ctx.num_planes;
+ DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
+ if (rc) {
+ /*TODO: How to handle this case */
+ return OMX_ErrorInsufficientResources;
+ }
- /*Create a mapping between buffers*/
- bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
- drv_ctx.ptr_respbuffer[i].client_data = (void *)\
- &drv_ctx.ptr_outputbuffer[i];
- drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
- drv_ctx.ptr_outputbuffer[i].bufferaddr =
- pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
+ if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
+ enum v4l2_buf_type buf_type;
+ buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
+ if (rc) {
+ return OMX_ErrorInsufficientResources;
+ } else {
+ streaming[CAPTURE_PORT] = true;
+ DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
+ }
+ }
- DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",
- pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
- drv_ctx.ptr_outputbuffer[i].bufferaddr);
- // Move the buffer and buffer header pointers
- bufHdr++;
- pPMEMInfo++;
- pPlatformEntry++;
- pPlatformList++;
- }
+ (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
+ (*bufferHdr)->pAppPrivate = appData;
+ BITMASK_SET(&m_out_bm_count,i);
+ } else {
+ DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
+ eRet = OMX_ErrorInsufficientResources;
+ }
}
- else
- {
- DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
- m_out_mem_ptr, pPtr);
- if(m_out_mem_ptr)
- {
- free(m_out_mem_ptr);
- m_out_mem_ptr = NULL;
- }
- if(pPtr)
- {
- free(pPtr);
- pPtr = NULL;
- }
- if(drv_ctx.ptr_outputbuffer)
- {
- free(drv_ctx.ptr_outputbuffer);
- drv_ctx.ptr_outputbuffer = NULL;
- }
- if(drv_ctx.ptr_respbuffer)
- {
- free(drv_ctx.ptr_respbuffer);
- drv_ctx.ptr_respbuffer = NULL;
- }
-#ifdef USE_ION
- if (drv_ctx.op_buf_ion_info) {
- DEBUG_PRINT_LOW("\n Free o/p ion context");
- free(drv_ctx.op_buf_ion_info);
- drv_ctx.op_buf_ion_info = NULL;
- }
-#endif
- eRet = OMX_ErrorInsufficientResources;
- }
- if (eRet == OMX_ErrorNone)
- eRet = allocate_extradata();
- }
- for(i=0; i< drv_ctx.op_buf.actualcount; i++)
- {
- if(BITMASK_ABSENT(&m_out_bm_count,i))
- {
- DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
- break;
- }
- }
-
- if (eRet == OMX_ErrorNone)
- {
- if(i < drv_ctx.op_buf.actualcount)
- {
- struct v4l2_buffer buf;
- struct v4l2_plane plane[VIDEO_MAX_PLANES];
- int rc;
- m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
-
- drv_ctx.ptr_outputbuffer[i].buffer_len =
- drv_ctx.op_buf.buffer_size;
-
- *bufferHdr = (m_out_mem_ptr + i );
- if (secure_mode) {
- drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
- }
- drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
-
- buf.index = i;
- buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- buf.memory = V4L2_MEMORY_USERPTR;
- plane[0].length = drv_ctx.op_buf.buffer_size;
- plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
- (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
-#ifdef USE_ION
- plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
-#endif
- plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
- plane[0].data_offset = 0;
- extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
- if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
- plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
- plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
-#ifdef USE_ION
- plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
-#endif
- plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
- plane[extra_idx].data_offset = 0;
- } else if (extra_idx >= VIDEO_MAX_PLANES) {
- DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d\n", extra_idx);
- return OMX_ErrorBadParameter;
- }
- buf.m.planes = plane;
- buf.length = drv_ctx.num_planes;
- DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
- if (rc) {
- /*TODO: How to handle this case */
- return OMX_ErrorInsufficientResources;
- }
-
- if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
- enum v4l2_buf_type buf_type;
- buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
- if (rc) {
- return OMX_ErrorInsufficientResources;
- } else {
- streaming[CAPTURE_PORT] = true;
- DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
- }
- }
-
- (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
- (*bufferHdr)->pAppPrivate = appData;
- BITMASK_SET(&m_out_bm_count,i);
- }
- else
- {
- DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
- eRet = OMX_ErrorInsufficientResources;
- }
- }
-
- return eRet;
+ return eRet;
}
// AllocateBuffer -- API Call
/* ======================================================================
-FUNCTION
- omx_vdec::AllocateBuffer
+ FUNCTION
+ omx_vdec::AllocateBuffer
-DESCRIPTION
- Returns zero if all the buffers released..
+ DESCRIPTION
+ Returns zero if all the buffers released..
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp,
- OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
- OMX_IN OMX_U32 port,
- OMX_IN OMX_PTR appData,
- OMX_IN OMX_U32 bytes)
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes)
{
unsigned i = 0;
OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
- if(m_state == OMX_StateInvalid)
- {
+ if (m_state == OMX_StateInvalid) {
DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
return OMX_ErrorInvalidState;
}
- if(port == OMX_CORE_INPUT_PORT_INDEX)
- {
- if (arbitrary_bytes)
- {
- eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
- }
- else
- {
- eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
- }
- }
- else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
- {
+ if (port == OMX_CORE_INPUT_PORT_INDEX) {
+ if (arbitrary_bytes) {
+ eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
+ } else {
+ eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
+ }
+ } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
appData,bytes);
- }
- else
- {
- DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
- eRet = OMX_ErrorBadPortIndex;
+ } else {
+ DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
+ eRet = OMX_ErrorBadPortIndex;
}
DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
- if(eRet == OMX_ErrorNone)
- {
- if(allocate_done()){
- if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
- {
+ if (eRet == OMX_ErrorNone) {
+ if (allocate_done()) {
+ if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
// Send the callback now
BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
post_event(OMX_CommandStateSet,OMX_StateIdle,
- OMX_COMPONENT_GENERATE_EVENT);
+ OMX_COMPONENT_GENERATE_EVENT);
}
}
- if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
- {
- if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
- {
- BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
- post_event(OMX_CommandPortEnable,
+ if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
+ if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+ post_event(OMX_CommandPortEnable,
OMX_CORE_INPUT_PORT_INDEX,
OMX_COMPONENT_GENERATE_EVENT);
- }
+ }
}
- if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
- {
- if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
- {
- BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+ if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
+ if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
post_event(OMX_CommandPortEnable,
- OMX_CORE_OUTPUT_PORT_INDEX,
- OMX_COMPONENT_GENERATE_EVENT);
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
}
}
}
@@ -5510,172 +4902,140 @@
// Free Buffer - API call
/* ======================================================================
-FUNCTION
- omx_vdec::FreeBuffer
+ FUNCTION
+ omx_vdec::FreeBuffer
-DESCRIPTION
+ DESCRIPTION
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_U32 port,
- OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
{
OMX_ERRORTYPE eRet = OMX_ErrorNone;
unsigned int nPortIndex;
DEBUG_PRINT_LOW("In for decoder free_buffer \n");
- if(m_state == OMX_StateIdle &&
- (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
- {
+ if (m_state == OMX_StateIdle &&
+ (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
- }
- else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
- (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
- {
+ } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
+ (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
DEBUG_PRINT_LOW("Free Buffer while port %lu disabled\n", port);
- }
- else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
- BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
- (port == OMX_CORE_OUTPUT_PORT_INDEX &&
- BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING)))
- {
+ } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
+ BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
+ (port == OMX_CORE_OUTPUT_PORT_INDEX &&
+ BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
DEBUG_PRINT_LOW("Free Buffer while port %d enable pending\n", port);
- }
- else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
- {
+ } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
post_event(OMX_EventError,
- OMX_ErrorPortUnpopulated,
- OMX_COMPONENT_GENERATE_EVENT);
+ OMX_ErrorPortUnpopulated,
+ OMX_COMPONENT_GENERATE_EVENT);
return OMX_ErrorIncorrectStateOperation;
- }
- else if (m_state != OMX_StateInvalid)
- {
+ } else if (m_state != OMX_StateInvalid) {
DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
post_event(OMX_EventError,
- OMX_ErrorPortUnpopulated,
- OMX_COMPONENT_GENERATE_EVENT);
+ OMX_ErrorPortUnpopulated,
+ OMX_COMPONENT_GENERATE_EVENT);
}
- if(port == OMX_CORE_INPUT_PORT_INDEX)
- {
- /*Check if arbitrary bytes*/
- if(!arbitrary_bytes && !input_use_buffer)
- nPortIndex = buffer - m_inp_mem_ptr;
- else
- nPortIndex = buffer - m_inp_heap_ptr;
+ if (port == OMX_CORE_INPUT_PORT_INDEX) {
+ /*Check if arbitrary bytes*/
+ if (!arbitrary_bytes && !input_use_buffer)
+ nPortIndex = buffer - m_inp_mem_ptr;
+ else
+ nPortIndex = buffer - m_inp_heap_ptr;
DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
- if(nPortIndex < drv_ctx.ip_buf.actualcount)
- {
- // Clear the bit associated with it.
- BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
- BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
- if (input_use_buffer == true)
- {
+ if (nPortIndex < drv_ctx.ip_buf.actualcount) {
+ // Clear the bit associated with it.
+ BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
+ BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
+ if (input_use_buffer == true) {
- DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
- if(m_phdr_pmem_ptr)
- free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
- }
- else
- {
- if (arbitrary_bytes)
- {
- if(m_phdr_pmem_ptr)
- free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
- else
- free_input_buffer(nPortIndex,NULL);
+ DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
+ if (m_phdr_pmem_ptr)
+ free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
+ } else {
+ if (arbitrary_bytes) {
+ if (m_phdr_pmem_ptr)
+ free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
+ else
+ free_input_buffer(nPortIndex,NULL);
+ } else
+ free_input_buffer(buffer);
}
- else
- free_input_buffer(buffer);
- }
- m_inp_bPopulated = OMX_FALSE;
- /*Free the Buffer Header*/
- if (release_input_done())
- {
- DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
- free_input_buffer_header();
- }
- }
- else
- {
+ m_inp_bPopulated = OMX_FALSE;
+ /*Free the Buffer Header*/
+ if (release_input_done()) {
+ DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
+ free_input_buffer_header();
+ }
+ } else {
DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
eRet = OMX_ErrorBadPortIndex;
}
- if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
- && release_input_done())
- {
+ if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
+ && release_input_done()) {
DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
post_event(OMX_CommandPortDisable,
- OMX_CORE_INPUT_PORT_INDEX,
- OMX_COMPONENT_GENERATE_EVENT);
+ OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
}
- }
- else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
- {
+ } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
// check if the buffer is valid
nPortIndex = buffer - client_buffers.get_il_buf_hdr();
- if(nPortIndex < drv_ctx.op_buf.actualcount)
- {
+ if (nPortIndex < drv_ctx.op_buf.actualcount) {
DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex);
// Clear the bit associated with it.
BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
m_out_bPopulated = OMX_FALSE;
client_buffers.free_output_buffer (buffer);
- if (release_output_done())
- {
- free_output_buffer_header();
+ if (release_output_done()) {
+ free_output_buffer_header();
}
- }
- else
- {
+ } else {
DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
eRet = OMX_ErrorBadPortIndex;
}
- if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
- && release_output_done())
- {
+ if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
+ && release_output_done()) {
DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
- DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
- BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+ DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
#ifdef _ANDROID_ICS_
- if (m_enable_android_native_buffers)
- {
- DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
- memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
- }
+ if (m_enable_android_native_buffers) {
+ DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
+ memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+ }
#endif
- post_event(OMX_CommandPortDisable,
- OMX_CORE_OUTPUT_PORT_INDEX,
- OMX_COMPONENT_GENERATE_EVENT);
+ post_event(OMX_CommandPortDisable,
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
}
- }
- else
- {
+ } else {
eRet = OMX_ErrorBadPortIndex;
}
- if((eRet == OMX_ErrorNone) &&
- (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
- {
- if(release_done())
- {
+ if ((eRet == OMX_ErrorNone) &&
+ (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
+ if (release_done()) {
// Send the callback now
BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
post_event(OMX_CommandStateSet, OMX_StateLoaded,
- OMX_COMPONENT_GENERATE_EVENT);
+ OMX_COMPONENT_GENERATE_EVENT);
}
}
return eRet;
@@ -5683,536 +5043,480 @@
/* ======================================================================
-FUNCTION
- omx_vdec::EmptyThisBuffer
+ FUNCTION
+ omx_vdec::EmptyThisBuffer
-DESCRIPTION
- This routine is used to push the encoded video frames to
- the video decoder.
+ DESCRIPTION
+ This routine is used to push the encoded video frames to
+ the video decoder.
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- OMX Error None if everything went successful.
+ RETURN VALUE
+ OMX Error None if everything went successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
{
- OMX_ERRORTYPE ret1 = OMX_ErrorNone;
- unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
+ OMX_ERRORTYPE ret1 = OMX_ErrorNone;
+ unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
- if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
- {
- codec_config_flag = true;
- DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
- }
- else
- {
- codec_config_flag = false;
- }
+ if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+ codec_config_flag = true;
+ DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
+ } else {
+ codec_config_flag = false;
+ }
- if(m_state == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
- return OMX_ErrorInvalidState;
- }
+ if (m_state == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
- if (buffer == NULL)
- {
- DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
- return OMX_ErrorBadParameter;
- }
+ if (buffer == NULL) {
+ DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
+ return OMX_ErrorBadParameter;
+ }
- if (!m_inp_bEnabled)
- {
- DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
- return OMX_ErrorIncorrectStateOperation;
- }
+ if (!m_inp_bEnabled) {
+ DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
+ return OMX_ErrorIncorrectStateOperation;
+ }
- if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
- {
- DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
- return OMX_ErrorBadPortIndex;
- }
+ if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
+ DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
#ifdef _ANDROID_
- if(iDivXDrmDecrypt)
- {
- OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
- if(drmErr != OMX_ErrorNone) {
- // this error can be ignored
- DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
+ if (iDivXDrmDecrypt) {
+ OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
+ if (drmErr != OMX_ErrorNone) {
+ // this error can be ignored
+ DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
+ }
}
- }
#endif //_ANDROID_
- if (perf_flag)
- {
- if (!latency)
- {
- dec_time.stop();
- latency = dec_time.processing_time_us();
- dec_time.start();
+ if (perf_flag) {
+ if (!latency) {
+ dec_time.stop();
+ latency = dec_time.processing_time_us();
+ dec_time.start();
+ }
}
- }
- if (arbitrary_bytes)
- {
- nBufferIndex = buffer - m_inp_heap_ptr;
- }
- else
- {
- if (input_use_buffer == true)
- {
- nBufferIndex = buffer - m_inp_heap_ptr;
- m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
- m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
- m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
- buffer = &m_inp_mem_ptr[nBufferIndex];
- DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %lu",
- &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
- }
- else{
- nBufferIndex = buffer - m_inp_mem_ptr;
- }
- }
+ if (arbitrary_bytes) {
+ nBufferIndex = buffer - m_inp_heap_ptr;
+ } else {
+ if (input_use_buffer == true) {
+ nBufferIndex = buffer - m_inp_heap_ptr;
+ m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
+ m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
+ m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
+ buffer = &m_inp_mem_ptr[nBufferIndex];
+ DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %lu",
+ &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
+ } else {
+ nBufferIndex = buffer - m_inp_mem_ptr;
+ }
+ }
- if (nBufferIndex > drv_ctx.ip_buf.actualcount )
- {
- DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
- return OMX_ErrorBadParameter;
- }
+ if (nBufferIndex > drv_ctx.ip_buf.actualcount ) {
+ DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
+ return OMX_ErrorBadParameter;
+ }
- DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
- buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
- if (arbitrary_bytes)
- {
- post_event ((unsigned)hComp,(unsigned)buffer,
+ DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
+ buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
+ if (arbitrary_bytes) {
+ post_event ((unsigned)hComp,(unsigned)buffer,
OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
- }
- else
- {
- if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
- set_frame_rate(buffer->nTimeStamp);
- post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
- }
- return OMX_ErrorNone;
+ } else {
+ if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
+ set_frame_rate(buffer->nTimeStamp);
+ post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
+ }
+ return OMX_ErrorNone;
}
/* ======================================================================
-FUNCTION
- omx_vdec::empty_this_buffer_proxy
+ FUNCTION
+ omx_vdec::empty_this_buffer_proxy
-DESCRIPTION
- This routine is used to push the encoded video frames to
- the video decoder.
+ DESCRIPTION
+ This routine is used to push the encoded video frames to
+ the video decoder.
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- OMX Error None if everything went successful.
+ RETURN VALUE
+ OMX Error None if everything went successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
{
- int push_cnt = 0,i=0;
- unsigned nPortIndex = 0;
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- struct vdec_input_frameinfo frameinfo;
- struct vdec_bufferpayload *temp_buffer;
- struct vdec_seqheader seq_header;
- bool port_setting_changed = true;
- bool not_coded_vop = false;
+ int push_cnt = 0,i=0;
+ unsigned nPortIndex = 0;
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ struct vdec_input_frameinfo frameinfo;
+ struct vdec_bufferpayload *temp_buffer;
+ struct vdec_seqheader seq_header;
+ bool port_setting_changed = true;
+ bool not_coded_vop = false;
- /*Should we generate a Aync error event*/
- if (buffer == NULL || buffer->pInputPortPrivate == NULL)
- {
- DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
- return OMX_ErrorBadParameter;
- }
+ /*Should we generate a Aync error event*/
+ if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
+ DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
+ return OMX_ErrorBadParameter;
+ }
- nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
+ nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
- if (nPortIndex > drv_ctx.ip_buf.actualcount)
- {
- DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
- nPortIndex);
- return OMX_ErrorBadParameter;
- }
+ if (nPortIndex > drv_ctx.ip_buf.actualcount) {
+ DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
+ nPortIndex);
+ return OMX_ErrorBadParameter;
+ }
- pending_input_buffers++;
+ pending_input_buffers++;
- /* return zero length and not an EOS buffer */
- if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
- ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
- {
- DEBUG_PRINT_HIGH("\n return zero legth buffer");
- post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
- OMX_COMPONENT_GENERATE_EBD);
- return OMX_ErrorNone;
- }
+ /* return zero length and not an EOS buffer */
+ if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
+ ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
+ DEBUG_PRINT_HIGH("\n return zero legth buffer");
+ post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+ OMX_COMPONENT_GENERATE_EBD);
+ return OMX_ErrorNone;
+ }
- if(codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX){
- mp4StreamType psBits;
- psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
- psBits.numBytes = buffer->nFilledLen;
- mp4_headerparser.parseHeader(&psBits);
- not_coded_vop = mp4_headerparser.is_notcodec_vop(
- (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
- if(not_coded_vop) {
- DEBUG_PRINT_HIGH("\n Found Not coded vop len %lu frame number %u",
- buffer->nFilledLen,frame_count);
- if(buffer->nFlags & OMX_BUFFERFLAG_EOS){
- DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
- not_coded_vop = false;
- buffer->nFilledLen = 0;
+ if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) {
+ mp4StreamType psBits;
+ psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
+ psBits.numBytes = buffer->nFilledLen;
+ mp4_headerparser.parseHeader(&psBits);
+ not_coded_vop = mp4_headerparser.is_notcodec_vop(
+ (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
+ if (not_coded_vop) {
+ DEBUG_PRINT_HIGH("\n Found Not coded vop len %lu frame number %u",
+ buffer->nFilledLen,frame_count);
+ if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+ DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
+ not_coded_vop = false;
+ buffer->nFilledLen = 0;
+ }
}
}
- }
- if(input_flush_progress == true
+ if (input_flush_progress == true
- || not_coded_vop
+ || not_coded_vop
- )
- {
- DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
- post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
- OMX_COMPONENT_GENERATE_EBD);
- return OMX_ErrorNone;
- }
-
- temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
-
- if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
- {
- return OMX_ErrorBadParameter;
- }
- /* If its first frame, H264 codec and reject is true, then parse the nal
- and get the profile. Based on this, reject the clip playback */
- if(first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 &&
- m_reject_avc_1080p_mp)
- {
- first_frame = 1;
- DEBUG_PRINT_ERROR("\nParse nal to get the profile");
- h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen,
- NALU_TYPE_SPS);
- m_profile = h264_parser->get_profile();
- ret = is_video_session_supported();
- if (ret)
- {
- post_event ((unsigned int)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD);
- post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT);
- /* Move the state to Invalid to avoid queueing of pending ETB to the driver */
- m_state = OMX_StateInvalid;
- return OMX_ErrorNone;
- }
- }
-
- DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
- /*for use buffer we need to memcpy the data*/
- temp_buffer->buffer_len = buffer->nFilledLen;
-
- if (input_use_buffer)
- {
- if (buffer->nFilledLen <= temp_buffer->buffer_len)
- {
- if(arbitrary_bytes)
- {
- memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
- }
- else
- {
- memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
- buffer->nFilledLen);
- }
- }
- else
- {
- return OMX_ErrorBadParameter;
+ ) {
+ DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
+ post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+ OMX_COMPONENT_GENERATE_EBD);
+ return OMX_ErrorNone;
}
- }
+ temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
- frameinfo.bufferaddr = temp_buffer->bufferaddr;
- frameinfo.client_data = (void *) buffer;
- frameinfo.datalen = temp_buffer->buffer_len;
- frameinfo.flags = 0;
- frameinfo.offset = buffer->nOffset;
- frameinfo.pmem_fd = temp_buffer->pmem_fd;
- frameinfo.pmem_offset = temp_buffer->offset;
- frameinfo.timestamp = buffer->nTimeStamp;
- if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
- {
- DEBUG_PRINT_LOW("ETB: dmx enabled");
- if (m_demux_entries == 0)
- {
- extract_demux_addr_offsets(buffer);
+ if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) {
+ return OMX_ErrorBadParameter;
+ }
+ /* If its first frame, H264 codec and reject is true, then parse the nal
+ and get the profile. Based on this, reject the clip playback */
+ if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 &&
+ m_reject_avc_1080p_mp) {
+ first_frame = 1;
+ DEBUG_PRINT_ERROR("\nParse nal to get the profile");
+ h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen,
+ NALU_TYPE_SPS);
+ m_profile = h264_parser->get_profile();
+ ret = is_video_session_supported();
+ if (ret) {
+ post_event ((unsigned int)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD);
+ post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT);
+ /* Move the state to Invalid to avoid queueing of pending ETB to the driver */
+ m_state = OMX_StateInvalid;
+ return OMX_ErrorNone;
+ }
}
- DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%lu",m_demux_entries);
- handle_demux_data(buffer);
- frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
- frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
- }
- else
- {
- frameinfo.desc_addr = NULL;
- frameinfo.desc_size = 0;
- }
- if(!arbitrary_bytes)
- {
- frameinfo.flags |= buffer->nFlags;
- }
+ DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+ /*for use buffer we need to memcpy the data*/
+ temp_buffer->buffer_len = buffer->nFilledLen;
+
+ if (input_use_buffer) {
+ if (buffer->nFilledLen <= temp_buffer->buffer_len) {
+ if (arbitrary_bytes) {
+ memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
+ } else {
+ memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
+ buffer->nFilledLen);
+ }
+ } else {
+ return OMX_ErrorBadParameter;
+ }
+
+ }
+
+ frameinfo.bufferaddr = temp_buffer->bufferaddr;
+ frameinfo.client_data = (void *) buffer;
+ frameinfo.datalen = temp_buffer->buffer_len;
+ frameinfo.flags = 0;
+ frameinfo.offset = buffer->nOffset;
+ frameinfo.pmem_fd = temp_buffer->pmem_fd;
+ frameinfo.pmem_offset = temp_buffer->offset;
+ frameinfo.timestamp = buffer->nTimeStamp;
+ if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
+ DEBUG_PRINT_LOW("ETB: dmx enabled");
+ if (m_demux_entries == 0) {
+ extract_demux_addr_offsets(buffer);
+ }
+
+ DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%lu",m_demux_entries);
+ handle_demux_data(buffer);
+ frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
+ frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
+ } else {
+ frameinfo.desc_addr = NULL;
+ frameinfo.desc_size = 0;
+ }
+ if (!arbitrary_bytes) {
+ frameinfo.flags |= buffer->nFlags;
+ }
#ifdef _ANDROID_
- if (m_debug_timestamp)
- {
- if(arbitrary_bytes)
- {
- DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
- m_timestamp_list.insert_ts(buffer->nTimeStamp);
+ if (m_debug_timestamp) {
+ if (arbitrary_bytes) {
+ DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+ m_timestamp_list.insert_ts(buffer->nTimeStamp);
+ } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
+ DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+ m_timestamp_list.insert_ts(buffer->nTimeStamp);
+ }
}
- else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
- {
- DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
- m_timestamp_list.insert_ts(buffer->nTimeStamp);
- }
- }
#endif
#ifdef INPUT_BUFFER_LOG
- if (output_capability == V4L2_PIX_FMT_VP8) {
- struct vp8_ivf_frame_header{
- OMX_U32 framesize;
- OMX_U32 timestamp_lo;
- OMX_U32 timestamp_hi;
- } vp8_frame_header;
- vp8_frame_header.framesize = temp_buffer->buffer_len;
- /* Currently FW doesn't use timestamp values */
- vp8_frame_header.timestamp_lo = 0;
- vp8_frame_header.timestamp_hi = 0;
- if (inputBufferFile1)
- {
- fwrite((const char *)&vp8_frame_header,
- sizeof(vp8_frame_header),1,inputBufferFile1);
- fwrite((const char *)temp_buffer->bufferaddr,
- temp_buffer->buffer_len,1,inputBufferFile1);
- }
- } else {
- if (inputBufferFile1)
- {
- fwrite((const char *)temp_buffer->bufferaddr,
- temp_buffer->buffer_len,1,inputBufferFile1);
+ if (output_capability == V4L2_PIX_FMT_VP8) {
+ struct vp8_ivf_frame_header {
+ OMX_U32 framesize;
+ OMX_U32 timestamp_lo;
+ OMX_U32 timestamp_hi;
+ } vp8_frame_header;
+ vp8_frame_header.framesize = temp_buffer->buffer_len;
+ /* Currently FW doesn't use timestamp values */
+ vp8_frame_header.timestamp_lo = 0;
+ vp8_frame_header.timestamp_hi = 0;
+ if (inputBufferFile1) {
+ fwrite((const char *)&vp8_frame_header,
+ sizeof(vp8_frame_header),1,inputBufferFile1);
+ fwrite((const char *)temp_buffer->bufferaddr,
+ temp_buffer->buffer_len,1,inputBufferFile1);
+ }
+ } else {
+ if (inputBufferFile1) {
+ fwrite((const char *)temp_buffer->bufferaddr,
+ temp_buffer->buffer_len,1,inputBufferFile1);
+ }
}
- }
#endif
- if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
- {
- frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
- buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
- }
+ if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
+ frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+ buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+ }
- if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
- {
- DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
- frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
- h264_scratch.nFilledLen = 0;
- nal_count = 0;
- look_ahead_nal = false;
- frame_count = 0;
- if (m_frame_parser.mutils)
- m_frame_parser.mutils->initialize_frame_checking_environment();
- m_frame_parser.flush();
- h264_last_au_ts = LLONG_MAX;
- h264_last_au_flags = 0;
- memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
- m_demux_entries = 0;
- }
- struct v4l2_buffer buf;
- struct v4l2_plane plane;
- memset( (void *)&buf, 0, sizeof(buf));
- memset( (void *)&plane, 0, sizeof(plane));
- int rc;
- unsigned long print_count;
- if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
- { buf.flags = V4L2_BUF_FLAG_EOS;
- DEBUG_PRINT_HIGH("\n INPUT EOS reached \n") ;
- }
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- buf.index = nPortIndex;
- buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- buf.memory = V4L2_MEMORY_USERPTR;
- plane.bytesused = temp_buffer->buffer_len;
- plane.length = drv_ctx.ip_buf.buffer_size;
- plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
- (unsigned long)temp_buffer->offset;
- plane.reserved[0] = temp_buffer->pmem_fd;
- plane.reserved[1] = temp_buffer->offset;
- plane.data_offset = 0;
- buf.m.planes = &plane;
- buf.length = 1;
- if (frameinfo.timestamp >= LLONG_MAX) {
- buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
- }
- //assumption is that timestamp is in milliseconds
- buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
- buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
- buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
- buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0;
+ if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
+ DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
+ frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
+ h264_scratch.nFilledLen = 0;
+ nal_count = 0;
+ look_ahead_nal = false;
+ frame_count = 0;
+ if (m_frame_parser.mutils)
+ m_frame_parser.mutils->initialize_frame_checking_environment();
+ m_frame_parser.flush();
+ h264_last_au_ts = LLONG_MAX;
+ h264_last_au_flags = 0;
+ memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+ m_demux_entries = 0;
+ }
+ struct v4l2_buffer buf;
+ struct v4l2_plane plane;
+ memset( (void *)&buf, 0, sizeof(buf));
+ memset( (void *)&plane, 0, sizeof(plane));
+ int rc;
+ unsigned long print_count;
+ if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
+ buf.flags = V4L2_BUF_FLAG_EOS;
+ DEBUG_PRINT_HIGH("\n INPUT EOS reached \n") ;
+ }
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ buf.index = nPortIndex;
+ buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane.bytesused = temp_buffer->buffer_len;
+ plane.length = drv_ctx.ip_buf.buffer_size;
+ plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
+ (unsigned long)temp_buffer->offset;
+ plane.reserved[0] = temp_buffer->pmem_fd;
+ plane.reserved[1] = temp_buffer->offset;
+ plane.data_offset = 0;
+ buf.m.planes = &plane;
+ buf.length = 1;
+ if (frameinfo.timestamp >= LLONG_MAX) {
+ buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
+ }
+ //assumption is that timestamp is in milliseconds
+ buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
+ buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
+ buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
+ buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0;
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
- if(rc)
- {
- DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n");
- return OMX_ErrorHardware;
- }
- if(!streaming[OUTPUT_PORT])
- {
- enum v4l2_buf_type buf_type;
- int ret,r;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
+ if (rc) {
+ DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n");
+ return OMX_ErrorHardware;
+ }
+ if (!streaming[OUTPUT_PORT]) {
+ enum v4l2_buf_type buf_type;
+ int ret,r;
- buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
- ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
- if(!ret) {
- DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful \n");
- streaming[OUTPUT_PORT] = true;
- } else{
- DEBUG_PRINT_ERROR(" \n Failed to call streamon on OUTPUT \n");
- DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
- post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
- OMX_COMPONENT_GENERATE_EBD);
- return OMX_ErrorBadParameter;
- }
-}
- DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
- frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
- time_stamp_dts.insert_timestamp(buffer);
+ ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
+ if (!ret) {
+ DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful \n");
+ streaming[OUTPUT_PORT] = true;
+ } else {
+ DEBUG_PRINT_ERROR(" \n Failed to call streamon on OUTPUT \n");
+ DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
+ post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+ OMX_COMPONENT_GENERATE_EBD);
+ return OMX_ErrorBadParameter;
+ }
+ }
+ DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
+ frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
+ time_stamp_dts.insert_timestamp(buffer);
- return ret;
+ return ret;
}
/* ======================================================================
-FUNCTION
- omx_vdec::FillThisBuffer
+ FUNCTION
+ omx_vdec::FillThisBuffer
-DESCRIPTION
- IL client uses this method to release the frame buffer
- after displaying them.
+ DESCRIPTION
+ IL client uses this method to release the frame buffer
+ after displaying them.
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
{
- if(m_state == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("FTB in Invalid State\n");
- return OMX_ErrorInvalidState;
- }
+ if (m_state == OMX_StateInvalid) {
+ DEBUG_PRINT_ERROR("FTB in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
- if (!m_out_bEnabled)
- {
- DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
- return OMX_ErrorIncorrectStateOperation;
- }
+ if (!m_out_bEnabled) {
+ DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
+ return OMX_ErrorIncorrectStateOperation;
+ }
- if (buffer == NULL ||
- ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount))
- {
- return OMX_ErrorBadParameter;
- }
+ if (buffer == NULL ||
+ ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) {
+ return OMX_ErrorBadParameter;
+ }
- if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
- {
- DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
- return OMX_ErrorBadPortIndex;
- }
+ if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
+ DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
- DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
- post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
- return OMX_ErrorNone;
+ DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+ post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
+ return OMX_ErrorNone;
}
/* ======================================================================
-FUNCTION
- omx_vdec::fill_this_buffer_proxy
+ FUNCTION
+ omx_vdec::fill_this_buffer_proxy
-DESCRIPTION
- IL client uses this method to release the frame buffer
- after displaying them.
+ DESCRIPTION
+ IL client uses this method to release the frame buffer
+ after displaying them.
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy(
- OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
{
- OMX_ERRORTYPE nRet = OMX_ErrorNone;
- OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
- unsigned nPortIndex = 0;
- struct vdec_fillbuffer_cmd fillbuffer;
- struct vdec_bufferpayload *ptr_outputbuffer = NULL;
- struct vdec_output_frameinfo *ptr_respbuffer = NULL;
+ OMX_ERRORTYPE nRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
+ unsigned nPortIndex = 0;
+ struct vdec_fillbuffer_cmd fillbuffer;
+ struct vdec_bufferpayload *ptr_outputbuffer = NULL;
+ struct vdec_output_frameinfo *ptr_respbuffer = NULL;
- nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
+ nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
- if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount)
- return OMX_ErrorBadParameter;
+ if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount)
+ return OMX_ErrorBadParameter;
- DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
- bufferAdd, bufferAdd->pBuffer);
- /*Return back the output buffer to client*/
- if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
- {
- DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
- buffer->nFilledLen = 0;
- m_cb.FillBufferDone (hComp,m_app_data,buffer);
- return OMX_ErrorNone;
- }
- pending_output_buffers++;
- buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
- ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
- if (ptr_respbuffer)
- {
- ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
- }
+ DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
+ bufferAdd, bufferAdd->pBuffer);
+ /*Return back the output buffer to client*/
+ if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
+ DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
+ buffer->nFilledLen = 0;
+ m_cb.FillBufferDone (hComp,m_app_data,buffer);
+ return OMX_ErrorNone;
+ }
+ pending_output_buffers++;
+ buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
+ ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
+ if (ptr_respbuffer) {
+ ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
+ }
- if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
- {
- DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
- buffer->nFilledLen = 0;
- m_cb.FillBufferDone (hComp,m_app_data,buffer);
- pending_output_buffers--;
- return OMX_ErrorBadParameter;
- }
+ if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
+ DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
+ buffer->nFilledLen = 0;
+ m_cb.FillBufferDone (hComp,m_app_data,buffer);
+ pending_output_buffers--;
+ return OMX_ErrorBadParameter;
+ }
- /* memcpy (&fillbuffer.buffer,ptr_outputbuffer,
- sizeof(struct vdec_bufferpayload));
- fillbuffer.client_data = bufferAdd;*/
+ /* memcpy (&fillbuffer.buffer,ptr_outputbuffer,
+ sizeof(struct vdec_bufferpayload));
+ fillbuffer.client_data = bufferAdd;*/
#ifdef _ANDROID_ICS_
- if (m_enable_android_native_buffers)
- {
+ if (m_enable_android_native_buffers) {
// Acquire a write lock on this buffer.
if (GENLOCK_NO_ERROR != genlock_lock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle,
- GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
+ GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
DEBUG_PRINT_ERROR("Failed to acquire genlock");
buffer->nFilledLen = 0;
m_cb.FillBufferDone (hComp,m_app_data,buffer);
@@ -6220,147 +5524,139 @@
return OMX_ErrorInsufficientResources;
} else {
native_buffer[buffer - m_out_mem_ptr].inuse = true;
- }
+ }
}
#endif
- int rc = 0;
- struct v4l2_buffer buf;
- struct v4l2_plane plane[VIDEO_MAX_PLANES];
- memset( (void *)&buf, 0, sizeof(buf));
- memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
- int extra_idx = 0;
+ int rc = 0;
+ struct v4l2_buffer buf;
+ struct v4l2_plane plane[VIDEO_MAX_PLANES];
+ memset( (void *)&buf, 0, sizeof(buf));
+ memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
+ int extra_idx = 0;
- buf.index = nPortIndex;
- buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- buf.memory = V4L2_MEMORY_USERPTR;
- plane[0].bytesused = buffer->nFilledLen;
- plane[0].length = drv_ctx.op_buf.buffer_size;
- plane[0].m.userptr =
- (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
- (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
- plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
- plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
- plane[0].data_offset = 0;
- extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
- if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
- plane[extra_idx].bytesused = 0;
- plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
- plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
+ buf.index = nPortIndex;
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane[0].bytesused = buffer->nFilledLen;
+ plane[0].length = drv_ctx.op_buf.buffer_size;
+ plane[0].m.userptr =
+ (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
+ (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
+ plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
+ plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
+ plane[0].data_offset = 0;
+ extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+ if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+ plane[extra_idx].bytesused = 0;
+ plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
+ plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
#ifdef USE_ION
- plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
+ plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
#endif
- plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
- plane[extra_idx].data_offset = 0;
- } else if (extra_idx >= VIDEO_MAX_PLANES) {
- DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
- return OMX_ErrorBadParameter;
- }
- buf.m.planes = plane;
- buf.length = drv_ctx.num_planes;
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
- if (rc) {
- /*TODO: How to handle this case */
- DEBUG_PRINT_ERROR("Failed to qbuf to driver");
- }
-//#ifdef _ANDROID_ICS_
- // if (m_enable_android_native_buffers)
- // {
- // Unlock the buffer
- // if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
+ plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
+ plane[extra_idx].data_offset = 0;
+ } else if (extra_idx >= VIDEO_MAX_PLANES) {
+ DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
+ return OMX_ErrorBadParameter;
+ }
+ buf.m.planes = plane;
+ buf.length = drv_ctx.num_planes;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
+ if (rc) {
+ /*TODO: How to handle this case */
+ DEBUG_PRINT_ERROR("Failed to qbuf to driver");
+ }
+ //#ifdef _ANDROID_ICS_
+ // if (m_enable_android_native_buffers)
+ // {
+ // Unlock the buffer
+ // if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
// DEBUG_PRINT_ERROR("Releasing genlock failed");
// return OMX_ErrorInsufficientResources;
/// } else {
- // native_buffer[buffer - m_out_mem_ptr].inuse = false;
- // }
- // }
-//#endif
+ // native_buffer[buffer - m_out_mem_ptr].inuse = false;
+ // }
+ // }
+ //#endif
//m_cb.FillBufferDone (hComp,m_app_data,buffer);
- // pending_output_buffers--;
- // return OMX_ErrorBadParameter;
- //}
- return OMX_ErrorNone;
+ // pending_output_buffers--;
+ // return OMX_ErrorBadParameter;
+ //}
+return OMX_ErrorNone;
}
/* ======================================================================
-FUNCTION
- omx_vdec::SetCallbacks
+ FUNCTION
+ omx_vdec::SetCallbacks
-DESCRIPTION
- Set the callbacks.
+ DESCRIPTION
+ Set the callbacks.
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- OMX Error None if everything successful.
+ RETURN VALUE
+ OMX Error None if everything successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp,
- OMX_IN OMX_CALLBACKTYPE* callbacks,
- OMX_IN OMX_PTR appData)
+ OMX_IN OMX_CALLBACKTYPE* callbacks,
+ OMX_IN OMX_PTR appData)
{
- m_cb = *callbacks;
- DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
- m_cb.EventHandler,m_cb.FillBufferDone);
- m_app_data = appData;
- return OMX_ErrorNotImplemented;
+ m_cb = *callbacks;
+ DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
+ m_cb.EventHandler,m_cb.FillBufferDone);
+ m_app_data = appData;
+ return OMX_ErrorNotImplemented;
}
/* ======================================================================
-FUNCTION
- omx_vdec::ComponentDeInit
+ FUNCTION
+ omx_vdec::ComponentDeInit
-DESCRIPTION
- Destroys the component and release memory allocated to the heap.
+ DESCRIPTION
+ Destroys the component and release memory allocated to the heap.
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- OMX Error None if everything successful.
+ RETURN VALUE
+ OMX Error None if everything successful.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
{
#ifdef _ANDROID_
- if(iDivXDrmDecrypt)
- {
+ if (iDivXDrmDecrypt) {
delete iDivXDrmDecrypt;
iDivXDrmDecrypt=NULL;
}
#endif //_ANDROID_
unsigned i = 0;
- if (OMX_StateLoaded != m_state)
- {
+ if (OMX_StateLoaded != m_state) {
DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
- m_state);
+ m_state);
DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
- }
- else
- {
- DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
+ } else {
+ DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
}
/*Check if the output buffers have to be cleaned up*/
- if(m_out_mem_ptr)
- {
+ if (m_out_mem_ptr) {
DEBUG_PRINT_LOW("Freeing the Output Memory\n");
- for (i = 0; i < drv_ctx.op_buf.actualcount; i++ )
- {
- free_output_buffer (&m_out_mem_ptr[i]);
+ for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
+ free_output_buffer (&m_out_mem_ptr[i]);
#ifdef _ANDROID_ICS_
- if (m_enable_android_native_buffers)
- {
- if (native_buffer[i].inuse)
- {
- if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
- DEBUG_PRINT_ERROR("Unlocking genlock failed");
+ if (m_enable_android_native_buffers) {
+ if (native_buffer[i].inuse) {
+ if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[i].nativehandle)) {
+ DEBUG_PRINT_ERROR("Unlocking genlock failed");
+ }
+ native_buffer[i].inuse = false;
+ }
}
- native_buffer[i].inuse = false;
- }
- }
#endif
}
#ifdef _ANDROID_ICS_
@@ -6369,38 +5665,32 @@
}
/*Check if the input buffers have to be cleaned up*/
- if(m_inp_mem_ptr || m_inp_heap_ptr)
- {
+ if (m_inp_mem_ptr || m_inp_heap_ptr) {
DEBUG_PRINT_LOW("Freeing the Input Memory\n");
- for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ )
- {
- if (m_inp_mem_ptr)
- free_input_buffer (i,&m_inp_mem_ptr[i]);
- else
- free_input_buffer (i,NULL);
+ for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
+ if (m_inp_mem_ptr)
+ free_input_buffer (i,&m_inp_mem_ptr[i]);
+ else
+ free_input_buffer (i,NULL);
}
}
free_input_buffer_header();
free_output_buffer_header();
- if(h264_scratch.pBuffer)
- {
+ if (h264_scratch.pBuffer) {
free(h264_scratch.pBuffer);
h264_scratch.pBuffer = NULL;
}
- if (h264_parser)
- {
+ if (h264_parser) {
delete h264_parser;
- h264_parser = NULL;
+ h264_parser = NULL;
}
- if(m_platform_list)
- {
+ if (m_platform_list) {
free(m_platform_list);
m_platform_list = NULL;
}
- if(m_vendor_config.pData)
- {
+ if (m_vendor_config.pData) {
free(m_vendor_config.pData);
m_vendor_config.pData = NULL;
}
@@ -6413,17 +5703,16 @@
m_cmd_q.m_read = m_cmd_q.m_write =0;
m_etb_q.m_read = m_etb_q.m_write =0;
#ifdef _ANDROID_
- if (m_debug_timestamp)
- {
- m_timestamp_list.reset_ts_list();
+ if (m_debug_timestamp) {
+ m_timestamp_list.reset_ts_list();
}
#endif
DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
//(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
- // NULL);
+ // NULL);
DEBUG_PRINT_HIGH("\n Close the driver instance");
-
+
#ifdef INPUT_BUFFER_LOG
if (inputBufferFile1)
fclose (inputBufferFile1);
@@ -6436,54 +5725,54 @@
if (outputExtradataFile)
fclose (outputExtradataFile);
#endif
- DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
- return OMX_ErrorNone;
+ DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
+ return OMX_ErrorNone;
}
/* ======================================================================
-FUNCTION
- omx_vdec::UseEGLImage
+ FUNCTION
+ omx_vdec::UseEGLImage
-DESCRIPTION
- OMX Use EGL Image method implementation <TBD>.
+ DESCRIPTION
+ OMX Use EGL Image method implementation <TBD>.
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- Not Implemented error.
+ RETURN VALUE
+ Not Implemented error.
-========================================================================== */
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp,
- OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
- OMX_IN OMX_U32 port,
- OMX_IN OMX_PTR appData,
- OMX_IN void* eglImage)
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN void* eglImage)
{
- OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
- OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
- OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
+ OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
+ OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
+ OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
#ifdef USE_EGL_IMAGE_GPU
- PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
- EGLint fd = -1, offset = 0,pmemPtr = 0;
+ PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
+ EGLint fd = -1, offset = 0,pmemPtr = 0;
#else
- int fd = -1, offset = 0;
+ int fd = -1, offset = 0;
#endif
- DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
- if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
- DEBUG_PRINT_ERROR("\n ");
- }
+ DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
+ if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
+ DEBUG_PRINT_ERROR("\n ");
+ }
#ifdef USE_EGL_IMAGE_GPU
- if(m_display_id == NULL) {
+ if (m_display_id == NULL) {
DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
return OMX_ErrorInsufficientResources;
- }
- egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
- eglGetProcAddress("eglQueryImageKHR");
- egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
- egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
- egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
+ }
+ egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
+ eglGetProcAddress("eglQueryImageKHR");
+ egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
+ egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
+ egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
#else //with OMX test app
struct temp_egl {
int pmem_fd;
@@ -6492,8 +5781,7 @@
struct temp_egl *temp_egl_id = NULL;
void * pmemPtr = (void *) eglImage;
temp_egl_id = (struct temp_egl *)eglImage;
- if (temp_egl_id != NULL)
- {
+ if (temp_egl_id != NULL) {
fd = temp_egl_id->pmem_fd;
offset = temp_egl_id->offset;
}
@@ -6501,650 +5789,559 @@
if (fd < 0) {
DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d \n",fd);
return OMX_ErrorInsufficientResources;
- }
- pmem_info.pmem_fd = (OMX_U32) fd;
- pmem_info.offset = (OMX_U32) offset;
- pmem_entry.entry = (void *) &pmem_info;
- pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
- pmem_list.entryList = &pmem_entry;
- pmem_list.nEntries = 1;
- ouput_egl_buffers = true;
- if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
- (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
- (OMX_U8 *)pmemPtr)) {
- DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
- return OMX_ErrorInsufficientResources;
- }
- return OMX_ErrorNone;
+ }
+ pmem_info.pmem_fd = (OMX_U32) fd;
+ pmem_info.offset = (OMX_U32) offset;
+ pmem_entry.entry = (void *) &pmem_info;
+ pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+ pmem_list.entryList = &pmem_entry;
+ pmem_list.nEntries = 1;
+ ouput_egl_buffers = true;
+ if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
+ (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
+ (OMX_U8 *)pmemPtr)) {
+ DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ return OMX_ErrorNone;
}
/* ======================================================================
-FUNCTION
- omx_vdec::ComponentRoleEnum
+ FUNCTION
+ omx_vdec::ComponentRoleEnum
-DESCRIPTION
- OMX Component Role Enum method implementation.
+ DESCRIPTION
+ OMX Component Role Enum method implementation.
-PARAMETERS
- <TBD>.
+ PARAMETERS
+ <TBD>.
-RETURN VALUE
- OMX Error None if everything is successful.
-========================================================================== */
+ RETURN VALUE
+ OMX Error None if everything is successful.
+ ========================================================================== */
OMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
- OMX_OUT OMX_U8* role,
- OMX_IN OMX_U32 index)
+ OMX_OUT OMX_U8* role,
+ OMX_IN OMX_U32 index)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
- if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
- {
- if((0 == index) && role)
- {
- strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+ if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
+ if ((0 == index) && role) {
+ strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+ } else {
+ eRet = OMX_ErrorNoMore;
+ }
}
- else
- {
- eRet = OMX_ErrorNoMore;
+ if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
+ if ((0 == index) && role) {
+ strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+ } else {
+ eRet = OMX_ErrorNoMore;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
+ if ((0 == index) && role) {
+ strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+ } else {
+ DEBUG_PRINT_LOW("\n No more roles \n");
+ eRet = OMX_ErrorNoMore;
+ }
}
- }
- if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
- {
- if((0 == index) && role)
- {
- strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
- }
- else
- {
- eRet = OMX_ErrorNoMore;
- }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
- {
- if((0 == index) && role)
- {
- strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
- }
- else
- {
- DEBUG_PRINT_LOW("\n No more roles \n");
- eRet = OMX_ErrorNoMore;
- }
- }
- else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
- (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
- )
+ else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
+ (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
+ )
- {
- if((0 == index) && role)
{
- strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+ if ((0 == index) && role) {
+ strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+ } else {
+ DEBUG_PRINT_LOW("\n No more roles \n");
+ eRet = OMX_ErrorNoMore;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
+ if ((0 == index) && role) {
+ strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+ } else {
+ DEBUG_PRINT_LOW("\n No more roles \n");
+ eRet = OMX_ErrorNoMore;
+ }
+ } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
+ (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
+ ) {
+ if ((0 == index) && role) {
+ strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+ } else {
+ DEBUG_PRINT_LOW("\n No more roles \n");
+ eRet = OMX_ErrorNoMore;
+ }
+ } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
+ if ((0 == index) && role) {
+ strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
+ DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
+ } else {
+ DEBUG_PRINT_LOW("\n No more roles \n");
+ eRet = OMX_ErrorNoMore;
+ }
+ } else {
+ DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
+ eRet = OMX_ErrorInvalidComponentName;
}
- else
- {
- DEBUG_PRINT_LOW("\n No more roles \n");
- eRet = OMX_ErrorNoMore;
- }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
- {
- if((0 == index) && role)
- {
- strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
- }
- else
- {
- DEBUG_PRINT_LOW("\n No more roles \n");
- eRet = OMX_ErrorNoMore;
- }
- }
- else if( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
- (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
- )
- {
- if((0 == index) && role)
- {
- strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
- }
- else
- {
- DEBUG_PRINT_LOW("\n No more roles \n");
- eRet = OMX_ErrorNoMore;
- }
- }
- else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE))
- {
- if((0 == index) && role)
- {
- strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
- DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
- }
- else
- {
- DEBUG_PRINT_LOW("\n No more roles \n");
- eRet = OMX_ErrorNoMore;
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
- eRet = OMX_ErrorInvalidComponentName;
- }
- return eRet;
+ return eRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::AllocateDone
+ FUNCTION
+ omx_vdec::AllocateDone
-DESCRIPTION
- Checks if entire buffer pool is allocated by IL Client or not.
- Need this to move to IDLE state.
+ DESCRIPTION
+ Checks if entire buffer pool is allocated by IL Client or not.
+ Need this to move to IDLE state.
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false.
+ RETURN VALUE
+ true/false.
-========================================================================== */
+ ========================================================================== */
bool omx_vdec::allocate_done(void)
{
- bool bRet = false;
- bool bRet_In = false;
- bool bRet_Out = false;
+ bool bRet = false;
+ bool bRet_In = false;
+ bool bRet_Out = false;
- bRet_In = allocate_input_done();
- bRet_Out = allocate_output_done();
+ bRet_In = allocate_input_done();
+ bRet_Out = allocate_output_done();
- if(bRet_In && bRet_Out)
- {
- bRet = true;
- }
-
- return bRet;
-}
-/* ======================================================================
-FUNCTION
- omx_vdec::AllocateInputDone
-
-DESCRIPTION
- Checks if I/P buffer pool is allocated by IL Client or not.
-
-PARAMETERS
- None.
-
-RETURN VALUE
- true/false.
-
-========================================================================== */
-bool omx_vdec::allocate_input_done(void)
-{
- bool bRet = false;
- unsigned i=0;
-
- if (m_inp_mem_ptr == NULL)
- {
- return bRet;
- }
- if(m_inp_mem_ptr )
- {
- for(;i<drv_ctx.ip_buf.actualcount;i++)
- {
- if(BITMASK_ABSENT(&m_inp_bm_count,i))
- {
- break;
- }
- }
- }
- if(i == drv_ctx.ip_buf.actualcount)
- {
- bRet = true;
- DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
- }
- if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
- {
- m_inp_bPopulated = OMX_TRUE;
- }
- return bRet;
-}
-/* ======================================================================
-FUNCTION
- omx_vdec::AllocateOutputDone
-
-DESCRIPTION
- Checks if entire O/P buffer pool is allocated by IL Client or not.
-
-PARAMETERS
- None.
-
-RETURN VALUE
- true/false.
-
-========================================================================== */
-bool omx_vdec::allocate_output_done(void)
-{
- bool bRet = false;
- unsigned j=0;
-
- if (m_out_mem_ptr == NULL)
- {
- return bRet;
- }
-
- if (m_out_mem_ptr)
- {
- for(;j < drv_ctx.op_buf.actualcount;j++)
- {
- if(BITMASK_ABSENT(&m_out_bm_count,j))
- {
- break;
- }
- }
- }
-
- if(j == drv_ctx.op_buf.actualcount)
- {
- bRet = true;
- DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
- if(m_out_bEnabled)
- m_out_bPopulated = OMX_TRUE;
- }
-
- return bRet;
-}
-
-/* ======================================================================
-FUNCTION
- omx_vdec::ReleaseDone
-
-DESCRIPTION
- Checks if IL client has released all the buffers.
-
-PARAMETERS
- None.
-
-RETURN VALUE
- true/false
-
-========================================================================== */
-bool omx_vdec::release_done(void)
-{
- bool bRet = false;
-
- if(release_input_done())
- {
- if(release_output_done())
- {
+ if (bRet_In && bRet_Out) {
bRet = true;
}
- }
- return bRet;
+
+ return bRet;
+}
+/* ======================================================================
+ FUNCTION
+ omx_vdec::AllocateInputDone
+
+ DESCRIPTION
+ Checks if I/P buffer pool is allocated by IL Client or not.
+
+ PARAMETERS
+ None.
+
+ RETURN VALUE
+ true/false.
+
+ ========================================================================== */
+bool omx_vdec::allocate_input_done(void)
+{
+ bool bRet = false;
+ unsigned i=0;
+
+ if (m_inp_mem_ptr == NULL) {
+ return bRet;
+ }
+ if (m_inp_mem_ptr ) {
+ for (; i<drv_ctx.ip_buf.actualcount; i++) {
+ if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
+ break;
+ }
+ }
+ }
+ if (i == drv_ctx.ip_buf.actualcount) {
+ bRet = true;
+ DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
+ }
+ if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
+ m_inp_bPopulated = OMX_TRUE;
+ }
+ return bRet;
+}
+/* ======================================================================
+ FUNCTION
+ omx_vdec::AllocateOutputDone
+
+ DESCRIPTION
+ Checks if entire O/P buffer pool is allocated by IL Client or not.
+
+ PARAMETERS
+ None.
+
+ RETURN VALUE
+ true/false.
+
+ ========================================================================== */
+bool omx_vdec::allocate_output_done(void)
+{
+ bool bRet = false;
+ unsigned j=0;
+
+ if (m_out_mem_ptr == NULL) {
+ return bRet;
+ }
+
+ if (m_out_mem_ptr) {
+ for (; j < drv_ctx.op_buf.actualcount; j++) {
+ if (BITMASK_ABSENT(&m_out_bm_count,j)) {
+ break;
+ }
+ }
+ }
+
+ if (j == drv_ctx.op_buf.actualcount) {
+ bRet = true;
+ DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
+ if (m_out_bEnabled)
+ m_out_bPopulated = OMX_TRUE;
+ }
+
+ return bRet;
+}
+
+/* ======================================================================
+ FUNCTION
+ omx_vdec::ReleaseDone
+
+ DESCRIPTION
+ Checks if IL client has released all the buffers.
+
+ PARAMETERS
+ None.
+
+ RETURN VALUE
+ true/false
+
+ ========================================================================== */
+bool omx_vdec::release_done(void)
+{
+ bool bRet = false;
+
+ if (release_input_done()) {
+ if (release_output_done()) {
+ bRet = true;
+ }
+ }
+ return bRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::ReleaseOutputDone
+ FUNCTION
+ omx_vdec::ReleaseOutputDone
-DESCRIPTION
- Checks if IL client has released all the buffers.
+ DESCRIPTION
+ Checks if IL client has released all the buffers.
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
bool omx_vdec::release_output_done(void)
{
- bool bRet = false;
- unsigned i=0,j=0;
+ bool bRet = false;
+ unsigned i=0,j=0;
- DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
- if(m_out_mem_ptr)
- {
- for(;j < drv_ctx.op_buf.actualcount ; j++)
- {
- if(BITMASK_PRESENT(&m_out_bm_count,j))
- {
- break;
+ DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
+ if (m_out_mem_ptr) {
+ for (; j < drv_ctx.op_buf.actualcount ; j++) {
+ if (BITMASK_PRESENT(&m_out_bm_count,j)) {
+ break;
+ }
}
- }
- if(j == drv_ctx.op_buf.actualcount)
- {
- m_out_bm_count = 0;
- bRet = true;
+ if (j == drv_ctx.op_buf.actualcount) {
+ m_out_bm_count = 0;
+ bRet = true;
+ }
+ } else {
+ m_out_bm_count = 0;
+ bRet = true;
}
- }
- else
- {
- m_out_bm_count = 0;
- bRet = true;
- }
- return bRet;
+ return bRet;
}
/* ======================================================================
-FUNCTION
- omx_vdec::ReleaseInputDone
+ FUNCTION
+ omx_vdec::ReleaseInputDone
-DESCRIPTION
- Checks if IL client has released all the buffers.
+ DESCRIPTION
+ Checks if IL client has released all the buffers.
-PARAMETERS
- None.
+ PARAMETERS
+ None.
-RETURN VALUE
- true/false
+ RETURN VALUE
+ true/false
-========================================================================== */
+ ========================================================================== */
bool omx_vdec::release_input_done(void)
{
- bool bRet = false;
- unsigned i=0,j=0;
+ bool bRet = false;
+ unsigned i=0,j=0;
- DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
- if(m_inp_mem_ptr)
- {
- for(;j<drv_ctx.ip_buf.actualcount;j++)
- {
- if( BITMASK_PRESENT(&m_inp_bm_count,j))
- {
- break;
+ DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
+ if (m_inp_mem_ptr) {
+ for (; j<drv_ctx.ip_buf.actualcount; j++) {
+ if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
+ break;
+ }
}
- }
- if(j==drv_ctx.ip_buf.actualcount)
- {
- bRet = true;
+ if (j==drv_ctx.ip_buf.actualcount) {
+ bRet = true;
+ }
+ } else {
+ bRet = true;
}
- }
- else
- {
- bRet = true;
- }
- return bRet;
+ return bRet;
}
OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
- OMX_BUFFERHEADERTYPE * buffer)
+ OMX_BUFFERHEADERTYPE * buffer)
{
- OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
- if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
- {
- DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
- return OMX_ErrorBadParameter;
- }
- else if (output_flush_progress)
- {
- DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
- buffer->nFilledLen = 0;
- buffer->nTimeStamp = 0;
- buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
- buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
- buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
- }
-
- if (m_debug_extradata)
- {
- if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
- {
- DEBUG_PRINT_HIGH("\n");
- DEBUG_PRINT_HIGH("***************************************************\n");
- DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
- DEBUG_PRINT_HIGH("***************************************************\n");
+ OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
+ if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) {
+ DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
+ return OMX_ErrorBadParameter;
+ } else if (output_flush_progress) {
+ DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
+ buffer->nFilledLen = 0;
+ buffer->nTimeStamp = 0;
+ buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+ buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+ buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
}
- if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
- {
- DEBUG_PRINT_HIGH("\n");
- DEBUG_PRINT_HIGH("***************************************************\n");
- DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
- DEBUG_PRINT_HIGH("***************************************************\n");
+ if (m_debug_extradata) {
+ if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
+ DEBUG_PRINT_HIGH("\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
+ DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
+ }
+
+ if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) {
+ DEBUG_PRINT_HIGH("\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
+ DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
+ }
}
- }
- DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
- buffer, buffer->pBuffer);
- pending_output_buffers --;
-
- if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
- {
- DEBUG_PRINT_HIGH("\n Output EOS has been reached");
- if (!output_flush_progress)
- post_event((unsigned)NULL, (unsigned)NULL,
- OMX_COMPONENT_GENERATE_EOS_DONE);
+ DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
+ buffer, buffer->pBuffer);
+ pending_output_buffers --;
- if (psource_frame)
- {
- m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
- psource_frame = NULL;
+ if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+ DEBUG_PRINT_HIGH("\n Output EOS has been reached");
+ if (!output_flush_progress)
+ post_event((unsigned)NULL, (unsigned)NULL,
+ OMX_COMPONENT_GENERATE_EOS_DONE);
+
+ if (psource_frame) {
+ m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
+ psource_frame = NULL;
+ }
+ if (pdest_frame) {
+ pdest_frame->nFilledLen = 0;
+ m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
+ (unsigned)NULL);
+ pdest_frame = NULL;
+ }
}
- if (pdest_frame)
- {
- pdest_frame->nFilledLen = 0;
- m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
- (unsigned)NULL);
- pdest_frame = NULL;
- }
- }
- DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
+ DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
#ifdef OUTPUT_BUFFER_LOG
- if (outputBufferFile1 && buffer->nFilledLen)
- {
- int buf_index = buffer - m_out_mem_ptr;
- int stride = drv_ctx.video_resolution.stride;
- int scanlines = drv_ctx.video_resolution.scan_lines;
- char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
- unsigned i;
- int bytes_written = 0;
- for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
- bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
- temp += stride;
- }
- temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
- int stride_c = stride;
- for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
- bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
- temp += stride_c;
- }
- }
+ if (outputBufferFile1 && buffer->nFilledLen) {
+ int buf_index = buffer - m_out_mem_ptr;
+ int stride = drv_ctx.video_resolution.stride;
+ int scanlines = drv_ctx.video_resolution.scan_lines;
+ char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
+ unsigned i;
+ int bytes_written = 0;
+ for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
+ bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
+ temp += stride;
+ }
+ temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
+ int stride_c = stride;
+ for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
+ bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
+ temp += stride_c;
+ }
+ }
#endif
- /* For use buffer we need to copy the data */
- if (!output_flush_progress)
- {
- /* This is the error check for non-recoverable errros */
- bool is_duplicate_ts_valid = true;
- bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive);
+ /* For use buffer we need to copy the data */
+ if (!output_flush_progress) {
+ /* This is the error check for non-recoverable errros */
+ bool is_duplicate_ts_valid = true;
+ bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive);
- if (output_capability == V4L2_PIX_FMT_MPEG4 ||
- output_capability == V4L2_PIX_FMT_MPEG2 ||
- output_capability == V4L2_PIX_FMT_DIVX ||
- output_capability == V4L2_PIX_FMT_DIVX_311)
- is_duplicate_ts_valid = false;
+ if (output_capability == V4L2_PIX_FMT_MPEG4 ||
+ output_capability == V4L2_PIX_FMT_MPEG2 ||
+ output_capability == V4L2_PIX_FMT_DIVX ||
+ output_capability == V4L2_PIX_FMT_DIVX_311)
+ is_duplicate_ts_valid = false;
- if (output_capability == V4L2_PIX_FMT_H264 && is_interlaced) {
- bool mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
- if (mbaff) {
- is_interlaced = false;
- }
- }
-
- if (buffer->nFilledLen > 0) {
- time_stamp_dts.get_next_timestamp(buffer,
- is_interlaced && is_duplicate_ts_valid);
- if (m_debug_timestamp)
- {
- {
- OMX_TICKS expected_ts = 0;
- m_timestamp_list.pop_min_ts(expected_ts);
- if (is_interlaced && is_duplicate_ts_valid) {
- m_timestamp_list.pop_min_ts(expected_ts);
+ if (output_capability == V4L2_PIX_FMT_H264 && is_interlaced) {
+ bool mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
+ if (mbaff) {
+ is_interlaced = false;
}
- DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
- buffer->nTimeStamp, expected_ts);
+ }
- if (buffer->nTimeStamp != expected_ts) {
- DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
+ if (buffer->nFilledLen > 0) {
+ time_stamp_dts.get_next_timestamp(buffer,
+ is_interlaced && is_duplicate_ts_valid);
+ if (m_debug_timestamp) {
+ {
+ OMX_TICKS expected_ts = 0;
+ m_timestamp_list.pop_min_ts(expected_ts);
+ if (is_interlaced && is_duplicate_ts_valid) {
+ m_timestamp_list.pop_min_ts(expected_ts);
+ }
+ DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
+ buffer->nTimeStamp, expected_ts);
+
+ if (buffer->nTimeStamp != expected_ts) {
+ DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
+ }
+ }
}
- }
+ } else {
+ m_inp_err_count++;
+ time_stamp_dts.remove_time_stamp(
+ buffer->nTimeStamp,
+ is_interlaced && is_duplicate_ts_valid);
}
- } else {
- m_inp_err_count++;
- time_stamp_dts.remove_time_stamp(
- buffer->nTimeStamp,
- is_interlaced && is_duplicate_ts_valid);
+
+
}
-
-
- }
- if (m_cb.FillBufferDone)
- {
- if (buffer->nFilledLen > 0)
- {
- handle_extradata(buffer);
- if (client_extradata & OMX_TIMEINFO_EXTRADATA)
- set_frame_rate(buffer->nTimeStamp);
- else if (arbitrary_bytes)
- adjust_timestamp(buffer->nTimeStamp);
- if (perf_flag)
- {
- if (!proc_frms)
- {
- dec_time.stop();
- latency = dec_time.processing_time_us() - latency;
- DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
- dec_time.start();
- fps_metrics.start();
- }
- proc_frms++;
- if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
- {
- OMX_U64 proc_time = 0;
- fps_metrics.stop();
- proc_time = fps_metrics.processing_time_us();
- DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
+ if (m_cb.FillBufferDone) {
+ if (buffer->nFilledLen > 0) {
+ handle_extradata(buffer);
+ if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+ set_frame_rate(buffer->nTimeStamp);
+ else if (arbitrary_bytes)
+ adjust_timestamp(buffer->nTimeStamp);
+ if (perf_flag) {
+ if (!proc_frms) {
+ dec_time.stop();
+ latency = dec_time.processing_time_us() - latency;
+ DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
+ dec_time.start();
+ fps_metrics.start();
+ }
+ proc_frms++;
+ if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+ OMX_U64 proc_time = 0;
+ fps_metrics.stop();
+ proc_time = fps_metrics.processing_time_us();
+ DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
proc_frms, (float)proc_time / 1e6,
(float)(1e6 * proc_frms) / proc_time);
- proc_frms = 0;
- }
- }
+ proc_frms = 0;
+ }
+ }
#ifdef OUTPUT_EXTRADATA_LOG
- if (outputExtradataFile)
- {
+ if (outputExtradataFile) {
- OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
- p_extra = (OMX_OTHER_EXTRADATATYPE *)
- ((unsigned)(buffer->pBuffer + buffer->nOffset +
- buffer->nFilledLen + 3)&(~3));
- while(p_extra &&
- (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) )
- {
- DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
- fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
- if (p_extra->eType == OMX_ExtraDataNone)
- {
- break;
- }
- p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
- }
- }
+ OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
+ p_extra = (OMX_OTHER_EXTRADATATYPE *)
+ ((unsigned)(buffer->pBuffer + buffer->nOffset +
+ buffer->nFilledLen + 3)&(~3));
+ while (p_extra &&
+ (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) {
+ DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
+ fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
+ if (p_extra->eType == OMX_ExtraDataNone) {
+ break;
+ }
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ }
+ }
#endif
- }
- if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
- prev_ts = LLONG_MAX;
- rst_prev_ts = true;
- }
+ }
+ if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
+ prev_ts = LLONG_MAX;
+ rst_prev_ts = true;
+ }
- pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
- ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
- buffer->pPlatformPrivate)->entryList->entry;
- DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd);
+ pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+ ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
+ buffer->pPlatformPrivate)->entryList->entry;
+ DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd);
#ifdef _ANDROID_ICS_
- if (m_enable_android_native_buffers)
- {
- if (native_buffer[buffer - m_out_mem_ptr].inuse) {
- if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
- DEBUG_PRINT_ERROR("Unlocking genlock failed");
- return OMX_ErrorInsufficientResources;
- }
- else {
- native_buffer[buffer - m_out_mem_ptr].inuse = false;
- }
- }
- }
+ if (m_enable_android_native_buffers) {
+ if (native_buffer[buffer - m_out_mem_ptr].inuse) {
+ if (GENLOCK_NO_ERROR != genlock_unlock_buffer(native_buffer[buffer - m_out_mem_ptr].nativehandle)) {
+ DEBUG_PRINT_ERROR("Unlocking genlock failed");
+ return OMX_ErrorInsufficientResources;
+ } else {
+ native_buffer[buffer - m_out_mem_ptr].inuse = false;
+ }
+ }
+ }
#endif
- OMX_BUFFERHEADERTYPE *il_buffer;
- il_buffer = client_buffers.get_il_buf_hdr(buffer);
- if (il_buffer)
- m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
- else {
- DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
- return OMX_ErrorBadParameter;
+ OMX_BUFFERHEADERTYPE *il_buffer;
+ il_buffer = client_buffers.get_il_buf_hdr(buffer);
+ if (il_buffer)
+ m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
+ else {
+ DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
+ return OMX_ErrorBadParameter;
+ }
+ DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
+ } else {
+ return OMX_ErrorBadParameter;
}
- DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
- }
- else
- {
- return OMX_ErrorBadParameter;
- }
- return OMX_ErrorNone;
+ return OMX_ErrorNone;
}
OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp,
- OMX_BUFFERHEADERTYPE* buffer)
+ OMX_BUFFERHEADERTYPE* buffer)
{
- if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount))
- {
+ if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) {
DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
- return OMX_ErrorBadParameter;
+ return OMX_ErrorBadParameter;
}
DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
- buffer, buffer->pBuffer);
+ buffer, buffer->pBuffer);
pending_input_buffers--;
- if (arbitrary_bytes)
- {
- if (pdest_frame == NULL && input_flush_progress == false)
- {
- DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
- pdest_frame = buffer;
- buffer->nFilledLen = 0;
- buffer->nTimeStamp = LLONG_MAX;
- push_input_buffer (hComp);
- }
- else
- {
- DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
- buffer->nFilledLen = 0;
- if (!m_input_free_q.insert_entry((unsigned)buffer,
- (unsigned)NULL, (unsigned)NULL))
- {
- DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
+ if (arbitrary_bytes) {
+ if (pdest_frame == NULL && input_flush_progress == false) {
+ DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
+ pdest_frame = buffer;
+ buffer->nFilledLen = 0;
+ buffer->nTimeStamp = LLONG_MAX;
+ push_input_buffer (hComp);
+ } else {
+ DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
+ buffer->nFilledLen = 0;
+ if (!m_input_free_q.insert_entry((unsigned)buffer,
+ (unsigned)NULL, (unsigned)NULL)) {
+ DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
+ }
}
- }
- }
- else if(m_cb.EmptyBufferDone)
- {
+ } else if (m_cb.EmptyBufferDone) {
buffer->nFilledLen = 0;
- if (input_use_buffer == true){
+ if (input_use_buffer == true) {
buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
}
m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
@@ -7154,743 +6351,641 @@
int omx_vdec::async_message_process (void *context, void* message)
{
- omx_vdec* omx = NULL;
- struct vdec_msginfo *vdec_msg = NULL;
- OMX_BUFFERHEADERTYPE* omxhdr = NULL;
- struct v4l2_buffer *v4l2_buf_ptr = NULL;
- struct vdec_output_frameinfo *output_respbuf = NULL;
- int rc=1;
- if (context == NULL || message == NULL)
- {
- DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
- return -1;
- }
- vdec_msg = (struct vdec_msginfo *)message;
-
- omx = reinterpret_cast<omx_vdec*>(context);
-
- switch (vdec_msg->msgcode)
- {
-
- case VDEC_MSG_EVT_HW_ERROR:
- omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
- OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
- break;
-
- case VDEC_MSG_RESP_START_DONE:
- omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
- OMX_COMPONENT_GENERATE_START_DONE);
- break;
-
- case VDEC_MSG_RESP_STOP_DONE:
- omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
- OMX_COMPONENT_GENERATE_STOP_DONE);
- break;
-
- case VDEC_MSG_RESP_RESUME_DONE:
- omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
- OMX_COMPONENT_GENERATE_RESUME_DONE);
- break;
-
- case VDEC_MSG_RESP_PAUSE_DONE:
- omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
- OMX_COMPONENT_GENERATE_PAUSE_DONE);
- break;
-
- case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
- omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
- OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
- break;
- case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
- omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
- OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
- break;
- case VDEC_MSG_RESP_INPUT_FLUSHED:
- case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
-
- /* omxhdr = (OMX_BUFFERHEADERTYPE* )
- vdec_msg->msgdata.input_frame_clientdata; */
-
- v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
- omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
- if (omxhdr == NULL ||
- ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
- {
- omxhdr = NULL;
- vdec_msg->status_code = VDEC_S_EFATAL;
+ omx_vdec* omx = NULL;
+ struct vdec_msginfo *vdec_msg = NULL;
+ OMX_BUFFERHEADERTYPE* omxhdr = NULL;
+ struct v4l2_buffer *v4l2_buf_ptr = NULL;
+ struct vdec_output_frameinfo *output_respbuf = NULL;
+ int rc=1;
+ if (context == NULL || message == NULL) {
+ DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
+ return -1;
}
- if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED)
- {
- DEBUG_PRINT_HIGH("Unsupported input");
- omx->omx_report_error ();
- }
- if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT)
- {
- vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
- }
- omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
- OMX_COMPONENT_GENERATE_EBD);
- break;
- case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
- int64_t *timestamp;
- timestamp = (int64_t *) malloc(sizeof(int64_t));
- if (timestamp) {
- *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
- omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
- OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
- DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
- vdec_msg->msgdata.output_frame.time_stamp);
- }
- break;
- case VDEC_MSG_RESP_OUTPUT_FLUSHED:
- case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
+ vdec_msg = (struct vdec_msginfo *)message;
- v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
- omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
- DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
- omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
- vdec_msg->msgdata.output_frame.pic_type);
-
- if (omxhdr && omxhdr->pOutputPortPrivate &&
- ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
- (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
- - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount))
- {
- if ( vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen)
- {
- omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
- omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
- omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
- omxhdr->nFlags = 0;
-
- if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS)
- {
- omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
- //rc = -1;
- }
- if (omxhdr->nFilledLen)
- {
- omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
- }
- if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME)
- {
- omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
- }
- else
- {
- omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
- }
- if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ)
- {
- omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
- }
- if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY)
- {
- omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
- }
- if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
- !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
- !(v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS))
- {
- omx->post_event ((unsigned)NULL,(unsigned int)omxhdr,
- OMX_COMPONENT_GENERATE_FTB);
- break;
- }
- if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT)
- {
- omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
- }
- vdec_msg->msgdata.output_frame.bufferaddr =
- omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
- int format_notably_changed = 0;
- if (omxhdr->nFilledLen &&
- (omxhdr->nFilledLen != omx->prev_n_filled_len))
- {
- if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
- (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
- DEBUG_PRINT_HIGH("\n Height/Width information has changed\n");
- omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
- omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
- format_notably_changed = 1;
- }
- }
- if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
- vdec_msg->msgdata.output_frame.framesize.left)
- || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
- || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
- || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
- if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
- (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
- omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
- omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
- DEBUG_PRINT_HIGH("\n Height/Width information has changed. W: %d --> %d, H: %d --> %d\n",
- omx->drv_ctx.video_resolution.frame_width, vdec_msg->msgdata.output_frame.framesize.right,
- omx->drv_ctx.video_resolution.frame_height, vdec_msg->msgdata.output_frame.framesize.bottom);
- }
- DEBUG_PRINT_HIGH("\n Crop information changed. W: %d --> %d, H: %d -> %d\n",
- omx->rectangle.nWidth, vdec_msg->msgdata.output_frame.framesize.right,
- omx->rectangle.nHeight, vdec_msg->msgdata.output_frame.framesize.bottom);
- omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
- omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
- omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
- omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
- format_notably_changed = 1;
- }
- if (format_notably_changed) {
- if(omx->is_video_session_supported()) {
- omx->post_event (NULL, vdec_msg->status_code,
- OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING);
- } else {
- if (!omx->client_buffers.update_buffer_req()) {
- DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
- }
- omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
- OMX_COMPONENT_GENERATE_PORT_RECONFIG);
- }
- }
- if (omxhdr->nFilledLen)
- omx->prev_n_filled_len = omxhdr->nFilledLen;
+ omx = reinterpret_cast<omx_vdec*>(context);
- output_respbuf = (struct vdec_output_frameinfo *)\
- omxhdr->pOutputPortPrivate;
- output_respbuf->len = vdec_msg->msgdata.output_frame.len;
- output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
- if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME)
- {
- output_respbuf->pic_type = PICTURE_TYPE_I;
- }
- if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME)
- {
- output_respbuf->pic_type = PICTURE_TYPE_P;
- }
- if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
- output_respbuf->pic_type = PICTURE_TYPE_B;
- }
+ switch (vdec_msg->msgcode) {
- if (omx->output_use_buffer)
- memcpy ( omxhdr->pBuffer, (void *)
- ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
- (unsigned long)vdec_msg->msgdata.output_frame.offset),
- vdec_msg->msgdata.output_frame.len);
- }
- else
- omxhdr->nFilledLen = 0;
- omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
- OMX_COMPONENT_GENERATE_FBD);
+ case VDEC_MSG_EVT_HW_ERROR:
+ omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
+ break;
+
+ case VDEC_MSG_RESP_START_DONE:
+ omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_START_DONE);
+ break;
+
+ case VDEC_MSG_RESP_STOP_DONE:
+ omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_STOP_DONE);
+ break;
+
+ case VDEC_MSG_RESP_RESUME_DONE:
+ omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_RESUME_DONE);
+ break;
+
+ case VDEC_MSG_RESP_PAUSE_DONE:
+ omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_PAUSE_DONE);
+ break;
+
+ case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
+ omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
+ break;
+ case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
+ omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
+ break;
+ case VDEC_MSG_RESP_INPUT_FLUSHED:
+ case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
+
+ /* omxhdr = (OMX_BUFFERHEADERTYPE* )
+ vdec_msg->msgdata.input_frame_clientdata; */
+
+ v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
+ omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
+ if (omxhdr == NULL ||
+ ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) {
+ omxhdr = NULL;
+ vdec_msg->status_code = VDEC_S_EFATAL;
+ }
+ if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) {
+ DEBUG_PRINT_HIGH("Unsupported input");
+ omx->omx_report_error ();
+ }
+ if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
+ vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
+ }
+ omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_EBD);
+ break;
+ case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
+ int64_t *timestamp;
+ timestamp = (int64_t *) malloc(sizeof(int64_t));
+ if (timestamp) {
+ *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
+ omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
+ DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
+ vdec_msg->msgdata.output_frame.time_stamp);
+ }
+ break;
+ case VDEC_MSG_RESP_OUTPUT_FLUSHED:
+ case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
+
+ v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
+ omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
+ DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
+ omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
+ vdec_msg->msgdata.output_frame.pic_type);
+
+ if (omxhdr && omxhdr->pOutputPortPrivate &&
+ ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
+ (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
+ - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) {
+ if ( vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) {
+ omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
+ omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
+ omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
+ omxhdr->nFlags = 0;
+
+ if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS) {
+ omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
+ //rc = -1;
+ }
+ if (omxhdr->nFilledLen) {
+ omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
+ }
+ if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
+ omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
+ } else {
+ omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
+ }
+ if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
+ omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+ }
+ if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) {
+ omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
+ }
+ if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
+ !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
+ !(v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS)) {
+ omx->post_event ((unsigned)NULL,(unsigned int)omxhdr,
+ OMX_COMPONENT_GENERATE_FTB);
+ break;
+ }
+ if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
+ omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
+ }
+ vdec_msg->msgdata.output_frame.bufferaddr =
+ omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
+ int format_notably_changed = 0;
+ if (omxhdr->nFilledLen &&
+ (omxhdr->nFilledLen != omx->prev_n_filled_len)) {
+ if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
+ (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
+ DEBUG_PRINT_HIGH("\n Height/Width information has changed\n");
+ omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
+ omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
+ format_notably_changed = 1;
+ }
+ }
+ if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
+ vdec_msg->msgdata.output_frame.framesize.left)
+ || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
+ || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
+ || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
+ if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
+ (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
+ omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
+ omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
+ DEBUG_PRINT_HIGH("\n Height/Width information has changed. W: %d --> %d, H: %d --> %d\n",
+ omx->drv_ctx.video_resolution.frame_width, vdec_msg->msgdata.output_frame.framesize.right,
+ omx->drv_ctx.video_resolution.frame_height, vdec_msg->msgdata.output_frame.framesize.bottom);
+ }
+ DEBUG_PRINT_HIGH("\n Crop information changed. W: %d --> %d, H: %d -> %d\n",
+ omx->rectangle.nWidth, vdec_msg->msgdata.output_frame.framesize.right,
+ omx->rectangle.nHeight, vdec_msg->msgdata.output_frame.framesize.bottom);
+ omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
+ omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
+ omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
+ omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
+ format_notably_changed = 1;
+ }
+ if (format_notably_changed) {
+ if (omx->is_video_session_supported()) {
+ omx->post_event (NULL, vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING);
+ } else {
+ if (!omx->client_buffers.update_buffer_req()) {
+ DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
+ }
+ omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
+ OMX_COMPONENT_GENERATE_PORT_RECONFIG);
+ }
+ }
+ if (omxhdr->nFilledLen)
+ omx->prev_n_filled_len = omxhdr->nFilledLen;
+
+ output_respbuf = (struct vdec_output_frameinfo *)\
+ omxhdr->pOutputPortPrivate;
+ output_respbuf->len = vdec_msg->msgdata.output_frame.len;
+ output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
+ if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
+ output_respbuf->pic_type = PICTURE_TYPE_I;
+ }
+ if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
+ output_respbuf->pic_type = PICTURE_TYPE_P;
+ }
+ if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
+ output_respbuf->pic_type = PICTURE_TYPE_B;
+ }
+
+ if (omx->output_use_buffer)
+ memcpy ( omxhdr->pBuffer, (void *)
+ ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
+ (unsigned long)vdec_msg->msgdata.output_frame.offset),
+ vdec_msg->msgdata.output_frame.len);
+ } else
+ omxhdr->nFilledLen = 0;
+ omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_FBD);
+ } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
+ omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_EOS_DONE);
+ else
+ omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
+ break;
+ case VDEC_MSG_EVT_CONFIG_CHANGED:
+ DEBUG_PRINT_HIGH("\n Port settings changed");
+ omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
+ OMX_COMPONENT_GENERATE_PORT_RECONFIG);
+ break;
+ default:
+ break;
}
- else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
- omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
- OMX_COMPONENT_GENERATE_EOS_DONE);
- else
- omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
- OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
- break;
- case VDEC_MSG_EVT_CONFIG_CHANGED:
- DEBUG_PRINT_HIGH("\n Port settings changed");
- omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
- OMX_COMPONENT_GENERATE_PORT_RECONFIG);
- break;
- default:
- break;
- }
- return rc;
+ return rc;
}
OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
- OMX_HANDLETYPE hComp,
- OMX_BUFFERHEADERTYPE *buffer
- )
+ OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE *buffer
+ )
{
- unsigned address,p2,id;
- DEBUG_PRINT_LOW("\n Empty this arbitrary");
+ unsigned address,p2,id;
+ DEBUG_PRINT_LOW("\n Empty this arbitrary");
- if (buffer == NULL)
- {
- return OMX_ErrorBadParameter;
- }
- DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
- DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %lu, flags %lu, timestamp %lld",
- buffer->nFilledLen, buffer->nFlags, buffer->nTimeStamp);
-
- /* return zero length and not an EOS buffer */
- /* return buffer if input flush in progress */
- if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
- ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
- {
- DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
- m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
- return OMX_ErrorNone;
- }
-
- if (psource_frame == NULL)
- {
- DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
- psource_frame = buffer;
- DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
- push_input_buffer (hComp);
- }
- else
- {
- DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
- if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
- (unsigned)NULL))
- {
- return OMX_ErrorBadParameter;
+ if (buffer == NULL) {
+ return OMX_ErrorBadParameter;
}
- }
+ DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+ DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %lu, flags %lu, timestamp %lld",
+ buffer->nFilledLen, buffer->nFlags, buffer->nTimeStamp);
+
+ /* return zero length and not an EOS buffer */
+ /* return buffer if input flush in progress */
+ if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
+ ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
+ DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
+ m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
+ return OMX_ErrorNone;
+ }
+
+ if (psource_frame == NULL) {
+ DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
+ psource_frame = buffer;
+ DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
+ push_input_buffer (hComp);
+ } else {
+ DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
+ if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
+ (unsigned)NULL)) {
+ return OMX_ErrorBadParameter;
+ }
+ }
- return OMX_ErrorNone;
+ return OMX_ErrorNone;
}
OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
{
- unsigned address,p2,id;
- OMX_ERRORTYPE ret = OMX_ErrorNone;
+ unsigned address,p2,id;
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
- if (pdest_frame == NULL || psource_frame == NULL)
- {
- /*Check if we have a destination buffer*/
- if (pdest_frame == NULL)
- {
- DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
- if (m_input_free_q.m_size)
- {
- m_input_free_q.pop_entry(&address,&p2,&id);
- pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
- pdest_frame->nFilledLen = 0;
- pdest_frame->nTimeStamp = LLONG_MAX;
- DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
- }
+ if (pdest_frame == NULL || psource_frame == NULL) {
+ /*Check if we have a destination buffer*/
+ if (pdest_frame == NULL) {
+ DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
+ if (m_input_free_q.m_size) {
+ m_input_free_q.pop_entry(&address,&p2,&id);
+ pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
+ pdest_frame->nFilledLen = 0;
+ pdest_frame->nTimeStamp = LLONG_MAX;
+ DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
+ }
+ }
+
+ /*Check if we have a destination buffer*/
+ if (psource_frame == NULL) {
+ DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
+ if (m_input_pending_q.m_size) {
+ m_input_pending_q.pop_entry(&address,&p2,&id);
+ psource_frame = (OMX_BUFFERHEADERTYPE *)address;
+ DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %lld",psource_frame,
+ psource_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Next source Buffer flag %lu length %lu",
+ psource_frame->nFlags,psource_frame->nFilledLen);
+
+ }
+ }
+
}
- /*Check if we have a destination buffer*/
- if (psource_frame == NULL)
- {
- DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
- if (m_input_pending_q.m_size)
- {
- m_input_pending_q.pop_entry(&address,&p2,&id);
- psource_frame = (OMX_BUFFERHEADERTYPE *)address;
- DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %lld",psource_frame,
- psource_frame->nTimeStamp);
- DEBUG_PRINT_LOW("\n Next source Buffer flag %lu length %lu",
- psource_frame->nFlags,psource_frame->nFilledLen);
-
- }
+ while ((pdest_frame != NULL) && (psource_frame != NULL)) {
+ switch (codec_type_parse) {
+ case CODEC_TYPE_MPEG4:
+ case CODEC_TYPE_H263:
+ case CODEC_TYPE_MPEG2:
+ ret = push_input_sc_codec(hComp);
+ break;
+ case CODEC_TYPE_H264:
+ ret = push_input_h264(hComp);
+ break;
+ case CODEC_TYPE_VC1:
+ ret = push_input_vc1(hComp);
+ break;
+ default:
+ break;
+ }
+ if (ret != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
+ omx_report_error ();
+ break;
+ }
}
- }
-
- while ((pdest_frame != NULL) && (psource_frame != NULL))
- {
- switch (codec_type_parse)
- {
- case CODEC_TYPE_MPEG4:
- case CODEC_TYPE_H263:
- case CODEC_TYPE_MPEG2:
- ret = push_input_sc_codec(hComp);
- break;
- case CODEC_TYPE_H264:
- ret = push_input_h264(hComp);
- break;
- case CODEC_TYPE_VC1:
- ret = push_input_vc1(hComp);
- break;
- default:
- break;
- }
- if (ret != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
- omx_report_error ();
- break;
- }
- }
-
- return ret;
+ return ret;
}
OMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
{
- OMX_U32 partial_frame = 1;
- OMX_BOOL generate_ebd = OMX_TRUE;
- unsigned address = 0, p2 = 0, id = 0;
+ OMX_U32 partial_frame = 1;
+ OMX_BOOL generate_ebd = OMX_TRUE;
+ unsigned address = 0, p2 = 0, id = 0;
- DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %lld",
- psource_frame,psource_frame->nTimeStamp);
- if (m_frame_parser.parse_sc_frame(psource_frame,
- pdest_frame,&partial_frame) == -1)
- {
- DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
- return OMX_ErrorBadParameter;
- }
-
- if (partial_frame == 0)
- {
- DEBUG_PRINT_LOW("\n Frame size %lu source %p frame count %d",
- pdest_frame->nFilledLen,psource_frame,frame_count);
-
-
- DEBUG_PRINT_LOW("\n TimeStamp updated %lld", pdest_frame->nTimeStamp);
- /*First Parsed buffer will have only header Hence skip*/
- if (frame_count == 0)
- {
- DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
-
- if(codec_type_parse == CODEC_TYPE_MPEG4 ||
- codec_type_parse == CODEC_TYPE_DIVX) {
- mp4StreamType psBits;
- psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
- psBits.numBytes = pdest_frame->nFilledLen;
- mp4_headerparser.parseHeader(&psBits);
- }
-
- frame_count++;
+ DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %lld",
+ psource_frame,psource_frame->nTimeStamp);
+ if (m_frame_parser.parse_sc_frame(psource_frame,
+ pdest_frame,&partial_frame) == -1) {
+ DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
+ return OMX_ErrorBadParameter;
}
- else
- {
- pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
- if(pdest_frame->nFilledLen)
- {
- /*Push the frame to the Decoder*/
- if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
- {
- return OMX_ErrorBadParameter;
+
+ if (partial_frame == 0) {
+ DEBUG_PRINT_LOW("\n Frame size %lu source %p frame count %d",
+ pdest_frame->nFilledLen,psource_frame,frame_count);
+
+
+ DEBUG_PRINT_LOW("\n TimeStamp updated %lld", pdest_frame->nTimeStamp);
+ /*First Parsed buffer will have only header Hence skip*/
+ if (frame_count == 0) {
+ DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
+
+ if (codec_type_parse == CODEC_TYPE_MPEG4 ||
+ codec_type_parse == CODEC_TYPE_DIVX) {
+ mp4StreamType psBits;
+ psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
+ psBits.numBytes = pdest_frame->nFilledLen;
+ mp4_headerparser.parseHeader(&psBits);
+ }
+
+ frame_count++;
+ } else {
+ pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
+ if (pdest_frame->nFilledLen) {
+ /*Push the frame to the Decoder*/
+ if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+ return OMX_ErrorBadParameter;
+ }
+ frame_count++;
+ pdest_frame = NULL;
+
+ if (m_input_free_q.m_size) {
+ m_input_free_q.pop_entry(&address,&p2,&id);
+ pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
+ pdest_frame->nFilledLen = 0;
+ }
+ } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
+ DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
+ m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
+ (unsigned)NULL);
+ pdest_frame = NULL;
+ }
}
- frame_count++;
- pdest_frame = NULL;
-
- if (m_input_free_q.m_size)
- {
- m_input_free_q.pop_entry(&address,&p2,&id);
- pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
- pdest_frame->nFilledLen = 0;
+ } else {
+ DEBUG_PRINT_LOW("\n Not a Complete Frame %lu",pdest_frame->nFilledLen);
+ /*Check if Destination Buffer is full*/
+ if (pdest_frame->nAllocLen ==
+ pdest_frame->nFilledLen + pdest_frame->nOffset) {
+ DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
+ return OMX_ErrorStreamCorrupt;
}
- }
- else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
- {
- DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
- m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
- (unsigned)NULL);
- pdest_frame = NULL;
- }
}
- }
- else
- {
- DEBUG_PRINT_LOW("\n Not a Complete Frame %lu",pdest_frame->nFilledLen);
- /*Check if Destination Buffer is full*/
- if (pdest_frame->nAllocLen ==
- pdest_frame->nFilledLen + pdest_frame->nOffset)
- {
- DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
- return OMX_ErrorStreamCorrupt;
- }
- }
- if (psource_frame->nFilledLen == 0)
- {
- if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
- {
- if (pdest_frame)
- {
- pdest_frame->nFlags |= psource_frame->nFlags;
- DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%lu TimeStamp = %lld",
- pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
- DEBUG_PRINT_LOW("\n Found a frame size = %lu number = %d",
- pdest_frame->nFilledLen,frame_count++);
- /*Push the frame to the Decoder*/
- if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
- {
- return OMX_ErrorBadParameter;
+ if (psource_frame->nFilledLen == 0) {
+ if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
+ if (pdest_frame) {
+ pdest_frame->nFlags |= psource_frame->nFlags;
+ DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%lu TimeStamp = %lld",
+ pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Found a frame size = %lu number = %d",
+ pdest_frame->nFilledLen,frame_count++);
+ /*Push the frame to the Decoder*/
+ if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+ return OMX_ErrorBadParameter;
+ }
+ frame_count++;
+ pdest_frame = NULL;
+ } else {
+ DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
+ generate_ebd = OMX_FALSE;
+ }
}
- frame_count++;
- pdest_frame = NULL;
- }
- else
- {
- DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
- generate_ebd = OMX_FALSE;
- }
- }
- if(generate_ebd)
- {
- DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
- m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
- psource_frame = NULL;
+ if (generate_ebd) {
+ DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
+ m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
+ psource_frame = NULL;
- if (m_input_pending_q.m_size)
- {
- DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
- m_input_pending_q.pop_entry(&address,&p2,&id);
- psource_frame = (OMX_BUFFERHEADERTYPE *) address;
- DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %lld",psource_frame,
- psource_frame->nTimeStamp);
- DEBUG_PRINT_LOW("\n Next source Buffer flag %lu length %lu",
- psource_frame->nFlags,psource_frame->nFilledLen);
- }
+ if (m_input_pending_q.m_size) {
+ DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
+ m_input_pending_q.pop_entry(&address,&p2,&id);
+ psource_frame = (OMX_BUFFERHEADERTYPE *) address;
+ DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %lld",psource_frame,
+ psource_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Next source Buffer flag %lu length %lu",
+ psource_frame->nFlags,psource_frame->nFilledLen);
+ }
+ }
}
- }
- return OMX_ErrorNone;
+ return OMX_ErrorNone;
}
OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
{
- OMX_U32 partial_frame = 1;
- unsigned address = 0, p2 = 0, id = 0;
- OMX_BOOL isNewFrame = OMX_FALSE;
- OMX_BOOL generate_ebd = OMX_TRUE;
+ OMX_U32 partial_frame = 1;
+ unsigned address = 0, p2 = 0, id = 0;
+ OMX_BOOL isNewFrame = OMX_FALSE;
+ OMX_BOOL generate_ebd = OMX_TRUE;
- if (h264_scratch.pBuffer == NULL)
- {
- DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
- return OMX_ErrorBadParameter;
- }
- DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %lu "
- "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
- DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
- if (h264_scratch.nFilledLen && look_ahead_nal)
- {
- look_ahead_nal = false;
- if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
- h264_scratch.nFilledLen)
- {
- memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
- h264_scratch.pBuffer,h264_scratch.nFilledLen);
- pdest_frame->nFilledLen += h264_scratch.nFilledLen;
- DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
- h264_scratch.nFilledLen = 0;
+ if (h264_scratch.pBuffer == NULL) {
+ DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
+ return OMX_ErrorBadParameter;
}
- else
- {
- DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
- return OMX_ErrorBadParameter;
- }
- }
- if (nal_length == 0)
- {
- DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
- if (m_frame_parser.parse_sc_frame(psource_frame,
- &h264_scratch,&partial_frame) == -1)
- {
- DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
- return OMX_ErrorBadParameter;
- }
- }
- else
- {
- DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
- if (m_frame_parser.parse_h264_nallength(psource_frame,
- &h264_scratch,&partial_frame) == -1)
- {
- DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
- return OMX_ErrorBadParameter;
- }
- }
-
- if (partial_frame == 0)
- {
- if (nal_count == 0 && h264_scratch.nFilledLen == 0)
- {
- DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
- nal_count++;
- h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
- h264_scratch.nFlags = psource_frame->nFlags;
- }
- else
- {
- DEBUG_PRINT_LOW("\n Parsed New NAL Length = %lu",h264_scratch.nFilledLen);
- if(h264_scratch.nFilledLen)
- {
- h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
- NALU_TYPE_SPS);
-#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
- if (client_extradata & OMX_TIMEINFO_EXTRADATA)
- h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
- h264_scratch.nFilledLen, NALU_TYPE_SEI);
- else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
- // If timeinfo is present frame info from SEI is already processed
- h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
- h264_scratch.nFilledLen, NALU_TYPE_SEI);
-#endif
- m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
- nal_count++;
- if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
- pdest_frame->nTimeStamp = h264_last_au_ts;
- pdest_frame->nFlags = h264_last_au_flags;
-#ifdef PANSCAN_HDLR
- if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
- h264_parser->update_panscan_data(h264_last_au_ts);
-#endif
- }
- if(m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
- m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
- h264_last_au_ts = h264_scratch.nTimeStamp;
- h264_last_au_flags = h264_scratch.nFlags;
-#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
- if (client_extradata & OMX_TIMEINFO_EXTRADATA)
- {
- OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
- if (!VALID_TS(h264_last_au_ts))
- h264_last_au_ts = ts_in_sei;
- }
-#endif
- } else
- h264_last_au_ts = LLONG_MAX;
- }
-
- if (!isNewFrame)
- {
- if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
- h264_scratch.nFilledLen)
- {
- DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %lu",
- h264_scratch.nFilledLen);
- memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
- h264_scratch.pBuffer,h264_scratch.nFilledLen);
- pdest_frame->nFilledLen += h264_scratch.nFilledLen;
- if(m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
- pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
- h264_scratch.nFilledLen = 0;
- }
- else
- {
- DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
- return OMX_ErrorBadParameter;
- }
- }
- else
- {
- look_ahead_nal = true;
- DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%lu TimeStamp = %llx",
- pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
- DEBUG_PRINT_LOW("\n Found a frame size = %lu number = %d",
- pdest_frame->nFilledLen,frame_count++);
-
- if (pdest_frame->nFilledLen == 0)
- {
- DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
- look_ahead_nal = false;
- if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
- h264_scratch.nFilledLen)
- {
+ DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %lu "
+ "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
+ DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
+ if (h264_scratch.nFilledLen && look_ahead_nal) {
+ look_ahead_nal = false;
+ if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+ h264_scratch.nFilledLen) {
memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
h264_scratch.pBuffer,h264_scratch.nFilledLen);
pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+ DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
h264_scratch.nFilledLen = 0;
- }
- else
- {
- DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
+ } else {
+ DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
return OMX_ErrorBadParameter;
- }
}
- else
- {
- if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
- {
- DEBUG_PRINT_LOW("\n Reset the EOS Flag");
- pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
- }
- /*Push the frame to the Decoder*/
- if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
- {
+ }
+ if (nal_length == 0) {
+ DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
+ if (m_frame_parser.parse_sc_frame(psource_frame,
+ &h264_scratch,&partial_frame) == -1) {
+ DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
return OMX_ErrorBadParameter;
- }
- //frame_count++;
- pdest_frame = NULL;
- if (m_input_free_q.m_size)
- {
- m_input_free_q.pop_entry(&address,&p2,&id);
- pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
- DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
- pdest_frame->nFilledLen = 0;
- pdest_frame->nFlags = 0;
- pdest_frame->nTimeStamp = LLONG_MAX;
- }
}
- }
+ } else {
+ DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
+ if (m_frame_parser.parse_h264_nallength(psource_frame,
+ &h264_scratch,&partial_frame) == -1) {
+ DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
+ return OMX_ErrorBadParameter;
+ }
}
- }
- else
- {
- DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
- /*Check if Destination Buffer is full*/
- if (h264_scratch.nAllocLen ==
- h264_scratch.nFilledLen + h264_scratch.nOffset)
- {
- DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
- return OMX_ErrorStreamCorrupt;
- }
- }
- if (!psource_frame->nFilledLen)
- {
- DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
-
- if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
- {
- if (pdest_frame)
- {
- DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
- if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
- h264_scratch.nFilledLen)
- {
- memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
- h264_scratch.pBuffer,h264_scratch.nFilledLen);
- pdest_frame->nFilledLen += h264_scratch.nFilledLen;
- h264_scratch.nFilledLen = 0;
- }
- else
- {
- DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
- return OMX_ErrorBadParameter;
- }
- pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
- pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
-
- DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%lu TimeStamp = %llx",
- pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
- DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
+ if (partial_frame == 0) {
+ if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
+ DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
+ nal_count++;
+ h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
+ h264_scratch.nFlags = psource_frame->nFlags;
+ } else {
+ DEBUG_PRINT_LOW("\n Parsed New NAL Length = %lu",h264_scratch.nFilledLen);
+ if (h264_scratch.nFilledLen) {
+ h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
+ NALU_TYPE_SPS);
#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
- if (client_extradata & OMX_TIMEINFO_EXTRADATA)
- {
- OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
- if (!VALID_TS(pdest_frame->nTimeStamp))
- pdest_frame->nTimeStamp = ts_in_sei;
- }
+ if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+ h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
+ h264_scratch.nFilledLen, NALU_TYPE_SEI);
+ else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+ // If timeinfo is present frame info from SEI is already processed
+ h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
+ h264_scratch.nFilledLen, NALU_TYPE_SEI);
#endif
- /*Push the frame to the Decoder*/
- if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
- {
- return OMX_ErrorBadParameter;
+ m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
+ nal_count++;
+ if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
+ pdest_frame->nTimeStamp = h264_last_au_ts;
+ pdest_frame->nFlags = h264_last_au_flags;
+#ifdef PANSCAN_HDLR
+ if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+ h264_parser->update_panscan_data(h264_last_au_ts);
+#endif
+ }
+ if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
+ m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
+ h264_last_au_ts = h264_scratch.nTimeStamp;
+ h264_last_au_flags = h264_scratch.nFlags;
+#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+ if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+ OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
+ if (!VALID_TS(h264_last_au_ts))
+ h264_last_au_ts = ts_in_sei;
+ }
+#endif
+ } else
+ h264_last_au_ts = LLONG_MAX;
+ }
+
+ if (!isNewFrame) {
+ if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+ h264_scratch.nFilledLen) {
+ DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %lu",
+ h264_scratch.nFilledLen);
+ memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+ h264_scratch.pBuffer,h264_scratch.nFilledLen);
+ pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+ if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
+ pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+ h264_scratch.nFilledLen = 0;
+ } else {
+ DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
+ return OMX_ErrorBadParameter;
+ }
+ } else {
+ look_ahead_nal = true;
+ DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%lu TimeStamp = %llx",
+ pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Found a frame size = %lu number = %d",
+ pdest_frame->nFilledLen,frame_count++);
+
+ if (pdest_frame->nFilledLen == 0) {
+ DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
+ look_ahead_nal = false;
+ if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+ h264_scratch.nFilledLen) {
+ memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+ h264_scratch.pBuffer,h264_scratch.nFilledLen);
+ pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+ h264_scratch.nFilledLen = 0;
+ } else {
+ DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
+ return OMX_ErrorBadParameter;
+ }
+ } else {
+ if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
+ DEBUG_PRINT_LOW("\n Reset the EOS Flag");
+ pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
+ }
+ /*Push the frame to the Decoder*/
+ if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+ return OMX_ErrorBadParameter;
+ }
+ //frame_count++;
+ pdest_frame = NULL;
+ if (m_input_free_q.m_size) {
+ m_input_free_q.pop_entry(&address,&p2,&id);
+ pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
+ DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
+ pdest_frame->nFilledLen = 0;
+ pdest_frame->nFlags = 0;
+ pdest_frame->nTimeStamp = LLONG_MAX;
+ }
+ }
+ }
}
- frame_count++;
- pdest_frame = NULL;
- }
- else
- {
- DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %lu",
- pdest_frame,h264_scratch.nFilledLen);
- generate_ebd = OMX_FALSE;
- }
+ } else {
+ DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %lu",pdest_frame->nFilledLen);
+ /*Check if Destination Buffer is full*/
+ if (h264_scratch.nAllocLen ==
+ h264_scratch.nFilledLen + h264_scratch.nOffset) {
+ DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
+ return OMX_ErrorStreamCorrupt;
+ }
}
- }
- if(generate_ebd && !psource_frame->nFilledLen)
- {
- m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
- psource_frame = NULL;
- if (m_input_pending_q.m_size)
- {
- DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
- m_input_pending_q.pop_entry(&address,&p2,&id);
- psource_frame = (OMX_BUFFERHEADERTYPE *) address;
- DEBUG_PRINT_LOW("\nNext source Buffer flag %lu src length %lu",
- psource_frame->nFlags,psource_frame->nFilledLen);
+
+ if (!psource_frame->nFilledLen) {
+ DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
+
+ if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
+ if (pdest_frame) {
+ DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
+ if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+ h264_scratch.nFilledLen) {
+ memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
+ h264_scratch.pBuffer,h264_scratch.nFilledLen);
+ pdest_frame->nFilledLen += h264_scratch.nFilledLen;
+ h264_scratch.nFilledLen = 0;
+ } else {
+ DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
+ return OMX_ErrorBadParameter;
+ }
+ pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
+ pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
+
+ DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%lu TimeStamp = %llx",
+ pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
+#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+ if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
+ OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
+ if (!VALID_TS(pdest_frame->nTimeStamp))
+ pdest_frame->nTimeStamp = ts_in_sei;
+ }
+#endif
+ /*Push the frame to the Decoder*/
+ if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
+ return OMX_ErrorBadParameter;
+ }
+ frame_count++;
+ pdest_frame = NULL;
+ } else {
+ DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %lu",
+ pdest_frame,h264_scratch.nFilledLen);
+ generate_ebd = OMX_FALSE;
+ }
+ }
}
- }
- return OMX_ErrorNone;
+ if (generate_ebd && !psource_frame->nFilledLen) {
+ m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
+ psource_frame = NULL;
+ if (m_input_pending_q.m_size) {
+ DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
+ m_input_pending_q.pop_entry(&address,&p2,&id);
+ psource_frame = (OMX_BUFFERHEADERTYPE *) address;
+ DEBUG_PRINT_LOW("\nNext source Buffer flag %lu src length %lu",
+ psource_frame->nFlags,psource_frame->nFilledLen);
+ }
+ }
+ return OMX_ErrorNone;
}
OMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
@@ -7899,61 +6994,47 @@
OMX_U32 partial_frame = 1;
OMX_U32 buf_len, dest_len;
- if(first_frame == 0)
- {
+ if (first_frame == 0) {
first_frame = 1;
DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
- if(!m_vendor_config.pData)
- {
+ if (!m_vendor_config.pData) {
DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n");
buf = psource_frame->pBuffer;
buf_len = psource_frame->nFilledLen;
if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
- VC1_SP_MP_START_CODE)
- {
+ VC1_SP_MP_START_CODE) {
m_vc1_profile = VC1_SP_MP_RCV;
- }
- else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
- {
+ } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
m_vc1_profile = VC1_AP;
- }
- else
- {
+ } else {
DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
return OMX_ErrorStreamCorrupt;
}
- }
- else
- {
+ } else {
pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
pdest_frame->nOffset;
dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
- pdest_frame->nOffset);
+ pdest_frame->nOffset);
- if(dest_len < m_vendor_config.nDataSize)
- {
+ if (dest_len < m_vendor_config.nDataSize) {
DEBUG_PRINT_ERROR("\nDestination buffer full\n");
return OMX_ErrorBadParameter;
- }
- else
- {
+ } else {
memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
pdest_frame->nFilledLen += m_vendor_config.nDataSize;
}
}
}
- switch(m_vc1_profile)
- {
+ switch (m_vc1_profile) {
case VC1_AP:
DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code");
- if (push_input_sc_codec(hComp) != OMX_ErrorNone)
- {
+ if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
return OMX_ErrorBadParameter;
}
- break;
+ break;
case VC1_SP_MP_RCV:
default:
@@ -7965,132 +7046,125 @@
#ifndef USE_ION
bool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
- OMX_U32 alignment)
+ OMX_U32 alignment)
{
- struct pmem_allocation allocation;
- allocation.size = buffer_size;
- allocation.align = clip2(alignment);
- if (allocation.align < 4096)
- {
- allocation.align = 4096;
- }
- if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
- {
- DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
- allocation.align, allocation.size);
- return false;
- }
- return true;
+ struct pmem_allocation allocation;
+ allocation.size = buffer_size;
+ allocation.align = clip2(alignment);
+ if (allocation.align < 4096) {
+ allocation.align = 4096;
+ }
+ if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
+ DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
+ allocation.align, allocation.size);
+ return false;
+ }
+ return true;
}
#endif
#ifdef USE_ION
int omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
- OMX_U32 alignment, struct ion_allocation_data *alloc_data,
- struct ion_fd_data *fd_data, int flag)
+ OMX_U32 alignment, struct ion_allocation_data *alloc_data,
+ struct ion_fd_data *fd_data, int flag)
{
- int fd = -EINVAL;
- int rc = -EINVAL;
- int ion_dev_flag;
- struct vdec_ion ion_buf_info;
- if (!alloc_data || buffer_size <= 0 || !fd_data) {
- DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
- return -EINVAL;
- }
- ion_dev_flag = O_RDONLY;
- fd = open (MEM_DEVICE, ion_dev_flag);
- if (fd < 0) {
- DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
- return fd;
- }
- alloc_data->flags = 0;
- if(!secure_mode && (flag & ION_FLAG_CACHED))
- {
- alloc_data->flags |= ION_FLAG_CACHED;
- }
- alloc_data->len = buffer_size;
- alloc_data->align = clip2(alignment);
- if (alloc_data->align < 4096)
- {
- alloc_data->align = 4096;
- }
- if ((secure_mode) && (flag & ION_SECURE))
- alloc_data->flags |= ION_SECURE;
+ int fd = -EINVAL;
+ int rc = -EINVAL;
+ int ion_dev_flag;
+ struct vdec_ion ion_buf_info;
+ if (!alloc_data || buffer_size <= 0 || !fd_data) {
+ DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
+ return -EINVAL;
+ }
+ ion_dev_flag = O_RDONLY;
+ fd = open (MEM_DEVICE, ion_dev_flag);
+ if (fd < 0) {
+ DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
+ return fd;
+ }
+ alloc_data->flags = 0;
+ if (!secure_mode && (flag & ION_FLAG_CACHED)) {
+ alloc_data->flags |= ION_FLAG_CACHED;
+ }
+ alloc_data->len = buffer_size;
+ alloc_data->align = clip2(alignment);
+ if (alloc_data->align < 4096) {
+ alloc_data->align = 4096;
+ }
+ if ((secure_mode) && (flag & ION_SECURE))
+ alloc_data->flags |= ION_SECURE;
- alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
- if (secure_mode)
- alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
- rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
- if (rc || !alloc_data->handle) {
- DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
- alloc_data->handle = NULL;
- close(fd);
- fd = -ENOMEM;
- return fd;
- }
- fd_data->handle = alloc_data->handle;
- rc = ioctl(fd,ION_IOC_MAP,fd_data);
- if (rc) {
- DEBUG_PRINT_ERROR("\n ION MAP failed ");
- ion_buf_info.ion_alloc_data = *alloc_data;
- ion_buf_info.ion_device_fd = fd;
- ion_buf_info.fd_ion_data = *fd_data;
- free_ion_memory(&ion_buf_info);
- fd_data->fd =-1;
- close(fd);
- fd = -ENOMEM;
- }
+ alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
+ if (secure_mode)
+ alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
+ rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
+ if (rc || !alloc_data->handle) {
+ DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
+ alloc_data->handle = NULL;
+ close(fd);
+ fd = -ENOMEM;
+ return fd;
+ }
+ fd_data->handle = alloc_data->handle;
+ rc = ioctl(fd,ION_IOC_MAP,fd_data);
+ if (rc) {
+ DEBUG_PRINT_ERROR("\n ION MAP failed ");
+ ion_buf_info.ion_alloc_data = *alloc_data;
+ ion_buf_info.ion_device_fd = fd;
+ ion_buf_info.fd_ion_data = *fd_data;
+ free_ion_memory(&ion_buf_info);
+ fd_data->fd =-1;
+ close(fd);
+ fd = -ENOMEM;
+ }
- return fd;
+ return fd;
}
-void omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
+void omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
+{
- if(!buf_ion_info) {
- DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
- return;
- }
- if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
- &buf_ion_info->ion_alloc_data.handle)) {
- DEBUG_PRINT_ERROR("\n ION: free failed" );
- }
- close(buf_ion_info->ion_device_fd);
- buf_ion_info->ion_device_fd = -1;
- buf_ion_info->ion_alloc_data.handle = NULL;
- buf_ion_info->fd_ion_data.fd = -1;
+ if (!buf_ion_info) {
+ DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
+ return;
+ }
+ if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
+ &buf_ion_info->ion_alloc_data.handle)) {
+ DEBUG_PRINT_ERROR("\n ION: free failed" );
+ }
+ close(buf_ion_info->ion_device_fd);
+ buf_ion_info->ion_device_fd = -1;
+ buf_ion_info->ion_alloc_data.handle = NULL;
+ buf_ion_info->fd_ion_data.fd = -1;
}
#endif
void omx_vdec::free_output_buffer_header()
{
- DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
- output_use_buffer = false;
- ouput_egl_buffers = false;
+ DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
+ output_use_buffer = false;
+ ouput_egl_buffers = false;
- if (m_out_mem_ptr)
- {
- free (m_out_mem_ptr);
- m_out_mem_ptr = NULL;
- }
+ if (m_out_mem_ptr) {
+ free (m_out_mem_ptr);
+ m_out_mem_ptr = NULL;
+ }
- if(m_platform_list)
- {
- free(m_platform_list);
- m_platform_list = NULL;
- }
+ if (m_platform_list) {
+ free(m_platform_list);
+ m_platform_list = NULL;
+ }
- if (drv_ctx.ptr_respbuffer)
- {
- free (drv_ctx.ptr_respbuffer);
- drv_ctx.ptr_respbuffer = NULL;
- }
- if (drv_ctx.ptr_outputbuffer)
- {
- free (drv_ctx.ptr_outputbuffer);
- drv_ctx.ptr_outputbuffer = NULL;
- }
+ if (drv_ctx.ptr_respbuffer) {
+ free (drv_ctx.ptr_respbuffer);
+ drv_ctx.ptr_respbuffer = NULL;
+ }
+ if (drv_ctx.ptr_outputbuffer) {
+ free (drv_ctx.ptr_outputbuffer);
+ drv_ctx.ptr_outputbuffer = NULL;
+ }
#ifdef USE_ION
if (drv_ctx.op_buf_ion_info) {
DEBUG_PRINT_LOW("\n Free o/p ion context");
- free(drv_ctx.op_buf_ion_info);
+ free(drv_ctx.op_buf_ion_info);
drv_ctx.op_buf_ion_info = NULL;
}
#endif
@@ -8099,45 +7173,39 @@
void omx_vdec::free_input_buffer_header()
{
input_use_buffer = false;
- if (arbitrary_bytes)
- {
- if (m_frame_parser.mutils)
- {
- DEBUG_PRINT_LOW("\n Free utils parser");
- delete (m_frame_parser.mutils);
- m_frame_parser.mutils = NULL;
- }
+ if (arbitrary_bytes) {
+ if (m_frame_parser.mutils) {
+ DEBUG_PRINT_LOW("\n Free utils parser");
+ delete (m_frame_parser.mutils);
+ m_frame_parser.mutils = NULL;
+ }
- if (m_inp_heap_ptr)
- {
- DEBUG_PRINT_LOW("\n Free input Heap Pointer");
- free (m_inp_heap_ptr);
- m_inp_heap_ptr = NULL;
- }
+ if (m_inp_heap_ptr) {
+ DEBUG_PRINT_LOW("\n Free input Heap Pointer");
+ free (m_inp_heap_ptr);
+ m_inp_heap_ptr = NULL;
+ }
- if (m_phdr_pmem_ptr)
- {
- DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
- free (m_phdr_pmem_ptr);
- m_phdr_pmem_ptr = NULL;
- }
+ if (m_phdr_pmem_ptr) {
+ DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
+ free (m_phdr_pmem_ptr);
+ m_phdr_pmem_ptr = NULL;
+ }
}
- if (m_inp_mem_ptr)
- {
- DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
- free (m_inp_mem_ptr);
- m_inp_mem_ptr = NULL;
+ if (m_inp_mem_ptr) {
+ DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
+ free (m_inp_mem_ptr);
+ m_inp_mem_ptr = NULL;
}
- if (drv_ctx.ptr_inputbuffer)
- {
- DEBUG_PRINT_LOW("\n Free Driver Context pointer");
- free (drv_ctx.ptr_inputbuffer);
- drv_ctx.ptr_inputbuffer = NULL;
+ if (drv_ctx.ptr_inputbuffer) {
+ DEBUG_PRINT_LOW("\n Free Driver Context pointer");
+ free (drv_ctx.ptr_inputbuffer);
+ drv_ctx.ptr_inputbuffer = NULL;
}
#ifdef USE_ION
if (drv_ctx.ip_buf_ion_info) {
DEBUG_PRINT_LOW("\n Free ion context");
- free(drv_ctx.ip_buf_ion_info);
+ free(drv_ctx.ip_buf_ion_info);
drv_ctx.ip_buf_ion_info = NULL;
}
#endif
@@ -8145,1560 +7213,1473 @@
int omx_vdec::stream_off(OMX_U32 port)
{
- enum v4l2_buf_type btype;
- int rc = 0;
- enum v4l2_ports v4l2_port = OUTPUT_PORT;
+ enum v4l2_buf_type btype;
+ int rc = 0;
+ enum v4l2_ports v4l2_port = OUTPUT_PORT;
- if (port == OMX_CORE_INPUT_PORT_INDEX) {
- btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- v4l2_port = OUTPUT_PORT;
- } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
- btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- v4l2_port = CAPTURE_PORT;
- } else if (port == OMX_ALL) {
- int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
- int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
+ if (port == OMX_CORE_INPUT_PORT_INDEX) {
+ btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ v4l2_port = OUTPUT_PORT;
+ } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
+ btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ v4l2_port = CAPTURE_PORT;
+ } else if (port == OMX_ALL) {
+ int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
+ int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
- if (!rc_input)
- return rc_input;
- else
- return rc_output;
- }
+ if (!rc_input)
+ return rc_input;
+ else
+ return rc_output;
+ }
- if (!streaming[v4l2_port]) {
- // already streamed off, warn and move on
- DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
- " which is already streamed off", v4l2_port);
- return 0;
- }
+ if (!streaming[v4l2_port]) {
+ // already streamed off, warn and move on
+ DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
+ " which is already streamed off", v4l2_port);
+ return 0;
+ }
- DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
+ DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
- if (rc) {
- /*TODO: How to handle this case */
- DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port);
- } else {
- streaming[v4l2_port] = false;
- }
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ /*TODO: How to handle this case */
+ DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port);
+ } else {
+ streaming[v4l2_port] = false;
+ }
- return rc;
+ return rc;
}
OMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- struct v4l2_requestbuffers bufreq;
- unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
- struct v4l2_format fmt;
- int ret = 0;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ struct v4l2_requestbuffers bufreq;
+ unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
+ struct v4l2_format fmt;
+ int ret = 0;
DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
- buffer_prop->actualcount, buffer_prop->buffer_size);
- bufreq.memory = V4L2_MEMORY_USERPTR;
- bufreq.count = 1;
- if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
- bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- fmt.fmt.pix_mp.pixelformat = output_capability;
- }else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
- bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- fmt.fmt.pix_mp.pixelformat = capture_capability;
- }else {eRet = OMX_ErrorBadParameter;}
- if(eRet==OMX_ErrorNone){
- ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
- }
- if(ret)
- {
- DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
- /*TODO: How to handle this case */
- eRet = OMX_ErrorInsufficientResources;
- return eRet;
- }
- else
- {
- buffer_prop->actualcount = bufreq.count;
- buffer_prop->mincount = bufreq.count;
- DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count);
- }
- DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
- buffer_prop->actualcount, buffer_prop->buffer_size);
-
- fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
- fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
-
- ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
-
- update_resolution(fmt.fmt.pix_mp.width,
- fmt.fmt.pix_mp.height,
- fmt.fmt.pix_mp.plane_fmt[0].bytesperline,
- fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
- if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
- drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
- DEBUG_PRINT_HIGH("Buffer Size = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
-
- if(ret)
- {
- /*TODO: How to handle this case */
- DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
- eRet = OMX_ErrorInsufficientResources;
- }
- else
- {
- int extra_idx = 0;
-
- eRet = is_video_session_supported();
- if (eRet)
- return eRet;
-
- buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
- buf_size = buffer_prop->buffer_size;
- extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
- if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
- extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
- } else if (extra_idx >= VIDEO_MAX_PLANES) {
- DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
- return OMX_ErrorBadParameter;
+ buffer_prop->actualcount, buffer_prop->buffer_size);
+ bufreq.memory = V4L2_MEMORY_USERPTR;
+ bufreq.count = 1;
+ if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
+ bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fmt.fmt.pix_mp.pixelformat = output_capability;
+ } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+ bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fmt.fmt.pix_mp.pixelformat = capture_capability;
+ } else {
+ eRet = OMX_ErrorBadParameter;
}
- if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
- {
- DEBUG_PRINT_HIGH("Frame info extra data enabled!");
- client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+ if (eRet==OMX_ErrorNone) {
+ ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
}
- if (client_extradata & OMX_INTERLACE_EXTRADATA)
- {
- client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
+ if (ret) {
+ DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
+ /*TODO: How to handle this case */
+ eRet = OMX_ErrorInsufficientResources;
+ return eRet;
+ } else {
+ buffer_prop->actualcount = bufreq.count;
+ buffer_prop->mincount = bufreq.count;
+ DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count);
}
- if (client_extradata & OMX_PORTDEF_EXTRADATA)
- {
- client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
- DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
- client_extra_data_size);
+ DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
+ buffer_prop->actualcount, buffer_prop->buffer_size);
+
+ fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+ fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
+
+ update_resolution(fmt.fmt.pix_mp.width,
+ fmt.fmt.pix_mp.height,
+ fmt.fmt.pix_mp.plane_fmt[0].bytesperline,
+ fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
+ if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
+ DEBUG_PRINT_HIGH("Buffer Size = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
+
+ if (ret) {
+ /*TODO: How to handle this case */
+ DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
+ eRet = OMX_ErrorInsufficientResources;
+ } else {
+ int extra_idx = 0;
+
+ eRet = is_video_session_supported();
+ if (eRet)
+ return eRet;
+
+ buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+ buf_size = buffer_prop->buffer_size;
+ extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
+ if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
+ extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
+ } else if (extra_idx >= VIDEO_MAX_PLANES) {
+ DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
+ return OMX_ErrorBadParameter;
+ }
+ if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
+ DEBUG_PRINT_HIGH("Frame info extra data enabled!");
+ client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+ }
+ if (client_extradata & OMX_INTERLACE_EXTRADATA) {
+ client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
+ }
+ if (client_extradata & OMX_PORTDEF_EXTRADATA) {
+ client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
+ DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
+ client_extra_data_size);
+ }
+ if (client_extra_data_size) {
+ client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
+ buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
+ }
+ drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
+ drv_ctx.extradata_info.count = buffer_prop->actualcount;
+ drv_ctx.extradata_info.buffer_size = extra_data_size;
+ buf_size += client_extra_data_size;
+ buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
+ DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
+ buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
+ if (in_reconfig) // BufReq will be set to driver when port is disabled
+ buffer_prop->buffer_size = buf_size;
+ else if (buf_size != buffer_prop->buffer_size) {
+ buffer_prop->buffer_size = buf_size;
+ eRet = set_buffer_req(buffer_prop);
+ }
}
- if (client_extra_data_size)
- {
- client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
- buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
- }
- drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
- drv_ctx.extradata_info.count = buffer_prop->actualcount;
- drv_ctx.extradata_info.buffer_size = extra_data_size;
- buf_size += client_extra_data_size;
- buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
- DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)",
- buffer_prop->actualcount, buffer_prop->buffer_size, buf_size);
- if (in_reconfig) // BufReq will be set to driver when port is disabled
- buffer_prop->buffer_size = buf_size;
- else if (buf_size != buffer_prop->buffer_size)
- {
- buffer_prop->buffer_size = buf_size;
- eRet = set_buffer_req(buffer_prop);
- }
- }
- DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
- buffer_prop->actualcount, buffer_prop->buffer_size);
- return eRet;
+ DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)",
+ buffer_prop->actualcount, buffer_prop->buffer_size);
+ return eRet;
}
OMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- unsigned buf_size = 0;
- struct v4l2_format fmt;
- struct v4l2_requestbuffers bufreq;
- int ret;
- DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
- buffer_prop->actualcount, buffer_prop->buffer_size);
- buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
- if (buf_size != buffer_prop->buffer_size)
- {
- DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
- buffer_prop->buffer_size, buf_size);
- eRet = OMX_ErrorBadParameter;
- }
- else
- {
- fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
- fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ unsigned buf_size = 0;
+ struct v4l2_format fmt;
+ struct v4l2_requestbuffers bufreq;
+ int ret;
+ DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
+ buffer_prop->actualcount, buffer_prop->buffer_size);
+ buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
+ if (buf_size != buffer_prop->buffer_size) {
+ DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
+ buffer_prop->buffer_size, buf_size);
+ eRet = OMX_ErrorBadParameter;
+ } else {
+ fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
+ fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
- if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
- fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- fmt.fmt.pix_mp.pixelformat = output_capability;
- } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
- fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- fmt.fmt.pix_mp.pixelformat = capture_capability;
- } else {eRet = OMX_ErrorBadParameter;}
+ if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
+ fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fmt.fmt.pix_mp.pixelformat = output_capability;
+ } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+ fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fmt.fmt.pix_mp.pixelformat = capture_capability;
+ } else {
+ eRet = OMX_ErrorBadParameter;
+ }
- ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
- if (ret)
- {
- /*TODO: How to handle this case */
- DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
- eRet = OMX_ErrorInsufficientResources;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+ if (ret) {
+ /*TODO: How to handle this case */
+ DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
+ eRet = OMX_ErrorInsufficientResources;
+ }
+
+ bufreq.memory = V4L2_MEMORY_USERPTR;
+ bufreq.count = buffer_prop->actualcount;
+ if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
+ bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
+ bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ } else {
+ eRet = OMX_ErrorBadParameter;
+ }
+
+ if (eRet==OMX_ErrorNone) {
+ ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
+ }
+
+ if (ret) {
+ DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
+ /*TODO: How to handle this case */
+ eRet = OMX_ErrorInsufficientResources;
+ } else if (bufreq.count < buffer_prop->actualcount) {
+ DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
+ " on v4l2 port %d to %d (prefers %d)", bufreq.type,
+ buffer_prop->actualcount, bufreq.count);
+ eRet = OMX_ErrorInsufficientResources;
+ } else {
+ if (!client_buffers.update_buffer_req()) {
+ DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ }
}
-
- bufreq.memory = V4L2_MEMORY_USERPTR;
- bufreq.count = buffer_prop->actualcount;
- if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
- bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
- bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- } else {eRet = OMX_ErrorBadParameter;}
-
- if (eRet==OMX_ErrorNone) {
- ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
- }
-
- if (ret)
- {
- DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
- /*TODO: How to handle this case */
- eRet = OMX_ErrorInsufficientResources;
- } else if (bufreq.count < buffer_prop->actualcount) {
- DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
- " on v4l2 port %d to %d (prefers %d)", bufreq.type,
- buffer_prop->actualcount, bufreq.count);
- eRet = OMX_ErrorInsufficientResources;
- } else {
- if (!client_buffers.update_buffer_req()) {
- DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
- eRet = OMX_ErrorInsufficientResources;
- }
- }
- }
- return eRet;
+ return eRet;
}
OMX_ERRORTYPE omx_vdec::update_picture_resolution()
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- return eRet;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ return eRet;
}
OMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- if (!portDefn)
- {
- return OMX_ErrorBadParameter;
- }
- DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
- portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
- portDefn->nSize = sizeof(portDefn);
- portDefn->eDomain = OMX_PortDomainVideo;
- if (drv_ctx.frame_rate.fps_denominator > 0)
- portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
- drv_ctx.frame_rate.fps_denominator;
- else {
- DEBUG_PRINT_ERROR("Error: Divide by zero \n");
- return OMX_ErrorBadParameter;
- }
- if (0 == portDefn->nPortIndex)
- {
- portDefn->eDir = OMX_DirInput;
- portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
- portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount;
- portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size;
- portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
- portDefn->format.video.eCompressionFormat = eCompressionFormat;
- portDefn->bEnabled = m_inp_bEnabled;
- portDefn->bPopulated = m_inp_bPopulated;
- }
- else if (1 == portDefn->nPortIndex)
- {
- unsigned int buf_size = 0;
- if (!client_buffers.update_buffer_req()) {
- DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
- return OMX_ErrorHardware;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ if (!portDefn) {
+ return OMX_ErrorBadParameter;
}
- if (!client_buffers.get_buffer_req(buf_size)) {
- DEBUG_PRINT_ERROR("\n update buffer requirements");
- return OMX_ErrorHardware;
+ DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
+ portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
+ portDefn->nSize = sizeof(portDefn);
+ portDefn->eDomain = OMX_PortDomainVideo;
+ if (drv_ctx.frame_rate.fps_denominator > 0)
+ portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
+ drv_ctx.frame_rate.fps_denominator;
+ else {
+ DEBUG_PRINT_ERROR("Error: Divide by zero \n");
+ return OMX_ErrorBadParameter;
}
- portDefn->nBufferSize = buf_size;
- portDefn->eDir = OMX_DirOutput;
- portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
- portDefn->nBufferCountMin = drv_ctx.op_buf.mincount;
- portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
- portDefn->bEnabled = m_out_bEnabled;
- portDefn->bPopulated = m_out_bPopulated;
- if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
- DEBUG_PRINT_ERROR("\n Error in getting color format");
- return OMX_ErrorHardware;
+ if (0 == portDefn->nPortIndex) {
+ portDefn->eDir = OMX_DirInput;
+ portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
+ portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount;
+ portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size;
+ portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
+ portDefn->format.video.eCompressionFormat = eCompressionFormat;
+ portDefn->bEnabled = m_inp_bEnabled;
+ portDefn->bPopulated = m_inp_bPopulated;
+ } else if (1 == portDefn->nPortIndex) {
+ unsigned int buf_size = 0;
+ if (!client_buffers.update_buffer_req()) {
+ DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
+ return OMX_ErrorHardware;
+ }
+ if (!client_buffers.get_buffer_req(buf_size)) {
+ DEBUG_PRINT_ERROR("\n update buffer requirements");
+ return OMX_ErrorHardware;
+ }
+ portDefn->nBufferSize = buf_size;
+ portDefn->eDir = OMX_DirOutput;
+ portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
+ portDefn->nBufferCountMin = drv_ctx.op_buf.mincount;
+ portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+ portDefn->bEnabled = m_out_bEnabled;
+ portDefn->bPopulated = m_out_bPopulated;
+ if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
+ DEBUG_PRINT_ERROR("\n Error in getting color format");
+ return OMX_ErrorHardware;
+ }
+ } else {
+ portDefn->eDir = OMX_DirMax;
+ DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
+ (int)portDefn->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
}
- }
- else
- {
- portDefn->eDir = OMX_DirMax;
- DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
- (int)portDefn->nPortIndex);
- eRet = OMX_ErrorBadPortIndex;
- }
- portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height;
- portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width;
- portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
- portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
- DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
- " SliceHeight = %lu \n", portDefn->format.video.nFrameWidth,
- portDefn->format.video.nFrameHeight,
- portDefn->format.video.nStride,
- portDefn->format.video.nSliceHeight);
- return eRet;
+ portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height;
+ portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width;
+ portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
+ portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
+ DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
+ " SliceHeight = %lu \n", portDefn->format.video.nFrameWidth,
+ portDefn->format.video.nFrameHeight,
+ portDefn->format.video.nStride,
+ portDefn->format.video.nSliceHeight);
+ return eRet;
}
OMX_ERRORTYPE omx_vdec::allocate_output_headers()
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- OMX_BUFFERHEADERTYPE *bufHdr = NULL;
- unsigned i= 0;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *bufHdr = NULL;
+ unsigned i= 0;
- if(!m_out_mem_ptr) {
- DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
- int nBufHdrSize = 0;
- int nPlatformEntrySize = 0;
- int nPlatformListSize = 0;
- int nPMEMInfoSize = 0;
- OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList;
- OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry;
- OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
+ if (!m_out_mem_ptr) {
+ DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
+ int nBufHdrSize = 0;
+ int nPlatformEntrySize = 0;
+ int nPlatformListSize = 0;
+ int nPMEMInfoSize = 0;
+ OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList;
+ OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry;
+ OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
- DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
- drv_ctx.op_buf.actualcount);
- nBufHdrSize = drv_ctx.op_buf.actualcount *
- sizeof(OMX_BUFFERHEADERTYPE);
+ DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
+ drv_ctx.op_buf.actualcount);
+ nBufHdrSize = drv_ctx.op_buf.actualcount *
+ sizeof(OMX_BUFFERHEADERTYPE);
- nPMEMInfoSize = drv_ctx.op_buf.actualcount *
- sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
- nPlatformListSize = drv_ctx.op_buf.actualcount *
- sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
- nPlatformEntrySize = drv_ctx.op_buf.actualcount *
- sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
+ nPMEMInfoSize = drv_ctx.op_buf.actualcount *
+ sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
+ nPlatformListSize = drv_ctx.op_buf.actualcount *
+ sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
+ nPlatformEntrySize = drv_ctx.op_buf.actualcount *
+ sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
- DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
- sizeof(OMX_BUFFERHEADERTYPE),
- nPMEMInfoSize,
- nPlatformListSize);
- DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
- m_out_bm_count);
- m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1);
- // Alloc mem for platform specific info
- char *pPtr=NULL;
- pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
- nPMEMInfoSize,1);
- drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
- calloc (sizeof(struct vdec_bufferpayload),
- drv_ctx.op_buf.actualcount);
- drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\
- calloc (sizeof (struct vdec_output_frameinfo),
- drv_ctx.op_buf.actualcount);
+ DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
+ sizeof(OMX_BUFFERHEADERTYPE),
+ nPMEMInfoSize,
+ nPlatformListSize);
+ DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
+ m_out_bm_count);
+ m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1);
+ // Alloc mem for platform specific info
+ char *pPtr=NULL;
+ pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
+ nPMEMInfoSize,1);
+ drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
+ calloc (sizeof(struct vdec_bufferpayload),
+ drv_ctx.op_buf.actualcount);
+ drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\
+ calloc (sizeof (struct vdec_output_frameinfo),
+ drv_ctx.op_buf.actualcount);
#ifdef USE_ION
- drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
- calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
+ drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
+ calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
#endif
- if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
- && drv_ctx.ptr_respbuffer)
- {
- bufHdr = m_out_mem_ptr;
- m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
- m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
- (((char *) m_platform_list) + nPlatformListSize);
- m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
- (((char *) m_platform_entry) + nPlatformEntrySize);
- pPlatformList = m_platform_list;
- pPlatformEntry = m_platform_entry;
- pPMEMInfo = m_pmem_info;
+ if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
+ && drv_ctx.ptr_respbuffer) {
+ bufHdr = m_out_mem_ptr;
+ m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
+ m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
+ (((char *) m_platform_list) + nPlatformListSize);
+ m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+ (((char *) m_platform_entry) + nPlatformEntrySize);
+ pPlatformList = m_platform_list;
+ pPlatformEntry = m_platform_entry;
+ pPMEMInfo = m_pmem_info;
- DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
+ DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
- // Settting the entire storage nicely
- DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
- m_out_mem_ptr,pPlatformEntry);
- DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
- for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
- {
- bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
- bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
- // Set the values when we determine the right HxW param
- bufHdr->nAllocLen = 0;
- bufHdr->nFilledLen = 0;
- bufHdr->pAppPrivate = NULL;
- bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
- pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
- pPlatformEntry->entry = pPMEMInfo;
- // Initialize the Platform List
- pPlatformList->nEntries = 1;
- pPlatformList->entryList = pPlatformEntry;
- // Keep pBuffer NULL till vdec is opened
- bufHdr->pBuffer = NULL;
- pPMEMInfo->offset = 0;
- pPMEMInfo->pmem_fd = 0;
- bufHdr->pPlatformPrivate = pPlatformList;
- drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
+ // Settting the entire storage nicely
+ DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
+ m_out_mem_ptr,pPlatformEntry);
+ DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
+ for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
+ bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
+ bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
+ // Set the values when we determine the right HxW param
+ bufHdr->nAllocLen = 0;
+ bufHdr->nFilledLen = 0;
+ bufHdr->pAppPrivate = NULL;
+ bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+ pPlatformEntry->entry = pPMEMInfo;
+ // Initialize the Platform List
+ pPlatformList->nEntries = 1;
+ pPlatformList->entryList = pPlatformEntry;
+ // Keep pBuffer NULL till vdec is opened
+ bufHdr->pBuffer = NULL;
+ pPMEMInfo->offset = 0;
+ pPMEMInfo->pmem_fd = 0;
+ bufHdr->pPlatformPrivate = pPlatformList;
+ drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
#ifdef USE_ION
- drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
+ drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
#endif
- /*Create a mapping between buffers*/
- bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
- drv_ctx.ptr_respbuffer[i].client_data = (void *) \
- &drv_ctx.ptr_outputbuffer[i];
- // Move the buffer and buffer header pointers
- bufHdr++;
- pPMEMInfo++;
- pPlatformEntry++;
- pPlatformList++;
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
- m_out_mem_ptr, pPtr);
- if(m_out_mem_ptr)
- {
- free(m_out_mem_ptr);
- m_out_mem_ptr = NULL;
- }
- if(pPtr)
- {
- free(pPtr);
- pPtr = NULL;
- }
- if(drv_ctx.ptr_outputbuffer)
- {
- free(drv_ctx.ptr_outputbuffer);
- drv_ctx.ptr_outputbuffer = NULL;
- }
- if(drv_ctx.ptr_respbuffer)
- {
- free(drv_ctx.ptr_respbuffer);
- drv_ctx.ptr_respbuffer = NULL;
- }
+ /*Create a mapping between buffers*/
+ bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
+ drv_ctx.ptr_respbuffer[i].client_data = (void *) \
+ &drv_ctx.ptr_outputbuffer[i];
+ // Move the buffer and buffer header pointers
+ bufHdr++;
+ pPMEMInfo++;
+ pPlatformEntry++;
+ pPlatformList++;
+ }
+ } else {
+ DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
+ m_out_mem_ptr, pPtr);
+ if (m_out_mem_ptr) {
+ free(m_out_mem_ptr);
+ m_out_mem_ptr = NULL;
+ }
+ if (pPtr) {
+ free(pPtr);
+ pPtr = NULL;
+ }
+ if (drv_ctx.ptr_outputbuffer) {
+ free(drv_ctx.ptr_outputbuffer);
+ drv_ctx.ptr_outputbuffer = NULL;
+ }
+ if (drv_ctx.ptr_respbuffer) {
+ free(drv_ctx.ptr_respbuffer);
+ drv_ctx.ptr_respbuffer = NULL;
+ }
#ifdef USE_ION
- if (drv_ctx.op_buf_ion_info) {
- DEBUG_PRINT_LOW("\n Free o/p ion context");
- free(drv_ctx.op_buf_ion_info);
- drv_ctx.op_buf_ion_info = NULL;
- }
+ if (drv_ctx.op_buf_ion_info) {
+ DEBUG_PRINT_LOW("\n Free o/p ion context");
+ free(drv_ctx.op_buf_ion_info);
+ drv_ctx.op_buf_ion_info = NULL;
+ }
#endif
- eRet = OMX_ErrorInsufficientResources;
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ } else {
+ eRet = OMX_ErrorInsufficientResources;
}
- } else {
- eRet = OMX_ErrorInsufficientResources;
- }
- return eRet;
+ return eRet;
}
void omx_vdec::complete_pending_buffer_done_cbs()
{
- unsigned p1;
- unsigned p2;
- unsigned ident;
- omx_cmd_queue tmp_q, pending_bd_q;
- pthread_mutex_lock(&m_lock);
- // pop all pending GENERATE FDB from ftb queue
- while (m_ftb_q.m_size)
- {
- m_ftb_q.pop_entry(&p1,&p2,&ident);
- if(ident == OMX_COMPONENT_GENERATE_FBD)
- {
- pending_bd_q.insert_entry(p1,p2,ident);
- }
- else
- {
- tmp_q.insert_entry(p1,p2,ident);
- }
- }
- //return all non GENERATE FDB to ftb queue
- while(tmp_q.m_size)
- {
- tmp_q.pop_entry(&p1,&p2,&ident);
- m_ftb_q.insert_entry(p1,p2,ident);
- }
- // pop all pending GENERATE EDB from etb queue
- while (m_etb_q.m_size)
- {
- m_etb_q.pop_entry(&p1,&p2,&ident);
- if(ident == OMX_COMPONENT_GENERATE_EBD)
- {
- pending_bd_q.insert_entry(p1,p2,ident);
- }
- else
- {
- tmp_q.insert_entry(p1,p2,ident);
- }
- }
- //return all non GENERATE FDB to etb queue
- while(tmp_q.m_size)
- {
- tmp_q.pop_entry(&p1,&p2,&ident);
- m_etb_q.insert_entry(p1,p2,ident);
- }
- pthread_mutex_unlock(&m_lock);
- // process all pending buffer dones
- while(pending_bd_q.m_size)
- {
- pending_bd_q.pop_entry(&p1,&p2,&ident);
- switch(ident)
- {
- case OMX_COMPONENT_GENERATE_EBD:
- if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
- omx_report_error ();
+ unsigned p1;
+ unsigned p2;
+ unsigned ident;
+ omx_cmd_queue tmp_q, pending_bd_q;
+ pthread_mutex_lock(&m_lock);
+ // pop all pending GENERATE FDB from ftb queue
+ while (m_ftb_q.m_size) {
+ m_ftb_q.pop_entry(&p1,&p2,&ident);
+ if (ident == OMX_COMPONENT_GENERATE_FBD) {
+ pending_bd_q.insert_entry(p1,p2,ident);
+ } else {
+ tmp_q.insert_entry(p1,p2,ident);
}
- break;
+ }
+ //return all non GENERATE FDB to ftb queue
+ while (tmp_q.m_size) {
+ tmp_q.pop_entry(&p1,&p2,&ident);
+ m_ftb_q.insert_entry(p1,p2,ident);
+ }
+ // pop all pending GENERATE EDB from etb queue
+ while (m_etb_q.m_size) {
+ m_etb_q.pop_entry(&p1,&p2,&ident);
+ if (ident == OMX_COMPONENT_GENERATE_EBD) {
+ pending_bd_q.insert_entry(p1,p2,ident);
+ } else {
+ tmp_q.insert_entry(p1,p2,ident);
+ }
+ }
+ //return all non GENERATE FDB to etb queue
+ while (tmp_q.m_size) {
+ tmp_q.pop_entry(&p1,&p2,&ident);
+ m_etb_q.insert_entry(p1,p2,ident);
+ }
+ pthread_mutex_unlock(&m_lock);
+ // process all pending buffer dones
+ while (pending_bd_q.m_size) {
+ pending_bd_q.pop_entry(&p1,&p2,&ident);
+ switch (ident) {
+ case OMX_COMPONENT_GENERATE_EBD:
+ if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
+ omx_report_error ();
+ }
+ break;
- case OMX_COMPONENT_GENERATE_FBD:
- if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
- {
- DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
- omx_report_error ();
+ case OMX_COMPONENT_GENERATE_FBD:
+ if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
+ DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
+ omx_report_error ();
+ }
+ break;
}
- break;
}
- }
}
void omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
{
- OMX_U32 new_frame_interval = 0;
- if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
- && llabs(act_timestamp - prev_ts) > 2000)
- {
- new_frame_interval = client_set_fps ? frm_int :
- llabs(act_timestamp - prev_ts);
- if (new_frame_interval < frm_int || frm_int == 0)
- {
- frm_int = new_frame_interval;
- if(frm_int)
- {
- drv_ctx.frame_rate.fps_numerator = 1e6;
- drv_ctx.frame_rate.fps_denominator = frm_int;
- DEBUG_PRINT_LOW("set_frame_rate: frm_int(%lu) fps(%f)",
- frm_int, drv_ctx.frame_rate.fps_numerator /
- (float)drv_ctx.frame_rate.fps_denominator);
+ OMX_U32 new_frame_interval = 0;
+ if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
+ && llabs(act_timestamp - prev_ts) > 2000) {
+ new_frame_interval = client_set_fps ? frm_int :
+ llabs(act_timestamp - prev_ts);
+ if (new_frame_interval < frm_int || frm_int == 0) {
+ frm_int = new_frame_interval;
+ if (frm_int) {
+ drv_ctx.frame_rate.fps_numerator = 1e6;
+ drv_ctx.frame_rate.fps_denominator = frm_int;
+ DEBUG_PRINT_LOW("set_frame_rate: frm_int(%lu) fps(%f)",
+ frm_int, drv_ctx.frame_rate.fps_numerator /
+ (float)drv_ctx.frame_rate.fps_denominator);
- /* We need to report the difference between this FBD and the previous FBD
- * back to the driver for clock scaling purposes. */
- struct v4l2_outputparm oparm;
- /*XXX: we're providing timing info as seconds per frame rather than frames
- * per second.*/
- oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
- oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
+ /* We need to report the difference between this FBD and the previous FBD
+ * back to the driver for clock scaling purposes. */
+ struct v4l2_outputparm oparm;
+ /*XXX: we're providing timing info as seconds per frame rather than frames
+ * per second.*/
+ oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
+ oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
- struct v4l2_streamparm sparm;
- sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- sparm.parm.output = oparm;
- if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm))
- {
- DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
- performance might be affected");
+ struct v4l2_streamparm sparm;
+ sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ sparm.parm.output = oparm;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
+ DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
+ performance might be affected");
+ }
+
+ }
}
-
- }
}
- }
- prev_ts = act_timestamp;
+ prev_ts = act_timestamp;
}
void omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
{
- if (rst_prev_ts && VALID_TS(act_timestamp))
- {
- prev_ts = act_timestamp;
- rst_prev_ts = false;
- }
- else if (VALID_TS(prev_ts))
- {
- bool codec_cond = (drv_ctx.timestamp_adjust)?
- (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
- (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
- (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
- if(frm_int > 0 && codec_cond)
- {
- DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
- act_timestamp = prev_ts + frm_int;
- DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
- prev_ts = act_timestamp;
+ if (rst_prev_ts && VALID_TS(act_timestamp)) {
+ prev_ts = act_timestamp;
+ rst_prev_ts = false;
+ } else if (VALID_TS(prev_ts)) {
+ bool codec_cond = (drv_ctx.timestamp_adjust)?
+ (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
+ (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
+ (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
+ if (frm_int > 0 && codec_cond) {
+ DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
+ act_timestamp = prev_ts + frm_int;
+ DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
+ prev_ts = act_timestamp;
+ } else
+ set_frame_rate(act_timestamp);
+ } else if (frm_int > 0) // In this case the frame rate was set along
+ { // with the port definition, start ts with 0
+ act_timestamp = prev_ts = 0; // and correct if a valid ts is received.
+ rst_prev_ts = true;
}
- else
- set_frame_rate(act_timestamp);
- }
- else if (frm_int > 0) // In this case the frame rate was set along
- { // with the port definition, start ts with 0
- act_timestamp = prev_ts = 0; // and correct if a valid ts is received.
- rst_prev_ts = true;
- }
}
void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
{
- OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
- OMX_U32 num_conceal_MB = 0;
- OMX_U32 frame_rate = 0;
- int consumed_len = 0;
- OMX_U32 num_MB_in_frame;
- OMX_U32 recovery_sei_flags = 1;
- int enable = 0;
- OMX_U32 mbaff = 0;
- int buf_index = p_buf_hdr - m_out_mem_ptr;
- struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
- OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
- p_buf_hdr->nOffset;
- if (!drv_ctx.extradata_info.uaddr) {
- return;
- }
- p_extra = (OMX_OTHER_EXTRADATATYPE *)
- ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
- char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
- if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
- p_extra = NULL;
- OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
- if (data) {
- while((consumed_len < drv_ctx.extradata_info.buffer_size)
- && (data->eType != (OMX_EXTRADATATYPE)EXTRADATA_NONE)) {
- if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
- DEBUG_PRINT_LOW("Invalid extra data size");
- break;
- }
- switch((unsigned long)data->eType) {
- case EXTRADATA_INTERLACE_VIDEO:
- struct msm_vidc_interlace_payload *payload;
- payload = (struct msm_vidc_interlace_payload *)data->data;
- mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
- if (payload && (payload->format == INTERLACE_FRAME_PROGRESSIVE) && !mbaff)
- drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
- else {
- drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
- enable = 1;
- }
- if(m_enable_android_native_buffers)
- setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
- PP_PARAM_INTERLACED, (void*)&enable);
- if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
- append_interlace_extradata(p_extra, payload->format);
- p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
- }
- break;
- case EXTRADATA_FRAME_RATE:
- struct msm_vidc_framerate_payload *frame_rate_payload;
- frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
- frame_rate = frame_rate_payload->frame_rate;
- break;
- case EXTRADATA_TIMESTAMP:
- struct msm_vidc_ts_payload *time_stamp_payload;
- time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
- p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
- p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
- break;
- case EXTRADATA_NUM_CONCEALED_MB:
- struct msm_vidc_concealmb_payload *conceal_mb_payload;
- conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
- num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
- (drv_ctx.video_resolution.frame_height + 15)) >> 8;
- num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
- break;
- case EXTRADATA_INDEX:
- int *etype;
- etype = (int *)(data->data);
- if (etype && *etype == EXTRADATA_ASPECT_RATIO) {
- struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
- aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype);
- if (aspect_ratio_payload) {
- ((struct vdec_output_frameinfo *)
- p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
- ((struct vdec_output_frameinfo *)
- p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
- }
- }
- break;
- case EXTRADATA_RECOVERY_POINT_SEI:
- struct msm_vidc_recoverysei_payload *recovery_sei_payload;
- recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
- recovery_sei_flags = recovery_sei_payload->flags;
- if (recovery_sei_flags != FRAME_RECONSTRUCTION_CORRECT) {
- p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
- DEBUG_PRINT_HIGH("\n");
- DEBUG_PRINT_HIGH("***************************************************\n");
- DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
- DEBUG_PRINT_HIGH("***************************************************\n");
- }
- break;
- case EXTRADATA_PANSCAN_WINDOW:
- panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
- break;
- case EXTRADATA_MPEG2_SEQDISP:
- struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
- seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data->data;
- if (seqdisp_payload) {
- m_disp_hor_size = seqdisp_payload->disp_width;
- m_disp_vert_size = seqdisp_payload->disp_height;
- }
- break;
- default:
- goto unrecognized_extradata;
- }
- consumed_len += data->nSize;
- data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
+ OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
+ OMX_U32 num_conceal_MB = 0;
+ OMX_U32 frame_rate = 0;
+ int consumed_len = 0;
+ OMX_U32 num_MB_in_frame;
+ OMX_U32 recovery_sei_flags = 1;
+ int enable = 0;
+ OMX_U32 mbaff = 0;
+ int buf_index = p_buf_hdr - m_out_mem_ptr;
+ struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
+ OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
+ p_buf_hdr->nOffset;
+ if (!drv_ctx.extradata_info.uaddr) {
+ return;
}
- if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
- p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
- append_frame_info_extradata(p_extra,
- num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
- panscan_payload,&((struct vdec_output_frameinfo *)
- p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);}
- }
+ p_extra = (OMX_OTHER_EXTRADATATYPE *)
+ ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
+ char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
+ if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
+ p_extra = NULL;
+ OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
+ if (data) {
+ while ((consumed_len < drv_ctx.extradata_info.buffer_size)
+ && (data->eType != (OMX_EXTRADATATYPE)EXTRADATA_NONE)) {
+ if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
+ DEBUG_PRINT_LOW("Invalid extra data size");
+ break;
+ }
+ switch ((unsigned long)data->eType) {
+ case EXTRADATA_INTERLACE_VIDEO:
+ struct msm_vidc_interlace_payload *payload;
+ payload = (struct msm_vidc_interlace_payload *)data->data;
+ mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
+ if (payload && (payload->format == INTERLACE_FRAME_PROGRESSIVE) && !mbaff)
+ drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+ else {
+ drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
+ enable = 1;
+ }
+ if (m_enable_android_native_buffers)
+ setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
+ PP_PARAM_INTERLACED, (void*)&enable);
+ if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
+ append_interlace_extradata(p_extra, payload->format);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ }
+ break;
+ case EXTRADATA_FRAME_RATE:
+ struct msm_vidc_framerate_payload *frame_rate_payload;
+ frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
+ frame_rate = frame_rate_payload->frame_rate;
+ break;
+ case EXTRADATA_TIMESTAMP:
+ struct msm_vidc_ts_payload *time_stamp_payload;
+ time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
+ p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
+ p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
+ break;
+ case EXTRADATA_NUM_CONCEALED_MB:
+ struct msm_vidc_concealmb_payload *conceal_mb_payload;
+ conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
+ num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
+ (drv_ctx.video_resolution.frame_height + 15)) >> 8;
+ num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
+ break;
+ case EXTRADATA_INDEX:
+ int *etype;
+ etype = (int *)(data->data);
+ if (etype && *etype == EXTRADATA_ASPECT_RATIO) {
+ struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
+ aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype);
+ if (aspect_ratio_payload) {
+ ((struct vdec_output_frameinfo *)
+ p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
+ ((struct vdec_output_frameinfo *)
+ p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
+ }
+ }
+ break;
+ case EXTRADATA_RECOVERY_POINT_SEI:
+ struct msm_vidc_recoverysei_payload *recovery_sei_payload;
+ recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
+ recovery_sei_flags = recovery_sei_payload->flags;
+ if (recovery_sei_flags != FRAME_RECONSTRUCTION_CORRECT) {
+ p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
+ DEBUG_PRINT_HIGH("\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
+ DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
+ }
+ break;
+ case EXTRADATA_PANSCAN_WINDOW:
+ panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
+ break;
+ case EXTRADATA_MPEG2_SEQDISP:
+ struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
+ seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data->data;
+ if (seqdisp_payload) {
+ m_disp_hor_size = seqdisp_payload->disp_width;
+ m_disp_vert_size = seqdisp_payload->disp_height;
+ }
+ break;
+ default:
+ goto unrecognized_extradata;
+ }
+ consumed_len += data->nSize;
+ data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
+ }
+ if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
+ p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+ append_frame_info_extradata(p_extra,
+ num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
+ panscan_payload,&((struct vdec_output_frameinfo *)
+ p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
+ }
+ }
unrecognized_extradata:
- if(!secure_mode && client_extradata)
- append_terminator_extradata(p_extra);
- return;
+ if (!secure_mode && client_extradata)
+ append_terminator_extradata(p_extra);
+ return;
}
OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
- bool is_internal, bool enable)
+ bool is_internal, bool enable)
{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- struct v4l2_control control;
- if(m_state != OMX_StateLoaded)
- {
- DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
- return OMX_ErrorIncorrectStateOperation;
- }
- DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d\n",
- client_extradata, requested_extradata, enable, is_internal);
-
- if (!is_internal) {
- if (enable)
- client_extradata |= requested_extradata;
- else
- client_extradata = client_extradata & ~requested_extradata;
- }
-
- if (enable) {
- if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
- control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
- if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
- DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
- " Quality of interlaced clips might be impacted.\n");
- }
- } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
- {
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
- control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
- if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
- DEBUG_PRINT_HIGH("Failed to set framerate extradata\n");
- }
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
- control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
- if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
- DEBUG_PRINT_HIGH("Failed to set concealed MB extradata\n");
- }
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
- control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
- if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
- DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata\n");
- }
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
- control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
- if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
- DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
- }
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
- control.value = V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO;
- if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
- DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
- }
- if (output_capability == V4L2_PIX_FMT_MPEG2)
- {
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
- control.value = V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
- if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
- DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
- }
- }
- } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA)
- {
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
- control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
- if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
- DEBUG_PRINT_HIGH("Failed to set timeinfo extradata\n");
- }
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ struct v4l2_control control;
+ if (m_state != OMX_StateLoaded) {
+ DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
+ return OMX_ErrorIncorrectStateOperation;
}
- }
- ret = get_buffer_req(&drv_ctx.op_buf);
- return ret;
+ DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d\n",
+ client_extradata, requested_extradata, enable, is_internal);
+
+ if (!is_internal) {
+ if (enable)
+ client_extradata |= requested_extradata;
+ else
+ client_extradata = client_extradata & ~requested_extradata;
+ }
+
+ if (enable) {
+ if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
+ " Quality of interlaced clips might be impacted.\n");
+ }
+ } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set framerate extradata\n");
+ }
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set concealed MB extradata\n");
+ }
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata\n");
+ }
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
+ }
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
+ }
+ if (output_capability == V4L2_PIX_FMT_MPEG2) {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
+ }
+ }
+ } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set timeinfo extradata\n");
+ }
+ }
+ }
+ ret = get_buffer_req(&drv_ctx.op_buf);
+ return ret;
}
OMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
{
- OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
- OMX_U8 *data_ptr = extra->data, data = 0;
- while (byte_count < extra->nDataSize)
- {
- data = *data_ptr;
- while (data)
- {
- num_MB += (data&0x01);
- data >>= 1;
+ OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
+ OMX_U8 *data_ptr = extra->data, data = 0;
+ while (byte_count < extra->nDataSize) {
+ data = *data_ptr;
+ while (data) {
+ num_MB += (data&0x01);
+ data >>= 1;
+ }
+ data_ptr++;
+ byte_count++;
}
- data_ptr++;
- byte_count++;
- }
- num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
- (drv_ctx.video_resolution.frame_height + 15)) >> 8;
- return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
+ num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
+ (drv_ctx.video_resolution.frame_height + 15)) >> 8;
+ return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
}
void omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
{
- if (!m_debug_extradata)
- return;
-
- DEBUG_PRINT_HIGH(
- "============== Extra Data ==============\n"
- " Size: %lu \n"
- " Version: %lu \n"
- " PortIndex: %lu \n"
- " Type: %x \n"
- " DataSize: %lu \n",
- extra->nSize, extra->nVersion.nVersion,
- extra->nPortIndex, extra->eType, extra->nDataSize);
-
- if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat)
- {
- OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
- DEBUG_PRINT_HIGH(
- "------ Interlace Format ------\n"
- " Size: %lu \n"
- " Version: %lu \n"
- " PortIndex: %lu \n"
- " Is Interlace Format: %d \n"
- " Interlace Formats: %lu \n"
- "=========== End of Interlace ===========\n",
- intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
- intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
- }
- else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo)
- {
- OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+ if (!m_debug_extradata)
+ return;
DEBUG_PRINT_HIGH(
- "-------- Frame Format --------\n"
- " Picture Type: %d \n"
- " Interlace Type: %d \n"
- " Pan Scan Total Frame Num: %lu \n"
- " Concealed Macro Blocks: %lu \n"
- " frame rate: %lu \n"
- " Aspect Ratio X: %lu \n"
- " Aspect Ratio Y: %lu \n",
- fminfo->ePicType,
- fminfo->interlaceType,
- fminfo->panScan.numWindows,
- fminfo->nConcealedMacroblocks,
- fminfo->nFrameRate,
- fminfo->aspectRatio.aspectRatioX,
- fminfo->aspectRatio.aspectRatioY);
+ "============== Extra Data ==============\n"
+ " Size: %lu \n"
+ " Version: %lu \n"
+ " PortIndex: %lu \n"
+ " Type: %x \n"
+ " DataSize: %lu \n",
+ extra->nSize, extra->nVersion.nVersion,
+ extra->nPortIndex, extra->eType, extra->nDataSize);
- for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++)
- {
- DEBUG_PRINT_HIGH(
- "------------------------------\n"
- " Pan Scan Frame Num: %lu \n"
- " Rectangle x: %ld \n"
- " Rectangle y: %ld \n"
- " Rectangle dx: %ld \n"
- " Rectangle dy: %ld \n",
- i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
- fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
+ if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
+ OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+ DEBUG_PRINT_HIGH(
+ "------ Interlace Format ------\n"
+ " Size: %lu \n"
+ " Version: %lu \n"
+ " PortIndex: %lu \n"
+ " Is Interlace Format: %d \n"
+ " Interlace Formats: %lu \n"
+ "=========== End of Interlace ===========\n",
+ intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
+ intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
+ } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
+ OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+
+ DEBUG_PRINT_HIGH(
+ "-------- Frame Format --------\n"
+ " Picture Type: %d \n"
+ " Interlace Type: %d \n"
+ " Pan Scan Total Frame Num: %lu \n"
+ " Concealed Macro Blocks: %lu \n"
+ " frame rate: %lu \n"
+ " Aspect Ratio X: %lu \n"
+ " Aspect Ratio Y: %lu \n",
+ fminfo->ePicType,
+ fminfo->interlaceType,
+ fminfo->panScan.numWindows,
+ fminfo->nConcealedMacroblocks,
+ fminfo->nFrameRate,
+ fminfo->aspectRatio.aspectRatioX,
+ fminfo->aspectRatio.aspectRatioY);
+
+ for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
+ DEBUG_PRINT_HIGH(
+ "------------------------------\n"
+ " Pan Scan Frame Num: %lu \n"
+ " Rectangle x: %ld \n"
+ " Rectangle y: %ld \n"
+ " Rectangle dx: %ld \n"
+ " Rectangle dy: %ld \n",
+ i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
+ fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
+ }
+
+ DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
+ } else if (extra->eType == OMX_ExtraDataNone) {
+ DEBUG_PRINT_HIGH("========== End of Terminator ===========");
+ } else {
+ DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
}
-
- DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
- }
- else if (extra->eType == OMX_ExtraDataNone)
- {
- DEBUG_PRINT_HIGH("========== End of Terminator ===========");
- }
- else
- {
- DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
- }
}
void omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
- OMX_U32 interlaced_format_type)
+ OMX_U32 interlaced_format_type)
{
- OMX_STREAMINTERLACEFORMAT *interlace_format;
- OMX_U32 mbaff = 0;
- if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
- return;
- }
- extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
- extra->nVersion.nVersion = OMX_SPEC_VERSION;
- extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
- extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
- extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
- interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
- interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
- interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
- interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
- mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
- if ((interlaced_format_type == INTERLACE_FRAME_PROGRESSIVE) && !mbaff)
- {
- interlace_format->bInterlaceFormat = OMX_FALSE;
- interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
- drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
- }
- else
- {
- interlace_format->bInterlaceFormat = OMX_TRUE;
- interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
- drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
- }
- print_debug_extradata(extra);
+ OMX_STREAMINTERLACEFORMAT *interlace_format;
+ OMX_U32 mbaff = 0;
+ if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
+ return;
+ }
+ extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
+ extra->nVersion.nVersion = OMX_SPEC_VERSION;
+ extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
+ extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
+ interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+ interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
+ interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
+ interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
+ if ((interlaced_format_type == INTERLACE_FRAME_PROGRESSIVE) && !mbaff) {
+ interlace_format->bInterlaceFormat = OMX_FALSE;
+ interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
+ drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+ } else {
+ interlace_format->bInterlaceFormat = OMX_TRUE;
+ interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
+ drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
+ }
+ print_debug_extradata(extra);
}
void omx_vdec::fill_aspect_ratio_info(
- struct vdec_aspectratioinfo *aspect_ratio_info,
- OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
+ struct vdec_aspectratioinfo *aspect_ratio_info,
+ OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
{
- m_extradata = frame_info;
- m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
- m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
- DEBUG_PRINT_LOW("aspectRatioX %lu aspectRatioX %lu", m_extradata->aspectRatio.aspectRatioX,
- m_extradata->aspectRatio.aspectRatioY);
+ m_extradata = frame_info;
+ m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
+ m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
+ DEBUG_PRINT_LOW("aspectRatioX %lu aspectRatioX %lu", m_extradata->aspectRatio.aspectRatioX,
+ m_extradata->aspectRatio.aspectRatioY);
}
void omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
- OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
+ OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
struct msm_vidc_panscan_window_payload *panscan_payload,
struct vdec_aspectratioinfo *aspect_ratio_info)
{
- OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
- struct msm_vidc_panscan_window *panscan_window;
- if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
+ OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
+ struct msm_vidc_panscan_window *panscan_window;
+ if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
return;
- }
- extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
- extra->nVersion.nVersion = OMX_SPEC_VERSION;
- extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
- extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
- extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
- frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
- switch (picture_type)
- {
- case PICTURE_TYPE_I:
- frame_info->ePicType = OMX_VIDEO_PictureTypeI;
- break;
- case PICTURE_TYPE_P:
- frame_info->ePicType = OMX_VIDEO_PictureTypeP;
- break;
- case PICTURE_TYPE_B:
- frame_info->ePicType = OMX_VIDEO_PictureTypeB;
- break;
- default:
- frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
- }
- if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
- frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
- else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
- frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
- else
- frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
- memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
- frame_info->nConcealedMacroblocks = num_conceal_mb;
- frame_info->nFrameRate = frame_rate;
- frame_info->panScan.numWindows = 0;
- if (output_capability == V4L2_PIX_FMT_MPEG2)
- {
- if (m_disp_hor_size && m_disp_vert_size)
- {
- frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
- frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
}
- }
+ extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
+ extra->nVersion.nVersion = OMX_SPEC_VERSION;
+ extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
+ extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
+ frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+ switch (picture_type) {
+ case PICTURE_TYPE_I:
+ frame_info->ePicType = OMX_VIDEO_PictureTypeI;
+ break;
+ case PICTURE_TYPE_P:
+ frame_info->ePicType = OMX_VIDEO_PictureTypeP;
+ break;
+ case PICTURE_TYPE_B:
+ frame_info->ePicType = OMX_VIDEO_PictureTypeB;
+ break;
+ default:
+ frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
+ }
+ if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
+ frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
+ else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
+ frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
+ else
+ frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
+ memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
+ frame_info->nConcealedMacroblocks = num_conceal_mb;
+ frame_info->nFrameRate = frame_rate;
+ frame_info->panScan.numWindows = 0;
+ if (output_capability == V4L2_PIX_FMT_MPEG2) {
+ if (m_disp_hor_size && m_disp_vert_size) {
+ frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
+ frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
+ }
+ }
- if(panscan_payload) {
- frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
- panscan_window = &panscan_payload->wnd[0];
- for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++)
- {
- frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
- frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
- frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
- frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
- panscan_window++;
+ if (panscan_payload) {
+ frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
+ panscan_window = &panscan_payload->wnd[0];
+ for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
+ frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
+ frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
+ frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
+ frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
+ panscan_window++;
+ }
}
- }
- fill_aspect_ratio_info(aspect_ratio_info, frame_info);
- print_debug_extradata(extra);
+ fill_aspect_ratio_info(aspect_ratio_info, frame_info);
+ print_debug_extradata(extra);
}
void omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
{
- OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
- extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
- extra->nVersion.nVersion = OMX_SPEC_VERSION;
- extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
- extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
- extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
- portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
- *portDefn = m_port_def;
- DEBUG_PRINT_LOW("append_portdef_extradata height = %lu width = %lu "
- "stride = %lu sliceheight = %lu \n",portDefn->format.video.nFrameHeight,
- portDefn->format.video.nFrameWidth,
- portDefn->format.video.nStride,
- portDefn->format.video.nSliceHeight);
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
+ extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
+ extra->nVersion.nVersion = OMX_SPEC_VERSION;
+ extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
+ extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
+ portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
+ *portDefn = m_port_def;
+ DEBUG_PRINT_LOW("append_portdef_extradata height = %lu width = %lu "
+ "stride = %lu sliceheight = %lu \n",portDefn->format.video.nFrameHeight,
+ portDefn->format.video.nFrameWidth,
+ portDefn->format.video.nStride,
+ portDefn->format.video.nSliceHeight);
}
void omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
{
- if (!client_extradata) {
- return;
- }
- extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
- extra->nVersion.nVersion = OMX_SPEC_VERSION;
- extra->eType = OMX_ExtraDataNone;
- extra->nDataSize = 0;
- extra->data[0] = 0;
+ if (!client_extradata) {
+ return;
+ }
+ extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
+ extra->nVersion.nVersion = OMX_SPEC_VERSION;
+ extra->eType = OMX_ExtraDataNone;
+ extra->nDataSize = 0;
+ extra->data[0] = 0;
- print_debug_extradata(extra);
+ print_debug_extradata(extra);
}
OMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- if (index >= drv_ctx.ip_buf.actualcount)
- {
- DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
- return OMX_ErrorInsufficientResources;
- }
- if (m_desc_buffer_ptr == NULL)
- {
- m_desc_buffer_ptr = (desc_buffer_hdr*) \
- calloc( (sizeof(desc_buffer_hdr)),
- drv_ctx.ip_buf.actualcount);
- if (m_desc_buffer_ptr == NULL)
- {
- DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
- return OMX_ErrorInsufficientResources;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ if (index >= drv_ctx.ip_buf.actualcount) {
+ DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
+ return OMX_ErrorInsufficientResources;
}
- }
+ if (m_desc_buffer_ptr == NULL) {
+ m_desc_buffer_ptr = (desc_buffer_hdr*) \
+ calloc( (sizeof(desc_buffer_hdr)),
+ drv_ctx.ip_buf.actualcount);
+ if (m_desc_buffer_ptr == NULL) {
+ DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
- m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
- if (m_desc_buffer_ptr[index].buf_addr == NULL)
- {
- DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
- return OMX_ErrorInsufficientResources;
- }
+ m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
+ if (m_desc_buffer_ptr[index].buf_addr == NULL) {
+ DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
- return eRet;
+ return eRet;
}
void omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
{
- DEBUG_PRINT_LOW("Inserting address offset (%lu) at idx (%lu)", address_offset,m_demux_entries);
- if (m_demux_entries < 8192)
- {
- m_demux_offsets[m_demux_entries++] = address_offset;
- }
- return;
+ DEBUG_PRINT_LOW("Inserting address offset (%lu) at idx (%lu)", address_offset,m_demux_entries);
+ if (m_demux_entries < 8192) {
+ m_demux_offsets[m_demux_entries++] = address_offset;
+ }
+ return;
}
void omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
{
- OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
- OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
- OMX_U32 index = 0;
+ OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
+ OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
+ OMX_U32 index = 0;
- m_demux_entries = 0;
+ m_demux_entries = 0;
- while (index < bytes_to_parse)
- {
- if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
- (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
- ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
- (buf[index+2] == 0x01)) )
- {
- //Found start code, insert address offset
- insert_demux_addr_offset(index);
- if (buf[index+2] == 0x01) // 3 byte start code
- index += 3;
- else //4 byte start code
- index += 4;
+ while (index < bytes_to_parse) {
+ if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
+ (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
+ ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
+ (buf[index+2] == 0x01)) ) {
+ //Found start code, insert address offset
+ insert_demux_addr_offset(index);
+ if (buf[index+2] == 0x01) // 3 byte start code
+ index += 3;
+ else //4 byte start code
+ index += 4;
+ } else
+ index++;
}
- else
- index++;
- }
- DEBUG_PRINT_LOW("Extracted (%lu) demux entry offsets",m_demux_entries);
- return;
+ DEBUG_PRINT_LOW("Extracted (%lu) demux entry offsets",m_demux_entries);
+ return;
}
OMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
{
- //fix this, handle 3 byte start code, vc1 terminator entry
- OMX_U8 *p_demux_data = NULL;
- OMX_U32 desc_data = 0;
- OMX_U32 start_addr = 0;
- OMX_U32 nal_size = 0;
- OMX_U32 suffix_byte = 0;
- OMX_U32 demux_index = 0;
- OMX_U32 buffer_index = 0;
+ //fix this, handle 3 byte start code, vc1 terminator entry
+ OMX_U8 *p_demux_data = NULL;
+ OMX_U32 desc_data = 0;
+ OMX_U32 start_addr = 0;
+ OMX_U32 nal_size = 0;
+ OMX_U32 suffix_byte = 0;
+ OMX_U32 demux_index = 0;
+ OMX_U32 buffer_index = 0;
- if (m_desc_buffer_ptr == NULL)
- {
- DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
- return OMX_ErrorBadParameter;
- }
-
- buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
- if (buffer_index > drv_ctx.ip_buf.actualcount)
- {
- DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
- return OMX_ErrorBadParameter;
- }
-
- p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
-
- if ( ((OMX_U8*)p_demux_data == NULL) ||
- ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
- {
- DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
- return OMX_ErrorBadParameter;
- }
- else
- {
- for (; demux_index < m_demux_entries; demux_index++)
- {
- desc_data = 0;
- start_addr = m_demux_offsets[demux_index];
- if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
- {
- suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
- }
- else
- {
- suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
- }
- if (demux_index < (m_demux_entries - 1))
- {
- nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
- }
- else
- {
- nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
- }
- DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%lx),nal_size(%lu),demux_index(%lu)",
- (void *)start_addr,
- suffix_byte,
- nal_size,
- demux_index);
- desc_data = (start_addr >> 3) << 1;
- desc_data |= (start_addr & 7) << 21;
- desc_data |= suffix_byte << 24;
-
- memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
- memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
- memset(p_demux_data + 8, 0, sizeof(OMX_U32));
- memset(p_demux_data + 12, 0, sizeof(OMX_U32));
-
- p_demux_data += 16;
+ if (m_desc_buffer_ptr == NULL) {
+ DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
+ return OMX_ErrorBadParameter;
}
- if (codec_type_parse == CODEC_TYPE_VC1)
- {
- DEBUG_PRINT_LOW("VC1 terminator entry");
- desc_data = 0;
- desc_data = 0x82 << 24;
- memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
- memset(p_demux_data + 4, 0, sizeof(OMX_U32));
- memset(p_demux_data + 8, 0, sizeof(OMX_U32));
- memset(p_demux_data + 12, 0, sizeof(OMX_U32));
- p_demux_data += 16;
- m_demux_entries++;
- }
- //Add zero word to indicate end of descriptors
- memset(p_demux_data, 0, sizeof(OMX_U32));
- m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
- DEBUG_PRINT_LOW("desc table data size=%lu", m_desc_buffer_ptr[buffer_index].desc_data_size);
- }
- memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
- m_demux_entries = 0;
- DEBUG_PRINT_LOW("Demux table complete!");
- return OMX_ErrorNone;
+ buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
+ if (buffer_index > drv_ctx.ip_buf.actualcount) {
+ DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
+ return OMX_ErrorBadParameter;
+ }
+
+ p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
+
+ if ( ((OMX_U8*)p_demux_data == NULL) ||
+ ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
+ DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
+ return OMX_ErrorBadParameter;
+ } else {
+ for (; demux_index < m_demux_entries; demux_index++) {
+ desc_data = 0;
+ start_addr = m_demux_offsets[demux_index];
+ if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
+ suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
+ } else {
+ suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
+ }
+ if (demux_index < (m_demux_entries - 1)) {
+ nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
+ } else {
+ nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
+ }
+ DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%lx),nal_size(%lu),demux_index(%lu)",
+ (void *)start_addr,
+ suffix_byte,
+ nal_size,
+ demux_index);
+ desc_data = (start_addr >> 3) << 1;
+ desc_data |= (start_addr & 7) << 21;
+ desc_data |= suffix_byte << 24;
+
+ memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
+ memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
+ memset(p_demux_data + 8, 0, sizeof(OMX_U32));
+ memset(p_demux_data + 12, 0, sizeof(OMX_U32));
+
+ p_demux_data += 16;
+ }
+ if (codec_type_parse == CODEC_TYPE_VC1) {
+ DEBUG_PRINT_LOW("VC1 terminator entry");
+ desc_data = 0;
+ desc_data = 0x82 << 24;
+ memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
+ memset(p_demux_data + 4, 0, sizeof(OMX_U32));
+ memset(p_demux_data + 8, 0, sizeof(OMX_U32));
+ memset(p_demux_data + 12, 0, sizeof(OMX_U32));
+ p_demux_data += 16;
+ m_demux_entries++;
+ }
+ //Add zero word to indicate end of descriptors
+ memset(p_demux_data, 0, sizeof(OMX_U32));
+
+ m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
+ DEBUG_PRINT_LOW("desc table data size=%lu", m_desc_buffer_ptr[buffer_index].desc_data_size);
+ }
+ memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+ m_demux_entries = 0;
+ DEBUG_PRINT_LOW("Demux table complete!");
+ return OMX_ErrorNone;
}
OMX_ERRORTYPE omx_vdec::createDivxDrmContext()
{
- OMX_ERRORTYPE err = OMX_ErrorNone;
- iDivXDrmDecrypt = DivXDrmDecrypt::Create();
- if (iDivXDrmDecrypt) {
- OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
- if(err!=OMX_ErrorNone) {
+ OMX_ERRORTYPE err = OMX_ErrorNone;
+ iDivXDrmDecrypt = DivXDrmDecrypt::Create();
+ if (iDivXDrmDecrypt) {
+ OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
+ if (err!=OMX_ErrorNone) {
DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err);
delete iDivXDrmDecrypt;
iDivXDrmDecrypt = NULL;
- }
- }
- else {
- DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
- err = OMX_ErrorUndefined;
- }
- return err;
+ }
+ } else {
+ DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
+ err = OMX_ErrorUndefined;
+ }
+ return err;
}
omx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
{
- enabled = false;
- omx = NULL;
- init_members();
- ColorFormat = OMX_COLOR_FormatMax;
+ enabled = false;
+ omx = NULL;
+ init_members();
+ ColorFormat = OMX_COLOR_FormatMax;
}
void omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
{
- omx = reinterpret_cast<omx_vdec*>(client);
+ omx = reinterpret_cast<omx_vdec*>(client);
}
-void omx_vdec::allocate_color_convert_buf::init_members() {
- allocated_count = 0;
- buffer_size_req = 0;
- buffer_alignment_req = 0;
- memset(m_platform_list_client,0,sizeof(m_platform_list_client));
- memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
- memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
- memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
+void omx_vdec::allocate_color_convert_buf::init_members()
+{
+ allocated_count = 0;
+ buffer_size_req = 0;
+ buffer_alignment_req = 0;
+ memset(m_platform_list_client,0,sizeof(m_platform_list_client));
+ memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
+ memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
+ memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
#ifdef USE_ION
- memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
+ memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
#endif
- for (int i = 0; i < MAX_COUNT;i++)
- pmem_fd[i] = -1;
+ for (int i = 0; i < MAX_COUNT; i++)
+ pmem_fd[i] = -1;
}
-omx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() {
- c2d.destroy();
+omx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
+{
+ c2d.destroy();
}
bool omx_vdec::allocate_color_convert_buf::update_buffer_req()
{
- bool status = true;
- unsigned int src_size = 0, destination_size = 0;
- OMX_COLOR_FORMATTYPE drv_color_format;
- if (!omx){
- DEBUG_PRINT_ERROR("\n Invalid client in color convert");
- return false;
- }
- if (!enabled){
- DEBUG_PRINT_HIGH("\n No color conversion required");
- return status;
- }
- pthread_mutex_lock(&omx->c_lock);
- if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
- ColorFormat != OMX_COLOR_FormatYUV420Planar) {
- DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
- status = false;
- goto fail_update_buf_req;
- }
- c2d.close();
- status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
- omx->drv_ctx.video_resolution.frame_width,
- NV12_128m,YCbCr420P);
- if (status) {
- status = c2d.get_buffer_size(C2D_INPUT,src_size);
- if (status)
- status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
- }
- if (status) {
- if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
- !destination_size) {
- DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
- "driver size %d destination size %d",
- src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
- status = false;
- c2d.close();
- buffer_size_req = 0;
- } else {
- buffer_size_req = destination_size;
- if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
- buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
- if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
- buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+ bool status = true;
+ unsigned int src_size = 0, destination_size = 0;
+ OMX_COLOR_FORMATTYPE drv_color_format;
+ if (!omx) {
+ DEBUG_PRINT_ERROR("\n Invalid client in color convert");
+ return false;
}
- }
+ if (!enabled) {
+ DEBUG_PRINT_HIGH("\n No color conversion required");
+ return status;
+ }
+ pthread_mutex_lock(&omx->c_lock);
+ if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
+ ColorFormat != OMX_COLOR_FormatYUV420Planar) {
+ DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
+ status = false;
+ goto fail_update_buf_req;
+ }
+ c2d.close();
+ status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
+ omx->drv_ctx.video_resolution.frame_width,
+ NV12_128m,YCbCr420P);
+ if (status) {
+ status = c2d.get_buffer_size(C2D_INPUT,src_size);
+ if (status)
+ status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
+ }
+ if (status) {
+ if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
+ !destination_size) {
+ DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
+ "driver size %d destination size %d",
+ src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
+ status = false;
+ c2d.close();
+ buffer_size_req = 0;
+ } else {
+ buffer_size_req = destination_size;
+ if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
+ buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
+ if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
+ buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+ }
+ }
fail_update_buf_req:
- pthread_mutex_unlock(&omx->c_lock);
- return status;
+ pthread_mutex_unlock(&omx->c_lock);
+ return status;
}
bool omx_vdec::allocate_color_convert_buf::set_color_format(
- OMX_COLOR_FORMATTYPE dest_color_format)
+ OMX_COLOR_FORMATTYPE dest_color_format)
{
- bool status = true;
- OMX_COLOR_FORMATTYPE drv_color_format;
- if (!omx){
- DEBUG_PRINT_ERROR("\n Invalid client in color convert");
- return false;
- }
- pthread_mutex_lock(&omx->c_lock);
- if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
- drv_color_format = (OMX_COLOR_FORMATTYPE)
- QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
- else {
- DEBUG_PRINT_ERROR("\n Incorrect color format");
- status = false;
- }
- if (status && (drv_color_format != dest_color_format)) {
- DEBUG_PRINT_LOW("Enabling C2D\n");
- if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
- DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
- status = false;
- } else {
- ColorFormat = OMX_COLOR_FormatYUV420Planar;
- if (enabled)
- c2d.destroy();
- enabled = false;
- if (!c2d.init()) {
- DEBUG_PRINT_ERROR("\n open failed for c2d");
- status = false;
- } else
- enabled = true;
+ bool status = true;
+ OMX_COLOR_FORMATTYPE drv_color_format;
+ if (!omx) {
+ DEBUG_PRINT_ERROR("\n Invalid client in color convert");
+ return false;
}
- } else {
- if (enabled)
- c2d.destroy();
- enabled = false;
- }
- pthread_mutex_unlock(&omx->c_lock);
- return status;
+ pthread_mutex_lock(&omx->c_lock);
+ if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
+ drv_color_format = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+ else {
+ DEBUG_PRINT_ERROR("\n Incorrect color format");
+ status = false;
+ }
+ if (status && (drv_color_format != dest_color_format)) {
+ DEBUG_PRINT_LOW("Enabling C2D\n");
+ if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
+ DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
+ status = false;
+ } else {
+ ColorFormat = OMX_COLOR_FormatYUV420Planar;
+ if (enabled)
+ c2d.destroy();
+ enabled = false;
+ if (!c2d.init()) {
+ DEBUG_PRINT_ERROR("\n open failed for c2d");
+ status = false;
+ } else
+ enabled = true;
+ }
+ } else {
+ if (enabled)
+ c2d.destroy();
+ enabled = false;
+ }
+ pthread_mutex_unlock(&omx->c_lock);
+ return status;
}
OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
{
- if (!omx){
- DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
- return NULL;
- }
- if (!enabled)
- return omx->m_out_mem_ptr;
- return m_out_mem_ptr_client;
-}
-
-OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
- (OMX_BUFFERHEADERTYPE *bufadd)
-{
- if (!omx){
- DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
- return NULL;
- }
- if (!enabled)
- return bufadd;
-
- unsigned index = 0;
- index = bufadd - omx->m_out_mem_ptr;
- if (index < omx->drv_ctx.op_buf.actualcount) {
- m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
- m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
- bool status;
- if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
- pthread_mutex_lock(&omx->c_lock);
- status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
- omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index],
- pmem_baseaddress[index], pmem_baseaddress[index]);
- pthread_mutex_unlock(&omx->c_lock);
- m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
- if (!status){
- DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
- m_out_mem_ptr_client[index].nFilledLen = 0;
- return &m_out_mem_ptr_client[index];
- }
- } else
- m_out_mem_ptr_client[index].nFilledLen = 0;
- return &m_out_mem_ptr_client[index];
- }
- DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
- return NULL;
-}
-
-OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
- (OMX_BUFFERHEADERTYPE *bufadd)
-{
- if (!omx){
- DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
- return NULL;
- }
- if (!enabled)
- return bufadd;
- unsigned index = 0;
- index = bufadd - m_out_mem_ptr_client;
- if (index < omx->drv_ctx.op_buf.actualcount) {
- return &omx->m_out_mem_ptr[index];
- }
- DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
- return NULL;
-}
-bool omx_vdec::allocate_color_convert_buf::get_buffer_req
- (unsigned int &buffer_size)
-{
- bool status = true;
- pthread_mutex_lock(&omx->c_lock);
- if (!enabled)
- buffer_size = omx->drv_ctx.op_buf.buffer_size;
- else {
- if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
- DEBUG_PRINT_ERROR("\n Get buffer size failed");
- status = false;
- goto fail_get_buffer_size;
+ if (!omx) {
+ DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+ return NULL;
}
- }
- if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
+ if (!enabled)
+ return omx->m_out_mem_ptr;
+ return m_out_mem_ptr_client;
+}
+
+ OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
+(OMX_BUFFERHEADERTYPE *bufadd)
+{
+ if (!omx) {
+ DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+ return NULL;
+ }
+ if (!enabled)
+ return bufadd;
+
+ unsigned index = 0;
+ index = bufadd - omx->m_out_mem_ptr;
+ if (index < omx->drv_ctx.op_buf.actualcount) {
+ m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
+ m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
+ bool status;
+ if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
+ pthread_mutex_lock(&omx->c_lock);
+ status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
+ omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index],
+ pmem_baseaddress[index], pmem_baseaddress[index]);
+ pthread_mutex_unlock(&omx->c_lock);
+ m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
+ if (!status) {
+ DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
+ m_out_mem_ptr_client[index].nFilledLen = 0;
+ return &m_out_mem_ptr_client[index];
+ }
+ } else
+ m_out_mem_ptr_client[index].nFilledLen = 0;
+ return &m_out_mem_ptr_client[index];
+ }
+ DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
+ return NULL;
+}
+
+ OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
+(OMX_BUFFERHEADERTYPE *bufadd)
+{
+ if (!omx) {
+ DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
+ return NULL;
+ }
+ if (!enabled)
+ return bufadd;
+ unsigned index = 0;
+ index = bufadd - m_out_mem_ptr_client;
+ if (index < omx->drv_ctx.op_buf.actualcount) {
+ return &omx->m_out_mem_ptr[index];
+ }
+ DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
+ return NULL;
+}
+ bool omx_vdec::allocate_color_convert_buf::get_buffer_req
+(unsigned int &buffer_size)
+{
+ bool status = true;
+ pthread_mutex_lock(&omx->c_lock);
+ if (!enabled)
buffer_size = omx->drv_ctx.op_buf.buffer_size;
- if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
- buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
+ else {
+ if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
+ DEBUG_PRINT_ERROR("\n Get buffer size failed");
+ status = false;
+ goto fail_get_buffer_size;
+ }
+ }
+ if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
+ buffer_size = omx->drv_ctx.op_buf.buffer_size;
+ if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
+ buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
fail_get_buffer_size:
- pthread_mutex_unlock(&omx->c_lock);
- return status;
+ pthread_mutex_unlock(&omx->c_lock);
+ return status;
}
OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
- OMX_BUFFERHEADERTYPE *bufhdr) {
- unsigned int index = 0;
+ OMX_BUFFERHEADERTYPE *bufhdr)
+{
+ unsigned int index = 0;
- if (!enabled)
- return omx->free_output_buffer(bufhdr);
- if (enabled && omx->is_component_secure())
- return OMX_ErrorNone;
- if (!allocated_count || !bufhdr) {
- DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
- return OMX_ErrorBadParameter;
- }
- index = bufhdr - m_out_mem_ptr_client;
- if (index >= omx->drv_ctx.op_buf.actualcount){
- DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
- return OMX_ErrorBadParameter;
- }
- if (pmem_fd[index] > 0) {
- munmap(pmem_baseaddress[index], buffer_size_req);
- close(pmem_fd[index]);
- }
- pmem_fd[index] = -1;
+ if (!enabled)
+ return omx->free_output_buffer(bufhdr);
+ if (enabled && omx->is_component_secure())
+ return OMX_ErrorNone;
+ if (!allocated_count || !bufhdr) {
+ DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
+ return OMX_ErrorBadParameter;
+ }
+ index = bufhdr - m_out_mem_ptr_client;
+ if (index >= omx->drv_ctx.op_buf.actualcount) {
+ DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
+ return OMX_ErrorBadParameter;
+ }
+ if (pmem_fd[index] > 0) {
+ munmap(pmem_baseaddress[index], buffer_size_req);
+ close(pmem_fd[index]);
+ }
+ pmem_fd[index] = -1;
#ifdef USE_ION
- omx->free_ion_memory(&op_buf_ion_info[index]);
+ omx->free_ion_memory(&op_buf_ion_info[index]);
#endif
- m_heap_ptr[index].video_heap_ptr = NULL;
- if (allocated_count > 0)
- allocated_count--;
- else
- allocated_count = 0;
- if (!allocated_count) {
- pthread_mutex_lock(&omx->c_lock);
- c2d.close();
- init_members();
- pthread_mutex_unlock(&omx->c_lock);
- }
- return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
+ m_heap_ptr[index].video_heap_ptr = NULL;
+ if (allocated_count > 0)
+ allocated_count--;
+ else
+ allocated_count = 0;
+ if (!allocated_count) {
+ pthread_mutex_lock(&omx->c_lock);
+ c2d.close();
+ init_members();
+ pthread_mutex_unlock(&omx->c_lock);
+ }
+ return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
}
OMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
- OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
+ OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- if (!enabled){
- eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
- return eRet;
- }
- if (enabled && omx->is_component_secure()) {
- DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
- omx->is_component_secure());
- return OMX_ErrorUnsupportedSetting;
- }
- if (!bufferHdr || bytes > buffer_size_req) {
- DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
- DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %lu",
- buffer_size_req,bytes);
- return OMX_ErrorBadParameter;
- }
- if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
- DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
- return OMX_ErrorInsufficientResources;
- }
- OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
- eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
- port,appData,omx->drv_ctx.op_buf.buffer_size);
- if (eRet != OMX_ErrorNone || !temp_bufferHdr){
- DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
- return eRet;
- }
- if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
- omx->drv_ctx.op_buf.actualcount) {
- DEBUG_PRINT_ERROR("\n Invalid header index %d",
- (temp_bufferHdr - omx->m_out_mem_ptr));
- return OMX_ErrorUndefined;
- }
- unsigned int i = allocated_count;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ if (!enabled) {
+ eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
+ return eRet;
+ }
+ if (enabled && omx->is_component_secure()) {
+ DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
+ omx->is_component_secure());
+ return OMX_ErrorUnsupportedSetting;
+ }
+ if (!bufferHdr || bytes > buffer_size_req) {
+ DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
+ DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %lu",
+ buffer_size_req,bytes);
+ return OMX_ErrorBadParameter;
+ }
+ if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
+ DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
+ return OMX_ErrorInsufficientResources;
+ }
+ OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
+ eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
+ port,appData,omx->drv_ctx.op_buf.buffer_size);
+ if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
+ DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
+ return eRet;
+ }
+ if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
+ omx->drv_ctx.op_buf.actualcount) {
+ DEBUG_PRINT_ERROR("\n Invalid header index %d",
+ (temp_bufferHdr - omx->m_out_mem_ptr));
+ return OMX_ErrorUndefined;
+ }
+ unsigned int i = allocated_count;
#ifdef USE_ION
- op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
- buffer_size_req,buffer_alignment_req,
- &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
- 0);
- pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
- if (op_buf_ion_info[i].ion_device_fd < 0) {
- DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
- return OMX_ErrorInsufficientResources;
- }
- pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
- PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
+ op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
+ buffer_size_req,buffer_alignment_req,
+ &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
+ 0);
+ pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
+ if (op_buf_ion_info[i].ion_device_fd < 0) {
+ DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
+ return OMX_ErrorInsufficientResources;
+ }
+ pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
+ PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
- if (pmem_baseaddress[i] == MAP_FAILED) {
- DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
- close(pmem_fd[i]);
- omx->free_ion_memory(&op_buf_ion_info[i]);
- return OMX_ErrorInsufficientResources;
- }
- m_heap_ptr[i].video_heap_ptr = new VideoHeap (
- op_buf_ion_info[i].ion_device_fd,buffer_size_req,
- pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
+ if (pmem_baseaddress[i] == MAP_FAILED) {
+ DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
+ close(pmem_fd[i]);
+ omx->free_ion_memory(&op_buf_ion_info[i]);
+ return OMX_ErrorInsufficientResources;
+ }
+ m_heap_ptr[i].video_heap_ptr = new VideoHeap (
+ op_buf_ion_info[i].ion_device_fd,buffer_size_req,
+ pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
#endif
- m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
- m_pmem_info_client[i].offset = 0;
- m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
- m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
- m_platform_list_client[i].nEntries = 1;
- m_platform_list_client[i].entryList = &m_platform_entry_client[i];
- m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
- m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
- m_out_mem_ptr_client[i].nFilledLen = 0;
- m_out_mem_ptr_client[i].nFlags = 0;
- m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
- m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
- m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
- m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
- m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
- m_out_mem_ptr_client[i].pAppPrivate = appData;
- *bufferHdr = &m_out_mem_ptr_client[i];
- DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
- allocated_count++;
- return eRet;
+ m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
+ m_pmem_info_client[i].offset = 0;
+ m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
+ m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+ m_platform_list_client[i].nEntries = 1;
+ m_platform_list_client[i].entryList = &m_platform_entry_client[i];
+ m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
+ m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
+ m_out_mem_ptr_client[i].nFilledLen = 0;
+ m_out_mem_ptr_client[i].nFlags = 0;
+ m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
+ m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
+ m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
+ m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
+ m_out_mem_ptr_client[i].pAppPrivate = appData;
+ *bufferHdr = &m_out_mem_ptr_client[i];
+ DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
+ allocated_count++;
+ return eRet;
}
bool omx_vdec::is_component_secure()
{
- return secure_mode;
+ return secure_mode;
}
bool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
{
- bool status = true;
- if (!enabled) {
- if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
- dest_color_format = (OMX_COLOR_FORMATTYPE)
- QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
- else
- status = false;
- } else {
- if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
- status = false;
- } else
- dest_color_format = OMX_COLOR_FormatYUV420Planar;
- }
- return status;
+ bool status = true;
+ if (!enabled) {
+ if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
+ dest_color_format = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
+ else
+ status = false;
+ } else {
+ if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
+ status = false;
+ } else
+ dest_color_format = OMX_COLOR_FormatYUV420Planar;
+ }
+ return status;
}