summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIliyan Malchev <malchev@google.com>2012-06-21 16:19:10 -0700
committerIliyan Malchev <malchev@google.com>2012-06-21 16:21:47 -0700
commit826ececcbea342f7a0b92ec61847f1c95d384e05 (patch)
tree60f73e9d2ece6fde3843852225ba14390d5b1c7a
parentbac93072368cffe559a5621f32e6549e77ffc9cf (diff)
downloadandroid_hardware_qcom_media-826ececcbea342f7a0b92ec61847f1c95d384e05.tar.gz
android_hardware_qcom_media-826ececcbea342f7a0b92ec61847f1c95d384e05.tar.bz2
android_hardware_qcom_media-826ececcbea342f7a0b92ec61847f1c95d384e05.zip
qcom/media: update media code
Change-Id: I8fab90e0696562b21b22143d3357d518cad6d8cc Signed-off-by: Iliyan Malchev <malchev@google.com>
-rwxr-xr-x[-rw-r--r--]CleanSpec.mk0
-rwxr-xr-x[-rw-r--r--]libstagefrighthw/Android.mk9
-rwxr-xr-x[-rw-r--r--]libstagefrighthw/MODULE_LICENSE_APACHE20
-rwxr-xr-x[-rw-r--r--]libstagefrighthw/NOTICE0
-rwxr-xr-xlibstagefrighthw/QComOMXMetadata.h30
-rwxr-xr-x[-rw-r--r--]libstagefrighthw/QComOMXPlugin.cpp54
-rwxr-xr-x[-rw-r--r--]libstagefrighthw/QComOMXPlugin.h2
-rwxr-xr-x[-rw-r--r--]mm-core/Android.mk122
-rwxr-xr-xmm-core/inc/OMX_Audio.h1311
-rwxr-xr-xmm-core/inc/OMX_Component.h579
-rwxr-xr-xmm-core/inc/OMX_ContentPipe.h195
-rwxr-xr-xmm-core/inc/OMX_Core.h1431
-rwxr-xr-xmm-core/inc/OMX_CoreExt.h66
-rwxr-xr-xmm-core/inc/OMX_IVCommon.h920
-rwxr-xr-xmm-core/inc/OMX_Image.h328
-rwxr-xr-xmm-core/inc/OMX_Index.h258
-rwxr-xr-xmm-core/inc/OMX_IndexExt.h85
-rwxr-xr-xmm-core/inc/OMX_Other.h337
-rwxr-xr-xmm-core/inc/OMX_QCOMExtns.h873
-rwxr-xr-xmm-core/inc/OMX_Types.h347
-rwxr-xr-xmm-core/inc/OMX_Video.h1061
-rwxr-xr-xmm-core/inc/QOMX_AudioExtensions.h511
-rwxr-xr-xmm-core/inc/QOMX_AudioIndexExtensions.h78
-rwxr-xr-xmm-core/inc/QOMX_CoreExtensions.h164
-rwxr-xr-xmm-core/inc/QOMX_FileFormatExtensions.h137
-rwxr-xr-xmm-core/inc/QOMX_IVCommonExtensions.h399
-rwxr-xr-xmm-core/inc/QOMX_SourceExtensions.h157
-rwxr-xr-xmm-core/inc/QOMX_StreamingExtensions.h486
-rwxr-xr-xmm-core/inc/QOMX_VideoExtensions.h580
-rwxr-xr-xmm-core/inc/drmplay_version.h34
-rwxr-xr-xmm-core/inc/qc_omx_common.h65
-rwxr-xr-xmm-core/inc/qc_omx_component.h183
-rwxr-xr-xmm-core/inc/qc_omx_msg.h57
-rw-r--r--mm-core/omxcore/Android.mk2
-rwxr-xr-xmm-core/src/7627A/qc_registry_table.c780
-rwxr-xr-xmm-core/src/7627A/qc_registry_table_android.c679
-rwxr-xr-xmm-core/src/8660/qc_registry_table.c671
-rwxr-xr-xmm-core/src/8660/qc_registry_table_android.c468
-rwxr-xr-xmm-core/src/8960/qc_registry_table.c272
-rwxr-xr-xmm-core/src/8960/qc_registry_table_android.c463
-rwxr-xr-xmm-core/src/8974/qc_registry_table.c448
-rwxr-xr-xmm-core/src/8974/qc_registry_table_android.c495
-rwxr-xr-xmm-core/src/common/omx_core_cmp.cpp406
-rwxr-xr-xmm-core/src/common/omx_core_cmp.h160
-rwxr-xr-xmm-core/src/common/qc_omx_core.c830
-rwxr-xr-xmm-core/src/common/qc_omx_core.h72
-rwxr-xr-xmm-core/src/default/qc_registry_table.c65
-rwxr-xr-xmm-core/src/default/qc_registry_table_android.c62
-rwxr-xr-x[-rw-r--r--]mm-video/Android.mk39
-rwxr-xr-xmm-video/DivxDrmDecrypt/Android.mk22
-rwxr-xr-xmm-video/DivxDrmDecrypt/inc/DivXDrmDecrypt.h49
-rwxr-xr-xmm-video/DivxDrmDecrypt/src/DivXDrmDecrypt.cpp98
-rwxr-xr-xmm-video/vidc/common/inc/extra_data_handler.h103
-rwxr-xr-xmm-video/vidc/common/src/extra_data_handler.cpp478
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/Android.mk132
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/inc/Map.h2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/inc/decoder_driver_test.h3
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/inc/frameparser.h31
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/inc/h264_utils.h276
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/inc/message_queue.h2
-rwxr-xr-xmm-video/vidc/vdec/inc/mp4_utils.h172
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/inc/omx_vdec.h410
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/inc/qtypes.h2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/inc/queue.h2
-rwxr-xr-xmm-video/vidc/vdec/inc/ts_parser.h88
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/src/frameparser.cpp324
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/src/h264_utils.cpp1283
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/src/message_queue.c6
-rwxr-xr-xmm-video/vidc/vdec/src/mp4_utils.cpp331
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/src/omx_vdec.cpp6420
-rwxr-xr-xmm-video/vidc/vdec/src/omx_vdec_copper.cpp8438
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/src/queue.c2
-rwxr-xr-xmm-video/vidc/vdec/src/ts_parser.cpp273
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/test/decoder_driver_test.c105
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/vdec/test/omx_vdec_test.cpp2718
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/Android.mk107
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/inc/camera_test.h2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/inc/fb_test.h2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/inc/omx_video_base.h103
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/inc/omx_video_common.h14
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/inc/omx_video_encoder.h21
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/inc/queue.h2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/inc/venc_util.h2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/inc/video_encoder_device.h90
-rwxr-xr-xmm-video/vidc/venc/inc/video_encoder_device_copper.h288
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/inc/video_encoder_test.h2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/src/omx_video_base.cpp1032
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/src/omx_video_encoder.cpp622
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/src/video_encoder_device.cpp1608
-rwxr-xr-xmm-video/vidc/venc/src/video_encoder_device_copper.cpp3012
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/test/camera_test.cpp2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/test/fb_test.c2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/test/queue.c2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/test/venc_test.cpp892
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/test/venc_util.c2
-rwxr-xr-x[-rw-r--r--]mm-video/vidc/venc/test/video_encoder_test.c109
96 files changed, 42709 insertions, 3748 deletions
diff --git a/CleanSpec.mk b/CleanSpec.mk
index b84e1b65..b84e1b65 100644..100755
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
diff --git a/libstagefrighthw/Android.mk b/libstagefrighthw/Android.mk
index 8b448c13..2a307ef7 100644..100755
--- a/libstagefrighthw/Android.mk
+++ b/libstagefrighthw/Android.mk
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2010 The Android Open Source Project
+# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -14,8 +14,6 @@
# limitations under the License.
#
-ifeq ($(TARGET_BOARD_PLATFORM),msm7x30)
-
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
@@ -25,8 +23,8 @@ LOCAL_SRC_FILES := \
LOCAL_CFLAGS := $(PV_CFLAGS_MINUS_VISIBILITY)
LOCAL_C_INCLUDES:= \
- $(TOP)/frameworks/native/include/media/hardware \
- $(TOP)/frameworks/native/include/media/openmax
+ frameworks/native/include/media/openmax \
+ frameworks/native/include/media/hardware
LOCAL_SHARED_LIBRARIES := \
libbinder \
@@ -39,4 +37,3 @@ LOCAL_MODULE := libstagefrighthw
include $(BUILD_SHARED_LIBRARY)
-endif
diff --git a/libstagefrighthw/MODULE_LICENSE_APACHE2 b/libstagefrighthw/MODULE_LICENSE_APACHE2
index e69de29b..e69de29b 100644..100755
--- a/libstagefrighthw/MODULE_LICENSE_APACHE2
+++ b/libstagefrighthw/MODULE_LICENSE_APACHE2
diff --git a/libstagefrighthw/NOTICE b/libstagefrighthw/NOTICE
index a94ca1f6..a94ca1f6 100644..100755
--- a/libstagefrighthw/NOTICE
+++ b/libstagefrighthw/NOTICE
diff --git a/libstagefrighthw/QComOMXMetadata.h b/libstagefrighthw/QComOMXMetadata.h
new file mode 100755
index 00000000..fe7e802b
--- /dev/null
+++ b/libstagefrighthw/QComOMXMetadata.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011 The Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <system/window.h>
+
+namespace android {
+
+ typedef enum {
+ kMetadataBufferTypeCameraSource = 0,
+ kMetadataBufferTypeGrallocSource = 1,
+ } MetadataBufferType;
+
+ typedef struct encoder_media_buffer_type {
+ MetadataBufferType buffer_type;
+ buffer_handle_t meta_handle;
+ } encoder_media_buffer_type;
+}
diff --git a/libstagefrighthw/QComOMXPlugin.cpp b/libstagefrighthw/QComOMXPlugin.cpp
index fa9c8d70..8d5a51c6 100644..100755
--- a/libstagefrighthw/QComOMXPlugin.cpp
+++ b/libstagefrighthw/QComOMXPlugin.cpp
@@ -18,28 +18,10 @@
#include <dlfcn.h>
-#include <HardwareAPI.h>
+#include <media/hardware/HardwareAPI.h>
namespace android {
-static const char kPrefix[] = "7x30.";
-
-static OMX_ERRORTYPE AddPrefix(char *name) {
- if (strncmp("OMX.qcom.", name, 9)) {
- return OMX_ErrorUndefined;
- }
- String8 tmp(name, 9);
- tmp.append(kPrefix);
- tmp.append(&name[9]);
- strcpy(name, tmp.string());
- return OMX_ErrorNone;
-}
-
-static void RemovePrefix(const char *name, String8 *out) {
- out->setTo(name, 9); // "OMX.qcom."
- out->append(&name[9 + strlen(kPrefix)]);
-}
-
OMXPluginBase *createOMXPlugin() {
return new QComOMXPlugin;
}
@@ -88,10 +70,6 @@ OMX_ERRORTYPE QComOMXPlugin::makeComponentInstance(
return OMX_ErrorUndefined;
}
- String8 tmp;
- RemovePrefix(name, &tmp);
- name = tmp.string();
-
return (*mGetHandle)(
reinterpret_cast<OMX_HANDLETYPE *>(component),
const_cast<char *>(name),
@@ -115,13 +93,7 @@ OMX_ERRORTYPE QComOMXPlugin::enumerateComponents(
return OMX_ErrorUndefined;
}
- OMX_ERRORTYPE res = (*mComponentNameEnum)(name, size, index);
-
- if (res != OMX_ErrorNone) {
- return res;
- }
-
- return AddPrefix(name);
+ return (*mComponentNameEnum)(name, size, index);
}
OMX_ERRORTYPE QComOMXPlugin::getRolesOfComponent(
@@ -133,10 +105,6 @@ OMX_ERRORTYPE QComOMXPlugin::getRolesOfComponent(
return OMX_ErrorUndefined;
}
- String8 tmp;
- RemovePrefix(name, &tmp);
- name = tmp.string();
-
OMX_U32 numRoles;
OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)(
const_cast<OMX_STRING>(name), &numRoles, NULL);
@@ -155,15 +123,17 @@ OMX_ERRORTYPE QComOMXPlugin::getRolesOfComponent(
err = (*mGetRolesOfComponentHandle)(
const_cast<OMX_STRING>(name), &numRoles2, array);
- if (err == OMX_ErrorNone && numRoles != numRoles2) {
- err = OMX_ErrorUndefined;
- }
+ if (err != OMX_ErrorNone) {
+ return err;
+ }
+
+ if (numRoles2 != numRoles) {
+ return err;
+ }
for (OMX_U32 i = 0; i < numRoles; ++i) {
- if (err == OMX_ErrorNone) {
- String8 s((const char *)array[i]);
- roles->push(s);
- }
+ String8 s((const char *)array[i]);
+ roles->push(s);
delete[] array[i];
array[i] = NULL;
@@ -173,7 +143,7 @@ OMX_ERRORTYPE QComOMXPlugin::getRolesOfComponent(
array = NULL;
}
- return err;
+ return OMX_ErrorNone;
}
} // namespace android
diff --git a/libstagefrighthw/QComOMXPlugin.h b/libstagefrighthw/QComOMXPlugin.h
index 432e19a9..fc623e3a 100644..100755
--- a/libstagefrighthw/QComOMXPlugin.h
+++ b/libstagefrighthw/QComOMXPlugin.h
@@ -18,7 +18,7 @@
#define QCOM_OMX_PLUGIN_H_
-#include <OMXPluginBase.h>
+#include <media/hardware/OMXPluginBase.h>
namespace android {
diff --git a/mm-core/Android.mk b/mm-core/Android.mk
index ad9949a6..fcf81374 100644..100755
--- a/mm-core/Android.mk
+++ b/mm-core/Android.mk
@@ -1,38 +1,96 @@
-#--------------------------------------------------------------------------
-#Copyright (c) 2009, Code Aurora Forum. All rights reserved.
-
-#Redistribution and use in source and binary forms, with or without
-#modification, are permitted provided that the following conditions are met:
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# * Neither the name of Code Aurora nor
-# the names of its contributors may be used to endorse or promote
-# products derived from this software without specific prior written
-# permission.
-
-#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-#IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-#NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-#CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-#EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-#PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-#OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-#WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-#OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-#ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#--------------------------------------------------------------------------
-
-OMX_CORE_PATH := $(call my-dir)
+ifneq ($(BUILD_TINY_ANDROID),true)
+
+LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-ifneq ($(BUILD_TINY_ANDROID),true)
+OMXCORE_CFLAGS += -D_ANDROID_
+OMXCORE_CFLAGS += -U_ENABLE_QC_MSG_LOG_
-ifeq ($(TARGET_BOARD_PLATFORM),msm7x30)
- include $(OMX_CORE_PATH)/omxcore/Android.mk
+#===============================================================================
+# Figure out the targets
+#===============================================================================
+
+ifeq ($(TARGET_BOARD_PLATFORM),msm7627a)
+MM_CORE_TARGET = 7627A
+else ifeq ($(TARGET_BOARD_PLATFORM),msm8660)
+MM_CORE_TARGET = 8660
+#Comment out following line to disable drm.play component
+OMXCORE_CFLAGS += -DENABLE_DRMPLAY
+else ifeq ($(TARGET_BOARD_PLATFORM),msm8960)
+MM_CORE_TARGET = 8960
+else ifeq ($(TARGET_BOARD_PLATFORM),msm8974)
+MM_CORE_TARGET = 8974
+else
+MM_CORE_TARGET = default
endif
+#===============================================================================
+# Deploy the headers that can be exposed
+#===============================================================================
+
+LOCAL_COPY_HEADERS_TO := mm-core/omxcore
+LOCAL_COPY_HEADERS := inc/OMX_Audio.h
+LOCAL_COPY_HEADERS += inc/OMX_Component.h
+LOCAL_COPY_HEADERS += inc/OMX_ContentPipe.h
+LOCAL_COPY_HEADERS += inc/OMX_Core.h
+LOCAL_COPY_HEADERS += inc/OMX_Image.h
+LOCAL_COPY_HEADERS += inc/OMX_Index.h
+LOCAL_COPY_HEADERS += inc/OMX_IVCommon.h
+LOCAL_COPY_HEADERS += inc/OMX_Other.h
+LOCAL_COPY_HEADERS += inc/OMX_QCOMExtns.h
+LOCAL_COPY_HEADERS += inc/OMX_Types.h
+LOCAL_COPY_HEADERS += inc/OMX_Video.h
+LOCAL_COPY_HEADERS += inc/qc_omx_common.h
+LOCAL_COPY_HEADERS += inc/qc_omx_component.h
+LOCAL_COPY_HEADERS += inc/qc_omx_msg.h
+LOCAL_COPY_HEADERS += inc/QOMX_AudioExtensions.h
+LOCAL_COPY_HEADERS += inc/QOMX_AudioIndexExtensions.h
+LOCAL_COPY_HEADERS += inc/OMX_CoreExt.h
+LOCAL_COPY_HEADERS += inc/QOMX_CoreExtensions.h
+LOCAL_COPY_HEADERS += inc/QOMX_FileFormatExtensions.h
+LOCAL_COPY_HEADERS += inc/QOMX_IVCommonExtensions.h
+LOCAL_COPY_HEADERS += inc/QOMX_SourceExtensions.h
+LOCAL_COPY_HEADERS += inc/QOMX_VideoExtensions.h
+LOCAL_COPY_HEADERS += inc/OMX_IndexExt.h
+LOCAL_COPY_HEADERS += inc/QOMX_StreamingExtensions.h
+
+
+#===============================================================================
+# LIBRARY for Android apps
+#===============================================================================
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/src/common
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/inc
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libOmxCore
+LOCAL_MODULE_TAGS := optional
+LOCAL_SHARED_LIBRARIES := liblog libdl
+LOCAL_CFLAGS := $(OMXCORE_CFLAGS)
+
+LOCAL_SRC_FILES := src/common/omx_core_cmp.cpp
+LOCAL_SRC_FILES += src/common/qc_omx_core.c
+LOCAL_SRC_FILES += src/$(MM_CORE_TARGET)/qc_registry_table_android.c
+
+include $(BUILD_SHARED_LIBRARY)
+
+#===============================================================================
+# LIBRARY for command line test apps
+#===============================================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/src/common
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/inc
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libmm-omxcore
+LOCAL_MODULE_TAGS := optional
+LOCAL_SHARED_LIBRARIES := liblog libdl
+LOCAL_CFLAGS := $(OMXCORE_CFLAGS)
+
+LOCAL_SRC_FILES := src/common/omx_core_cmp.cpp
+LOCAL_SRC_FILES += src/common/qc_omx_core.c
+LOCAL_SRC_FILES += src/$(MM_CORE_TARGET)/qc_registry_table.c
+
+include $(BUILD_SHARED_LIBRARY)
+
endif #BUILD_TINY_ANDROID
diff --git a/mm-core/inc/OMX_Audio.h b/mm-core/inc/OMX_Audio.h
new file mode 100755
index 00000000..04f1a999
--- /dev/null
+++ b/mm-core/inc/OMX_Audio.h
@@ -0,0 +1,1311 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/** @file OMX_Audio.h - OpenMax IL version 1.1.2
+ * The structures needed by Audio components to exchange
+ * parameters and configuration data with the componenmilts.
+ */
+
+#ifndef OMX_Audio_h
+#define OMX_Audio_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Each OMX header must include all required header files to allow the
+ * header to compile without errors. The includes below are required
+ * for this header file to compile successfully
+ */
+
+#include <OMX_Core.h>
+
+/** @defgroup midi MIDI
+ * @ingroup audio
+ */
+
+/** @defgroup effects Audio effects
+ * @ingroup audio
+ */
+
+/** @defgroup audio OpenMAX IL Audio Domain
+ * Structures for OpenMAX IL Audio domain
+ * @{
+ */
+
+/** Enumeration used to define the possible audio codings.
+ * If "OMX_AUDIO_CodingUnused" is selected, the coding selection must
+ * be done in a vendor specific way. Since this is for an audio
+ * processing element this enum is relevant. However, for another
+ * type of component other enums would be in this area.
+ */
+typedef enum OMX_AUDIO_CODINGTYPE {
+ OMX_AUDIO_CodingUnused = 0, /**< Placeholder value when coding is N/A */
+ OMX_AUDIO_CodingAutoDetect, /**< auto detection of audio format */
+ OMX_AUDIO_CodingPCM, /**< Any variant of PCM coding */
+ OMX_AUDIO_CodingADPCM, /**< Any variant of ADPCM encoded data */
+ OMX_AUDIO_CodingAMR, /**< Any variant of AMR encoded data */
+ OMX_AUDIO_CodingGSMFR, /**< Any variant of GSM fullrate (i.e. GSM610) */
+ OMX_AUDIO_CodingGSMEFR, /**< Any variant of GSM Enhanced Fullrate encoded data*/
+ OMX_AUDIO_CodingGSMHR, /**< Any variant of GSM Halfrate encoded data */
+ OMX_AUDIO_CodingPDCFR, /**< Any variant of PDC Fullrate encoded data */
+ OMX_AUDIO_CodingPDCEFR, /**< Any variant of PDC Enhanced Fullrate encoded data */
+ OMX_AUDIO_CodingPDCHR, /**< Any variant of PDC Halfrate encoded data */
+ OMX_AUDIO_CodingTDMAFR, /**< Any variant of TDMA Fullrate encoded data (TIA/EIA-136-420) */
+ OMX_AUDIO_CodingTDMAEFR, /**< Any variant of TDMA Enhanced Fullrate encoded data (TIA/EIA-136-410) */
+ OMX_AUDIO_CodingQCELP8, /**< Any variant of QCELP 8kbps encoded data */
+ OMX_AUDIO_CodingQCELP13, /**< Any variant of QCELP 13kbps encoded data */
+ OMX_AUDIO_CodingEVRC, /**< Any variant of EVRC encoded data */
+ OMX_AUDIO_CodingSMV, /**< Any variant of SMV encoded data */
+ OMX_AUDIO_CodingG711, /**< Any variant of G.711 encoded data */
+ OMX_AUDIO_CodingG723, /**< Any variant of G.723 dot 1 encoded data */
+ OMX_AUDIO_CodingG726, /**< Any variant of G.726 encoded data */
+ OMX_AUDIO_CodingG729, /**< Any variant of G.729 encoded data */
+ OMX_AUDIO_CodingAAC, /**< Any variant of AAC encoded data */
+ OMX_AUDIO_CodingMP3, /**< Any variant of MP3 encoded data */
+ OMX_AUDIO_CodingSBC, /**< Any variant of SBC encoded data */
+ OMX_AUDIO_CodingVORBIS, /**< Any variant of VORBIS encoded data */
+ OMX_AUDIO_CodingWMA, /**< Any variant of WMA encoded data */
+ OMX_AUDIO_CodingRA, /**< Any variant of RA encoded data */
+ OMX_AUDIO_CodingMIDI, /**< Any variant of MIDI encoded data */
+ OMX_AUDIO_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_CodingMax = 0x7FFFFFFF
+} OMX_AUDIO_CODINGTYPE;
+
+
+/** The PortDefinition structure is used to define all of the parameters
+ * necessary for the compliant component to setup an input or an output audio
+ * path. If additional information is needed to define the parameters of the
+ * port (such as frequency), additional structures must be sent such as the
+ * OMX_AUDIO_PARAM_PCMMODETYPE structure to supply the extra parameters for the port.
+ */
+typedef struct OMX_AUDIO_PORTDEFINITIONTYPE {
+ OMX_STRING cMIMEType; /**< MIME type of data for the port */
+ OMX_NATIVE_DEVICETYPE pNativeRender; /** < platform specific reference
+ for an output device,
+ otherwise this field is 0 */
+ OMX_BOOL bFlagErrorConcealment; /**< Turns on error concealment if it is
+ supported by the OMX component */
+ OMX_AUDIO_CODINGTYPE eEncoding; /**< Type of data expected for this
+ port (e.g. PCM, AMR, MP3, etc) */
+} OMX_AUDIO_PORTDEFINITIONTYPE;
+
+
+/** Port format parameter. This structure is used to enumerate
+ * the various data input/output format supported by the port.
+ */
+typedef struct OMX_AUDIO_PARAM_PORTFORMATTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Indicates which port to set */
+ OMX_U32 nIndex; /**< Indicates the enumeration index for the format from 0x0 to N-1 */
+ OMX_AUDIO_CODINGTYPE eEncoding; /**< Type of data expected for this port (e.g. PCM, AMR, MP3, etc) */
+} OMX_AUDIO_PARAM_PORTFORMATTYPE;
+
+
+/** PCM mode type */
+typedef enum OMX_AUDIO_PCMMODETYPE {
+ OMX_AUDIO_PCMModeLinear = 0, /**< Linear PCM encoded data */
+ OMX_AUDIO_PCMModeALaw, /**< A law PCM encoded data (G.711) */
+ OMX_AUDIO_PCMModeMULaw, /**< Mu law PCM encoded data (G.711) */
+ OMX_AUDIO_PCMModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_PCMModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_PCMModeMax = 0x7FFFFFFF
+} OMX_AUDIO_PCMMODETYPE;
+
+
+typedef enum OMX_AUDIO_CHANNELTYPE {
+ OMX_AUDIO_ChannelNone = 0x0, /**< Unused or empty */
+ OMX_AUDIO_ChannelLF = 0x1, /**< Left front */
+ OMX_AUDIO_ChannelRF = 0x2, /**< Right front */
+ OMX_AUDIO_ChannelCF = 0x3, /**< Center front */
+ OMX_AUDIO_ChannelLS = 0x4, /**< Left surround */
+ OMX_AUDIO_ChannelRS = 0x5, /**< Right surround */
+ OMX_AUDIO_ChannelLFE = 0x6, /**< Low frequency effects */
+ OMX_AUDIO_ChannelCS = 0x7, /**< Back surround */
+ OMX_AUDIO_ChannelLR = 0x8, /**< Left rear. */
+ OMX_AUDIO_ChannelRR = 0x9, /**< Right rear. */
+ OMX_AUDIO_ChannelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_ChannelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_ChannelMax = 0x7FFFFFFF
+} OMX_AUDIO_CHANNELTYPE;
+
+#define OMX_AUDIO_MAXCHANNELS 16 /**< maximum number distinct audio channels that a buffer may contain */
+#define OMX_MIN_PCMPAYLOAD_MSEC 5 /**< Minimum audio buffer payload size for uncompressed (PCM) audio */
+
+/** PCM format description */
+typedef struct OMX_AUDIO_PARAM_PCMMODETYPE {
+ OMX_U32 nSize; /**< Size of this structure, in Bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels (e.g. 2 for stereo) */
+ OMX_NUMERICALDATATYPE eNumData; /**< indicates PCM data as signed or unsigned */
+ OMX_ENDIANTYPE eEndian; /**< indicates PCM data as little or big endian */
+ OMX_BOOL bInterleaved; /**< True for normal interleaved data; false for
+ non-interleaved data (e.g. block data) */
+ OMX_U32 nBitPerSample; /**< Bit per sample */
+ OMX_U32 nSamplingRate; /**< Sampling rate of the source data. Use 0 for
+ variable or unknown sampling rate. */
+ OMX_AUDIO_PCMMODETYPE ePCMMode; /**< PCM mode enumeration */
+ OMX_AUDIO_CHANNELTYPE eChannelMapping[OMX_AUDIO_MAXCHANNELS]; /**< Slot i contains channel defined by eChannelMap[i] */
+
+} OMX_AUDIO_PARAM_PCMMODETYPE;
+
+
+/** Audio channel mode. This is used by both AAC and MP3, although the names are more appropriate
+ * for the MP3. For example, JointStereo for MP3 is CouplingChannels for AAC.
+ */
+typedef enum OMX_AUDIO_CHANNELMODETYPE {
+ OMX_AUDIO_ChannelModeStereo = 0, /**< 2 channels, the bitrate allocation between those
+ two channels changes accordingly to each channel information */
+ OMX_AUDIO_ChannelModeJointStereo, /**< mode that takes advantage of what is common between
+ 2 channels for higher compression gain */
+ OMX_AUDIO_ChannelModeDual, /**< 2 mono-channels, each channel is encoded with half
+ the bitrate of the overall bitrate */
+ OMX_AUDIO_ChannelModeMono, /**< Mono channel mode */
+ OMX_AUDIO_ChannelModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_ChannelModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_ChannelModeMax = 0x7FFFFFFF
+} OMX_AUDIO_CHANNELMODETYPE;
+
+
+typedef enum OMX_AUDIO_MP3STREAMFORMATTYPE {
+ OMX_AUDIO_MP3StreamFormatMP1Layer3 = 0, /**< MP3 Audio MPEG 1 Layer 3 Stream format */
+ OMX_AUDIO_MP3StreamFormatMP2Layer3, /**< MP3 Audio MPEG 2 Layer 3 Stream format */
+ OMX_AUDIO_MP3StreamFormatMP2_5Layer3, /**< MP3 Audio MPEG2.5 Layer 3 Stream format */
+ OMX_AUDIO_MP3StreamFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_MP3StreamFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_MP3StreamFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_MP3STREAMFORMATTYPE;
+
+/** MP3 params */
+typedef struct OMX_AUDIO_PARAM_MP3TYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels */
+ OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable
+ rate or unknown bit rates */
+ OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for
+ variable or unknown sampling rate. */
+ OMX_U32 nAudioBandWidth; /**< Audio band width (in Hz) to which an encoder should
+ limit the audio signal. Use 0 to let encoder decide */
+ OMX_AUDIO_CHANNELMODETYPE eChannelMode; /**< Channel mode enumeration */
+ OMX_AUDIO_MP3STREAMFORMATTYPE eFormat; /**< MP3 stream format */
+} OMX_AUDIO_PARAM_MP3TYPE;
+
+
+typedef enum OMX_AUDIO_AACSTREAMFORMATTYPE {
+ OMX_AUDIO_AACStreamFormatMP2ADTS = 0, /**< AAC Audio Data Transport Stream 2 format */
+ OMX_AUDIO_AACStreamFormatMP4ADTS, /**< AAC Audio Data Transport Stream 4 format */
+ OMX_AUDIO_AACStreamFormatMP4LOAS, /**< AAC Low Overhead Audio Stream format */
+ OMX_AUDIO_AACStreamFormatMP4LATM, /**< AAC Low overhead Audio Transport Multiplex */
+ OMX_AUDIO_AACStreamFormatADIF, /**< AAC Audio Data Interchange Format */
+ OMX_AUDIO_AACStreamFormatMP4FF, /**< AAC inside MPEG-4/ISO File Format */
+ OMX_AUDIO_AACStreamFormatRAW, /**< AAC Raw Format */
+ OMX_AUDIO_AACStreamFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_AACStreamFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_AACStreamFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_AACSTREAMFORMATTYPE;
+
+
+/** AAC mode type. Note that the term profile is used with the MPEG-2
+ * standard and the term object type and profile is used with MPEG-4 */
+typedef enum OMX_AUDIO_AACPROFILETYPE{
+ OMX_AUDIO_AACObjectNull = 0, /**< Null, not used */
+ OMX_AUDIO_AACObjectMain = 1, /**< AAC Main object */
+ OMX_AUDIO_AACObjectLC, /**< AAC Low Complexity object (AAC profile) */
+ OMX_AUDIO_AACObjectSSR, /**< AAC Scalable Sample Rate object */
+ OMX_AUDIO_AACObjectLTP, /**< AAC Long Term Prediction object */
+ OMX_AUDIO_AACObjectHE, /**< AAC High Efficiency (object type SBR, HE-AAC profile) */
+ OMX_AUDIO_AACObjectScalable, /**< AAC Scalable object */
+ OMX_AUDIO_AACObjectERLC = 17, /**< ER AAC Low Complexity object (Error Resilient AAC-LC) */
+ OMX_AUDIO_AACObjectLD = 23, /**< AAC Low Delay object (Error Resilient) */
+ OMX_AUDIO_AACObjectHE_PS = 29, /**< AAC High Efficiency with Parametric Stereo coding (HE-AAC v2, object type PS) */
+ OMX_AUDIO_AACObjectKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_AACObjectVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_AACObjectMax = 0x7FFFFFFF
+} OMX_AUDIO_AACPROFILETYPE;
+
+
+/** AAC tool usage (for nAACtools in OMX_AUDIO_PARAM_AACPROFILETYPE).
+ * Required for encoder configuration and optional as decoder info output.
+ * For MP3, OMX_AUDIO_CHANNELMODETYPE is sufficient. */
+#define OMX_AUDIO_AACToolNone 0x00000000 /**< no AAC tools allowed (encoder config) or active (decoder info output) */
+#define OMX_AUDIO_AACToolMS 0x00000001 /**< MS: Mid/side joint coding tool allowed or active */
+#define OMX_AUDIO_AACToolIS 0x00000002 /**< IS: Intensity stereo tool allowed or active */
+#define OMX_AUDIO_AACToolTNS 0x00000004 /**< TNS: Temporal Noise Shaping tool allowed or active */
+#define OMX_AUDIO_AACToolPNS 0x00000008 /**< PNS: MPEG-4 Perceptual Noise substitution tool allowed or active */
+#define OMX_AUDIO_AACToolLTP 0x00000010 /**< LTP: MPEG-4 Long Term Prediction tool allowed or active */
+#define OMX_AUDIO_AACToolAll 0x7FFFFFFF /**< all AAC tools allowed or active (*/
+
+/** MPEG-4 AAC error resilience (ER) tool usage (for nAACERtools in OMX_AUDIO_PARAM_AACPROFILETYPE).
+ * Required for ER encoder configuration and optional as decoder info output */
+#define OMX_AUDIO_AACERNone 0x00000000 /**< no AAC ER tools allowed/used */
+#define OMX_AUDIO_AACERVCB11 0x00000001 /**< VCB11: Virtual Code Books for AAC section data */
+#define OMX_AUDIO_AACERRVLC 0x00000002 /**< RVLC: Reversible Variable Length Coding */
+#define OMX_AUDIO_AACERHCR 0x00000004 /**< HCR: Huffman Codeword Reordering */
+#define OMX_AUDIO_AACERAll 0x7FFFFFFF /**< all AAC ER tools allowed/used */
+
+
+/** AAC params */
+typedef struct OMX_AUDIO_PARAM_AACPROFILETYPE {
+ OMX_U32 nSize; /**< Size of this structure, in Bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels */
+ OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for
+ variable or unknown sampling rate. */
+ OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable
+ rate or unknown bit rates */
+ OMX_U32 nAudioBandWidth; /**< Audio band width (in Hz) to which an encoder should
+ limit the audio signal. Use 0 to let encoder decide */
+ OMX_U32 nFrameLength; /**< Frame length (in audio samples per channel) of the codec.
+ Can be 1024 or 960 (AAC-LC), 2048 (HE-AAC), 480 or 512 (AAC-LD).
+ Use 0 to let encoder decide */
+ OMX_U32 nAACtools; /**< AAC tool usage */
+ OMX_U32 nAACERtools; /**< MPEG-4 AAC error resilience tool usage */
+ OMX_AUDIO_AACPROFILETYPE eAACProfile; /**< AAC profile enumeration */
+ OMX_AUDIO_AACSTREAMFORMATTYPE eAACStreamFormat; /**< AAC stream format enumeration */
+ OMX_AUDIO_CHANNELMODETYPE eChannelMode; /**< Channel mode enumeration */
+} OMX_AUDIO_PARAM_AACPROFILETYPE;
+
+
+/** VORBIS params */
+typedef struct OMX_AUDIO_PARAM_VORBISTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels */
+ OMX_U32 nBitRate; /**< Bit rate of the encoded data data. Use 0 for variable
+ rate or unknown bit rates. Encoding is set to the
+ bitrate closest to specified value (in bps) */
+ OMX_U32 nMinBitRate; /**< Sets minimum bitrate (in bps). */
+ OMX_U32 nMaxBitRate; /**< Sets maximum bitrate (in bps). */
+
+ OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for
+ variable or unknown sampling rate. */
+ OMX_U32 nAudioBandWidth; /**< Audio band width (in Hz) to which an encoder should
+ limit the audio signal. Use 0 to let encoder decide */
+ OMX_S32 nQuality; /**< Sets encoding quality to n, between -1 (low) and 10 (high).
+ In the default mode of operation, teh quality level is 3.
+ Normal quality range is 0 - 10. */
+ OMX_BOOL bManaged; /**< Set bitrate management mode. This turns off the
+ normal VBR encoding, but allows hard or soft bitrate
+ constraints to be enforced by the encoder. This mode can
+ be slower, and may also be lower quality. It is
+ primarily useful for streaming. */
+ OMX_BOOL bDownmix; /**< Downmix input from stereo to mono (has no effect on
+ non-stereo streams). Useful for lower-bitrate encoding. */
+} OMX_AUDIO_PARAM_VORBISTYPE;
+
+
+/** WMA Version */
+typedef enum OMX_AUDIO_WMAFORMATTYPE {
+ OMX_AUDIO_WMAFormatUnused = 0, /**< format unused or unknown */
+ OMX_AUDIO_WMAFormat7, /**< Windows Media Audio format 7 */
+ OMX_AUDIO_WMAFormat8, /**< Windows Media Audio format 8 */
+ OMX_AUDIO_WMAFormat9, /**< Windows Media Audio format 9 */
+ OMX_AUDIO_WMAFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_WMAFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_WMAFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_WMAFORMATTYPE;
+
+
+/** WMA Profile */
+typedef enum OMX_AUDIO_WMAPROFILETYPE {
+ OMX_AUDIO_WMAProfileUnused = 0, /**< profile unused or unknown */
+ OMX_AUDIO_WMAProfileL1, /**< Windows Media audio version 9 profile L1 */
+ OMX_AUDIO_WMAProfileL2, /**< Windows Media audio version 9 profile L2 */
+ OMX_AUDIO_WMAProfileL3, /**< Windows Media audio version 9 profile L3 */
+ OMX_AUDIO_WMAProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_WMAProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_WMAProfileMax = 0x7FFFFFFF
+} OMX_AUDIO_WMAPROFILETYPE;
+
+
+/** WMA params */
+typedef struct OMX_AUDIO_PARAM_WMATYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U16 nChannels; /**< Number of channels */
+ OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable
+ rate or unknown bit rates */
+ OMX_AUDIO_WMAFORMATTYPE eFormat; /**< Version of WMA stream / data */
+ OMX_AUDIO_WMAPROFILETYPE eProfile; /**< Profile of WMA stream / data */
+ OMX_U32 nSamplingRate; /**< Sampling rate of the source data */
+ OMX_U16 nBlockAlign; /**< is the block alignment, or block size, in bytes of the audio codec */
+ OMX_U16 nEncodeOptions; /**< WMA Type-specific data */
+ OMX_U32 nSuperBlockAlign; /**< WMA Type-specific data */
+} OMX_AUDIO_PARAM_WMATYPE;
+
+/**
+ * RealAudio format
+ */
+typedef enum OMX_AUDIO_RAFORMATTYPE {
+ OMX_AUDIO_RAFormatUnused = 0, /**< Format unused or unknown */
+ OMX_AUDIO_RA8, /**< RealAudio 8 codec */
+ OMX_AUDIO_RA9, /**< RealAudio 9 codec */
+ OMX_AUDIO_RA10_AAC, /**< MPEG-4 AAC codec for bitrates of more than 128kbps */
+ OMX_AUDIO_RA10_CODEC, /**< RealAudio codec for bitrates less than 128 kbps */
+ OMX_AUDIO_RA10_LOSSLESS, /**< RealAudio Lossless */
+ OMX_AUDIO_RA10_MULTICHANNEL, /**< RealAudio Multichannel */
+ OMX_AUDIO_RA10_VOICE, /**< RealAudio Voice for bitrates below 15 kbps */
+ OMX_AUDIO_RAFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_RAFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_RAFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_RAFORMATTYPE;
+
+/** RA (Real Audio) params */
+typedef struct OMX_AUDIO_PARAM_RATYPE {
+ OMX_U32 nSize; /**< Size of this structure, in Bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels */
+ OMX_U32 nSamplingRate; /**< is the sampling rate of the source data */
+ OMX_U32 nBitsPerFrame; /**< is the value for bits per frame */
+ OMX_U32 nSamplePerFrame; /**< is the value for samples per frame */
+ OMX_U32 nCouplingQuantBits; /**< is the number of coupling quantization bits in the stream */
+ OMX_U32 nCouplingStartRegion; /**< is the coupling start region in the stream */
+ OMX_U32 nNumRegions; /**< is the number of regions value */
+ OMX_AUDIO_RAFORMATTYPE eFormat; /**< is the RealAudio audio format */
+} OMX_AUDIO_PARAM_RATYPE;
+
+
+/** SBC Allocation Method Type */
+typedef enum OMX_AUDIO_SBCALLOCMETHODTYPE {
+ OMX_AUDIO_SBCAllocMethodLoudness, /**< Loudness allocation method */
+ OMX_AUDIO_SBCAllocMethodSNR, /**< SNR allocation method */
+ OMX_AUDIO_SBCAllocMethodKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_SBCAllocMethodVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_SBCAllocMethodMax = 0x7FFFFFFF
+} OMX_AUDIO_SBCALLOCMETHODTYPE;
+
+
+/** SBC params */
+typedef struct OMX_AUDIO_PARAM_SBCTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels */
+ OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable
+ rate or unknown bit rates */
+ OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for
+ variable or unknown sampling rate. */
+ OMX_U32 nBlocks; /**< Number of blocks */
+ OMX_U32 nSubbands; /**< Number of subbands */
+ OMX_U32 nBitPool; /**< Bitpool value */
+ OMX_BOOL bEnableBitrate; /**< Use bitrate value instead of bitpool */
+ OMX_AUDIO_CHANNELMODETYPE eChannelMode; /**< Channel mode enumeration */
+ OMX_AUDIO_SBCALLOCMETHODTYPE eSBCAllocType; /**< SBC Allocation method type */
+} OMX_AUDIO_PARAM_SBCTYPE;
+
+
+/** ADPCM stream format parameters */
+typedef struct OMX_AUDIO_PARAM_ADPCMTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_U32 nBitsPerSample; /**< Number of bits in each sample */
+ OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for
+ variable or unknown sampling rate. */
+} OMX_AUDIO_PARAM_ADPCMTYPE;
+
+
+/** G723 rate */
+typedef enum OMX_AUDIO_G723RATE {
+ OMX_AUDIO_G723ModeUnused = 0, /**< AMRNB Mode unused / unknown */
+ OMX_AUDIO_G723ModeLow, /**< 5300 bps */
+ OMX_AUDIO_G723ModeHigh, /**< 6300 bps */
+ OMX_AUDIO_G723ModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_G723ModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_G723ModeMax = 0x7FFFFFFF
+} OMX_AUDIO_G723RATE;
+
+
+/** G723 - Sample rate must be 8 KHz */
+typedef struct OMX_AUDIO_PARAM_G723TYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_AUDIO_G723RATE eBitRate; /**< todo: Should this be moved to a config? */
+ OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */
+ OMX_BOOL bPostFilter; /**< Enable Post Filter */
+} OMX_AUDIO_PARAM_G723TYPE;
+
+
+/** ITU G726 (ADPCM) rate */
+typedef enum OMX_AUDIO_G726MODE {
+ OMX_AUDIO_G726ModeUnused = 0, /**< G726 Mode unused / unknown */
+ OMX_AUDIO_G726Mode16, /**< 16 kbps */
+ OMX_AUDIO_G726Mode24, /**< 24 kbps */
+ OMX_AUDIO_G726Mode32, /**< 32 kbps, most common rate, also G721 */
+ OMX_AUDIO_G726Mode40, /**< 40 kbps */
+ OMX_AUDIO_G726ModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_G726ModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_G726ModeMax = 0x7FFFFFFF
+} OMX_AUDIO_G726MODE;
+
+
+/** G.726 stream format parameters - must be at 8KHz */
+typedef struct OMX_AUDIO_PARAM_G726TYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_AUDIO_G726MODE eG726Mode;
+} OMX_AUDIO_PARAM_G726TYPE;
+
+
+/** G729 coder type */
+typedef enum OMX_AUDIO_G729TYPE {
+ OMX_AUDIO_G729 = 0, /**< ITU G.729 encoded data */
+ OMX_AUDIO_G729A, /**< ITU G.729 annex A encoded data */
+ OMX_AUDIO_G729B, /**< ITU G.729 with annex B encoded data */
+ OMX_AUDIO_G729AB, /**< ITU G.729 annexes A and B encoded data */
+ OMX_AUDIO_G729KhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_G729VendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_G729Max = 0x7FFFFFFF
+} OMX_AUDIO_G729TYPE;
+
+
+/** G729 stream format parameters - fixed 6KHz sample rate */
+typedef struct OMX_AUDIO_PARAM_G729TYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_AUDIO_G729TYPE eBitType;
+} OMX_AUDIO_PARAM_G729TYPE;
+
+
+/** AMR Frame format */
+typedef enum OMX_AUDIO_AMRFRAMEFORMATTYPE {
+ OMX_AUDIO_AMRFrameFormatConformance = 0, /**< Frame Format is AMR Conformance
+ (Standard) Format */
+ OMX_AUDIO_AMRFrameFormatIF1, /**< Frame Format is AMR Interface
+ Format 1 */
+ OMX_AUDIO_AMRFrameFormatIF2, /**< Frame Format is AMR Interface
+ Format 2*/
+ OMX_AUDIO_AMRFrameFormatFSF, /**< Frame Format is AMR File Storage
+ Format */
+ OMX_AUDIO_AMRFrameFormatRTPPayload, /**< Frame Format is AMR Real-Time
+ Transport Protocol Payload Format */
+ OMX_AUDIO_AMRFrameFormatITU, /**< Frame Format is ITU Format (added at Motorola request) */
+ OMX_AUDIO_AMRFrameFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_AMRFrameFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_AMRFrameFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_AMRFRAMEFORMATTYPE;
+
+
+/** AMR band mode */
+typedef enum OMX_AUDIO_AMRBANDMODETYPE {
+ OMX_AUDIO_AMRBandModeUnused = 0, /**< AMRNB Mode unused / unknown */
+ OMX_AUDIO_AMRBandModeNB0, /**< AMRNB Mode 0 = 4750 bps */
+ OMX_AUDIO_AMRBandModeNB1, /**< AMRNB Mode 1 = 5150 bps */
+ OMX_AUDIO_AMRBandModeNB2, /**< AMRNB Mode 2 = 5900 bps */
+ OMX_AUDIO_AMRBandModeNB3, /**< AMRNB Mode 3 = 6700 bps */
+ OMX_AUDIO_AMRBandModeNB4, /**< AMRNB Mode 4 = 7400 bps */
+ OMX_AUDIO_AMRBandModeNB5, /**< AMRNB Mode 5 = 7950 bps */
+ OMX_AUDIO_AMRBandModeNB6, /**< AMRNB Mode 6 = 10200 bps */
+ OMX_AUDIO_AMRBandModeNB7, /**< AMRNB Mode 7 = 12200 bps */
+ OMX_AUDIO_AMRBandModeWB0, /**< AMRWB Mode 0 = 6600 bps */
+ OMX_AUDIO_AMRBandModeWB1, /**< AMRWB Mode 1 = 8850 bps */
+ OMX_AUDIO_AMRBandModeWB2, /**< AMRWB Mode 2 = 12650 bps */
+ OMX_AUDIO_AMRBandModeWB3, /**< AMRWB Mode 3 = 14250 bps */
+ OMX_AUDIO_AMRBandModeWB4, /**< AMRWB Mode 4 = 15850 bps */
+ OMX_AUDIO_AMRBandModeWB5, /**< AMRWB Mode 5 = 18250 bps */
+ OMX_AUDIO_AMRBandModeWB6, /**< AMRWB Mode 6 = 19850 bps */
+ OMX_AUDIO_AMRBandModeWB7, /**< AMRWB Mode 7 = 23050 bps */
+ OMX_AUDIO_AMRBandModeWB8, /**< AMRWB Mode 8 = 23850 bps */
+ OMX_AUDIO_AMRBandModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_AMRBandModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_AMRBandModeMax = 0x7FFFFFFF
+} OMX_AUDIO_AMRBANDMODETYPE;
+
+
+/** AMR Discontinuous Transmission mode */
+typedef enum OMX_AUDIO_AMRDTXMODETYPE {
+ OMX_AUDIO_AMRDTXModeOff = 0, /**< AMR Discontinuous Transmission Mode is disabled */
+ OMX_AUDIO_AMRDTXModeOnVAD1, /**< AMR Discontinuous Transmission Mode using
+ Voice Activity Detector 1 (VAD1) is enabled */
+ OMX_AUDIO_AMRDTXModeOnVAD2, /**< AMR Discontinuous Transmission Mode using
+ Voice Activity Detector 2 (VAD2) is enabled */
+ OMX_AUDIO_AMRDTXModeOnAuto, /**< The codec will automatically select between
+ Off, VAD1 or VAD2 modes */
+
+ OMX_AUDIO_AMRDTXasEFR, /**< DTX as EFR instead of AMR standard (3GPP 26.101, frame type =8,9,10) */
+
+ OMX_AUDIO_AMRDTXModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_AMRDTXModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_AMRDTXModeMax = 0x7FFFFFFF
+} OMX_AUDIO_AMRDTXMODETYPE;
+
+
+/** AMR params */
+typedef struct OMX_AUDIO_PARAM_AMRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels */
+ OMX_U32 nBitRate; /**< Bit rate read only field */
+ OMX_AUDIO_AMRBANDMODETYPE eAMRBandMode; /**< AMR Band Mode enumeration */
+ OMX_AUDIO_AMRDTXMODETYPE eAMRDTXMode; /**< AMR DTX Mode enumeration */
+ OMX_AUDIO_AMRFRAMEFORMATTYPE eAMRFrameFormat; /**< AMR frame format enumeration */
+} OMX_AUDIO_PARAM_AMRTYPE;
+
+
+/** GSM_FR (ETSI 06.10, 3GPP 46.010) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_GSMFRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_GSMFRTYPE;
+
+
+/** GSM-HR (ETSI 06.20, 3GPP 46.020) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_GSMHRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_GSMHRTYPE;
+
+
+/** GSM-EFR (ETSI 06.60, 3GPP 46.060) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_GSMEFRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_GSMEFRTYPE;
+
+
+/** TDMA FR (TIA/EIA-136-420, VSELP 7.95kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_TDMAFRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_TDMAFRTYPE;
+
+
+/** TDMA EFR (TIA/EIA-136-410, ACELP 7.4kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_TDMAEFRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_TDMAEFRTYPE;
+
+
+/** PDC FR ( RCR-27, VSELP 6.7kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_PDCFRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_PDCFRTYPE;
+
+
+/** PDC EFR ( RCR-27, ACELP 6.7kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_PDCEFRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_PDCEFRTYPE;
+
+/** PDC HR ( RCR-27, PSI-CELP 3.45kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_PDCHRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */
+ OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_PDCHRTYPE;
+
+
+/** CDMA Rate types */
+typedef enum OMX_AUDIO_CDMARATETYPE {
+ OMX_AUDIO_CDMARateBlank = 0, /**< CDMA encoded frame is blank */
+ OMX_AUDIO_CDMARateFull, /**< CDMA encoded frame in full rate */
+ OMX_AUDIO_CDMARateHalf, /**< CDMA encoded frame in half rate */
+ OMX_AUDIO_CDMARateQuarter, /**< CDMA encoded frame in quarter rate */
+ OMX_AUDIO_CDMARateEighth, /**< CDMA encoded frame in eighth rate (DTX)*/
+ OMX_AUDIO_CDMARateErasure, /**< CDMA erasure frame */
+ OMX_AUDIO_CDMARateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_CDMARateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_CDMARateMax = 0x7FFFFFFF
+} OMX_AUDIO_CDMARATETYPE;
+
+
+/** QCELP8 (TIA/EIA-96, up to 8kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_QCELP8TYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable
+ rate or unknown bit rates */
+ OMX_AUDIO_CDMARATETYPE eCDMARate; /**< Frame rate */
+ OMX_U32 nMinBitRate; /**< minmal rate for the encoder = 1,2,3,4, default = 1 */
+ OMX_U32 nMaxBitRate; /**< maximal rate for the encoder = 1,2,3,4, default = 4 */
+} OMX_AUDIO_PARAM_QCELP8TYPE;
+
+
+/** QCELP13 ( CDMA, EIA/TIA-733, 13.3kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_QCELP13TYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_AUDIO_CDMARATETYPE eCDMARate; /**< Frame rate */
+ OMX_U32 nMinBitRate; /**< minmal rate for the encoder = 1,2,3,4, default = 1 */
+ OMX_U32 nMaxBitRate; /**< maximal rate for the encoder = 1,2,3,4, default = 4 */
+} OMX_AUDIO_PARAM_QCELP13TYPE;
+
+
+/** EVRC ( CDMA, EIA/TIA-127, RCELP up to 8.55kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_EVRCTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_AUDIO_CDMARATETYPE eCDMARate; /**< actual Frame rate */
+ OMX_BOOL bRATE_REDUCon; /**< RATE_REDUCtion is requested for this frame */
+ OMX_U32 nMinBitRate; /**< minmal rate for the encoder = 1,2,3,4, default = 1 */
+ OMX_U32 nMaxBitRate; /**< maximal rate for the encoder = 1,2,3,4, default = 4 */
+ OMX_BOOL bHiPassFilter; /**< Enable encoder's High Pass Filter */
+ OMX_BOOL bNoiseSuppressor; /**< Enable encoder's noise suppressor pre-processing */
+ OMX_BOOL bPostFilter; /**< Enable decoder's post Filter */
+} OMX_AUDIO_PARAM_EVRCTYPE;
+
+
+/** SMV ( up to 8.55kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_SMVTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannels; /**< Number of channels in the data stream (not
+ necessarily the same as the number of channels
+ to be rendered. */
+ OMX_AUDIO_CDMARATETYPE eCDMARate; /**< Frame rate */
+ OMX_BOOL bRATE_REDUCon; /**< RATE_REDUCtion is requested for this frame */
+ OMX_U32 nMinBitRate; /**< minmal rate for the encoder = 1,2,3,4, default = 1 ??*/
+ OMX_U32 nMaxBitRate; /**< maximal rate for the encoder = 1,2,3,4, default = 4 ??*/
+ OMX_BOOL bHiPassFilter; /**< Enable encoder's High Pass Filter ??*/
+ OMX_BOOL bNoiseSuppressor; /**< Enable encoder's noise suppressor pre-processing */
+ OMX_BOOL bPostFilter; /**< Enable decoder's post Filter ??*/
+} OMX_AUDIO_PARAM_SMVTYPE;
+
+
+/** MIDI Format
+ * @ingroup midi
+ */
+typedef enum OMX_AUDIO_MIDIFORMATTYPE
+{
+ OMX_AUDIO_MIDIFormatUnknown = 0, /**< MIDI Format unknown or don't care */
+ OMX_AUDIO_MIDIFormatSMF0, /**< Standard MIDI File Type 0 */
+ OMX_AUDIO_MIDIFormatSMF1, /**< Standard MIDI File Type 1 */
+ OMX_AUDIO_MIDIFormatSMF2, /**< Standard MIDI File Type 2 */
+ OMX_AUDIO_MIDIFormatSPMIDI, /**< SP-MIDI */
+ OMX_AUDIO_MIDIFormatXMF0, /**< eXtensible Music Format type 0 */
+ OMX_AUDIO_MIDIFormatXMF1, /**< eXtensible Music Format type 1 */
+ OMX_AUDIO_MIDIFormatMobileXMF, /**< Mobile XMF (eXtensible Music Format type 2) */
+ OMX_AUDIO_MIDIFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_MIDIFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_MIDIFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_MIDIFORMATTYPE;
+
+
+/** MIDI params
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_PARAM_MIDITYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nFileSize; /**< size of the MIDI file in bytes, where the entire
+ MIDI file passed in, otherwise if 0x0, the MIDI data
+ is merged and streamed (instead of passed as an
+ entire MIDI file) */
+ OMX_BU32 sMaxPolyphony; /**< Specifies the maximum simultaneous polyphonic
+ voices. A value of zero indicates that the default
+ polyphony of the device is used */
+ OMX_BOOL bLoadDefaultSound; /**< Whether to load default sound
+ bank at initialization */
+ OMX_AUDIO_MIDIFORMATTYPE eMidiFormat; /**< Version of the MIDI file */
+} OMX_AUDIO_PARAM_MIDITYPE;
+
+
+/** Type of the MIDI sound bank
+ * @ingroup midi
+ */
+typedef enum OMX_AUDIO_MIDISOUNDBANKTYPE {
+ OMX_AUDIO_MIDISoundBankUnused = 0, /**< unused/unknown soundbank type */
+ OMX_AUDIO_MIDISoundBankDLS1, /**< DLS version 1 */
+ OMX_AUDIO_MIDISoundBankDLS2, /**< DLS version 2 */
+ OMX_AUDIO_MIDISoundBankMobileDLSBase, /**< Mobile DLS, using the base functionality */
+ OMX_AUDIO_MIDISoundBankMobileDLSPlusOptions, /**< Mobile DLS, using the specification-defined optional feature set */
+ OMX_AUDIO_MIDISoundBankKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_MIDISoundBankVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_MIDISoundBankMax = 0x7FFFFFFF
+} OMX_AUDIO_MIDISOUNDBANKTYPE;
+
+
+/** Bank Layout describes how bank MSB & LSB are used in the DLS instrument definitions sound bank
+ * @ingroup midi
+ */
+typedef enum OMX_AUDIO_MIDISOUNDBANKLAYOUTTYPE {
+ OMX_AUDIO_MIDISoundBankLayoutUnused = 0, /**< unused/unknown soundbank type */
+ OMX_AUDIO_MIDISoundBankLayoutGM, /**< GS layout (based on bank MSB 0x00) */
+ OMX_AUDIO_MIDISoundBankLayoutGM2, /**< General MIDI 2 layout (using MSB 0x78/0x79, LSB 0x00) */
+ OMX_AUDIO_MIDISoundBankLayoutUser, /**< Does not conform to any bank numbering standards */
+ OMX_AUDIO_MIDISoundBankLayoutKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_MIDISoundBankLayoutVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_MIDISoundBankLayoutMax = 0x7FFFFFFF
+} OMX_AUDIO_MIDISOUNDBANKLAYOUTTYPE;
+
+
+/** MIDI params to load/unload user soundbank
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_PARAM_MIDILOADUSERSOUNDTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nDLSIndex; /**< DLS file index to be loaded */
+ OMX_U32 nDLSSize; /**< Size in bytes */
+ OMX_PTR pDLSData; /**< Pointer to DLS file data */
+ OMX_AUDIO_MIDISOUNDBANKTYPE eMidiSoundBank; /**< Midi sound bank type enumeration */
+ OMX_AUDIO_MIDISOUNDBANKLAYOUTTYPE eMidiSoundBankLayout; /**< Midi sound bank layout enumeration */
+} OMX_AUDIO_PARAM_MIDILOADUSERSOUNDTYPE;
+
+
+/** Structure for Live MIDI events and MIP messages.
+ * (MIP = Maximum Instantaneous Polyphony; part of the SP-MIDI standard.)
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDIIMMEDIATEEVENTTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port that this structure applies to */
+ OMX_U32 nMidiEventSize; /**< Size of immediate MIDI events or MIP message in bytes */
+ OMX_U8 nMidiEvents[1]; /**< MIDI event array to be rendered immediately, or an
+ array for the MIP message buffer, where the size is
+ indicated by nMidiEventSize */
+} OMX_AUDIO_CONFIG_MIDIIMMEDIATEEVENTTYPE;
+
+
+/** MIDI sound bank/ program pair in a given channel
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDISOUNDBANKPROGRAMTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port that this structure applies to */
+ OMX_U32 nChannel; /**< Valid channel values range from 1 to 16 */
+ OMX_U16 nIDProgram; /**< Valid program ID range is 1 to 128 */
+ OMX_U16 nIDSoundBank; /**< Sound bank ID */
+ OMX_U32 nUserSoundBankIndex;/**< User soundbank index, easier to access soundbanks
+ by index if multiple banks are present */
+} OMX_AUDIO_CONFIG_MIDISOUNDBANKPROGRAMTYPE;
+
+
+/** MIDI control
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDICONTROLTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BS32 sPitchTransposition; /**< Pitch transposition in semitones, stored as Q22.10
+ format based on JAVA MMAPI (JSR-135) requirement */
+ OMX_BU32 sPlayBackRate; /**< Relative playback rate, stored as Q14.17 fixed-point
+ number based on JSR-135 requirement */
+ OMX_BU32 sTempo ; /**< Tempo in beats per minute (BPM), stored as Q22.10
+ fixed-point number based on JSR-135 requirement */
+ OMX_U32 nMaxPolyphony; /**< Specifies the maximum simultaneous polyphonic
+ voices. A value of zero indicates that the default
+ polyphony of the device is used */
+ OMX_U32 nNumRepeat; /**< Number of times to repeat playback */
+ OMX_U32 nStopTime; /**< Time in milliseconds to indicate when playback
+ will stop automatically. Set to zero if not used */
+ OMX_U16 nChannelMuteMask; /**< 16 bit mask for channel mute status */
+ OMX_U16 nChannelSoloMask; /**< 16 bit mask for channel solo status */
+ OMX_U32 nTrack0031MuteMask; /**< 32 bit mask for track mute status. Note: This is for tracks 0-31 */
+ OMX_U32 nTrack3263MuteMask; /**< 32 bit mask for track mute status. Note: This is for tracks 32-63 */
+ OMX_U32 nTrack0031SoloMask; /**< 32 bit mask for track solo status. Note: This is for tracks 0-31 */
+ OMX_U32 nTrack3263SoloMask; /**< 32 bit mask for track solo status. Note: This is for tracks 32-63 */
+
+} OMX_AUDIO_CONFIG_MIDICONTROLTYPE;
+
+
+/** MIDI Playback States
+ * @ingroup midi
+ */
+typedef enum OMX_AUDIO_MIDIPLAYBACKSTATETYPE {
+ OMX_AUDIO_MIDIPlayBackStateUnknown = 0, /**< Unknown state or state does not map to
+ other defined states */
+ OMX_AUDIO_MIDIPlayBackStateClosedEngaged, /**< No MIDI resource is currently open.
+ The MIDI engine is currently processing
+ MIDI events. */
+ OMX_AUDIO_MIDIPlayBackStateParsing, /**< A MIDI resource is open and is being
+ primed. The MIDI engine is currently
+ processing MIDI events. */
+ OMX_AUDIO_MIDIPlayBackStateOpenEngaged, /**< A MIDI resource is open and primed but
+ not playing. The MIDI engine is currently
+ processing MIDI events. The transition to
+ this state is only possible from the
+ OMX_AUDIO_MIDIPlayBackStatePlaying state,
+ when the 'playback head' reaches the end
+ of media data or the playback stops due
+ to stop time set.*/
+ OMX_AUDIO_MIDIPlayBackStatePlaying, /**< A MIDI resource is open and currently
+ playing. The MIDI engine is currently
+ processing MIDI events.*/
+ OMX_AUDIO_MIDIPlayBackStatePlayingPartially, /**< Best-effort playback due to SP-MIDI/DLS
+ resource constraints */
+ OMX_AUDIO_MIDIPlayBackStatePlayingSilently, /**< Due to system resource constraints and
+ SP-MIDI content constraints, there is
+ no audible MIDI content during playback
+ currently. The situation may change if
+ resources are freed later.*/
+ OMX_AUDIO_MIDIPlayBackStateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_MIDIPlayBackStateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_MIDIPlayBackStateMax = 0x7FFFFFFF
+} OMX_AUDIO_MIDIPLAYBACKSTATETYPE;
+
+
+/** MIDI status
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDISTATUSTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U16 nNumTracks; /**< Number of MIDI tracks in the file, read only field.
+ NOTE: May not return a meaningful value until the entire
+ file is parsed and buffered. */
+ OMX_U32 nDuration; /**< The length of the currently open MIDI resource
+ in milliseconds. NOTE: May not return a meaningful value
+ until the entire file is parsed and buffered. */
+ OMX_U32 nPosition; /**< Current Position of the MIDI resource being played
+ in milliseconds */
+ OMX_BOOL bVibra; /**< Does Vibra track exist? NOTE: May not return a meaningful
+ value until the entire file is parsed and buffered. */
+ OMX_U32 nNumMetaEvents; /**< Total number of MIDI Meta Events in the currently
+ open MIDI resource. NOTE: May not return a meaningful value
+ until the entire file is parsed and buffered. */
+ OMX_U32 nNumActiveVoices; /**< Number of active voices in the currently playing
+ MIDI resource. NOTE: May not return a meaningful value until
+ the entire file is parsed and buffered. */
+ OMX_AUDIO_MIDIPLAYBACKSTATETYPE eMIDIPlayBackState; /**< MIDI playback state enumeration, read only field */
+} OMX_AUDIO_CONFIG_MIDISTATUSTYPE;
+
+
+/** MIDI Meta Event structure one per Meta Event.
+ * MIDI Meta Events are like audio metadata, except that they are interspersed
+ * with the MIDI content throughout the file and are not localized in the header.
+ * As such, it is necessary to retrieve information about these Meta Events from
+ * the engine, as it encounters these Meta Events within the MIDI content.
+ * For example, SMF files can have up to 14 types of MIDI Meta Events (copyright,
+ * author, default tempo, etc.) scattered throughout the file.
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDIMETAEVENTTYPE{
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nIndex; /**< Index of Meta Event */
+ OMX_U8 nMetaEventType; /**< Meta Event Type, 7bits (i.e. 0 - 127) */
+ OMX_U32 nMetaEventSize; /**< size of the Meta Event in bytes */
+ OMX_U32 nTrack; /**< track number for the meta event */
+ OMX_U32 nPosition; /**< Position of the meta-event in milliseconds */
+} OMX_AUDIO_CONFIG_MIDIMETAEVENTTYPE;
+
+
+/** MIDI Meta Event Data structure - one per Meta Event.
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDIMETAEVENTDATATYPE{
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nIndex; /**< Index of Meta Event */
+ OMX_U32 nMetaEventSize; /**< size of the Meta Event in bytes */
+ OMX_U8 nData[1]; /**< array of one or more bytes of meta data
+ as indicated by the nMetaEventSize field */
+} OMX_AUDIO_CONFIG__MIDIMETAEVENTDATATYPE;
+
+
+/** Audio Volume adjustment for a port */
+typedef struct OMX_AUDIO_CONFIG_VOLUMETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port index indicating which port to
+ set. Select the input port to set
+ just that port's volume. Select the
+ output port to adjust the master
+ volume. */
+ OMX_BOOL bLinear; /**< Is the volume to be set in linear (0.100)
+ or logarithmic scale (mB) */
+ OMX_BS32 sVolume; /**< Volume linear setting in the 0..100 range, OR
+ Volume logarithmic setting for this port. The values
+ for volume are in mB (millibels = 1/100 dB) relative
+ to a gain of 1 (e.g. the output is the same as the
+ input level). Values are in mB from nMax
+ (maximum volume) to nMin mB (typically negative).
+ Since the volume is "voltage"
+ and not a "power", it takes a setting of
+ -600 mB to decrease the volume by 1/2. If
+ a component cannot accurately set the
+ volume to the requested value, it must
+ set the volume to the closest value BELOW
+ the requested value. When getting the
+ volume setting, the current actual volume
+ must be returned. */
+} OMX_AUDIO_CONFIG_VOLUMETYPE;
+
+
+/** Audio Volume adjustment for a channel */
+typedef struct OMX_AUDIO_CONFIG_CHANNELVOLUMETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port index indicating which port to
+ set. Select the input port to set
+ just that port's volume. Select the
+ output port to adjust the master
+ volume. */
+ OMX_U32 nChannel; /**< channel to select from 0 to N-1,
+ using OMX_ALL to apply volume settings
+ to all channels */
+ OMX_BOOL bLinear; /**< Is the volume to be set in linear (0.100) or
+ logarithmic scale (mB) */
+ OMX_BS32 sVolume; /**< Volume linear setting in the 0..100 range, OR
+ Volume logarithmic setting for this port.
+ The values for volume are in mB
+ (millibels = 1/100 dB) relative to a gain
+ of 1 (e.g. the output is the same as the
+ input level). Values are in mB from nMax
+ (maximum volume) to nMin mB (typically negative).
+ Since the volume is "voltage"
+ and not a "power", it takes a setting of
+ -600 mB to decrease the volume by 1/2. If
+ a component cannot accurately set the
+ volume to the requested value, it must
+ set the volume to the closest value BELOW
+ the requested value. When getting the
+ volume setting, the current actual volume
+ must be returned. */
+ OMX_BOOL bIsMIDI; /**< TRUE if nChannel refers to a MIDI channel,
+ FALSE otherwise */
+} OMX_AUDIO_CONFIG_CHANNELVOLUMETYPE;
+
+
+/** Audio balance setting */
+typedef struct OMX_AUDIO_CONFIG_BALANCETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port index indicating which port to
+ set. Select the input port to set
+ just that port's balance. Select the
+ output port to adjust the master
+ balance. */
+ OMX_S32 nBalance; /**< balance setting for this port
+ (-100 to 100, where -100 indicates
+ all left, and no right */
+} OMX_AUDIO_CONFIG_BALANCETYPE;
+
+
+/** Audio Port mute */
+typedef struct OMX_AUDIO_CONFIG_MUTETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port index indicating which port to
+ set. Select the input port to set
+ just that port's mute. Select the
+ output port to adjust the master
+ mute. */
+ OMX_BOOL bMute; /**< Mute setting for this port */
+} OMX_AUDIO_CONFIG_MUTETYPE;
+
+
+/** Audio Channel mute */
+typedef struct OMX_AUDIO_CONFIG_CHANNELMUTETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nChannel; /**< channel to select from 0 to N-1,
+ using OMX_ALL to apply mute settings
+ to all channels */
+ OMX_BOOL bMute; /**< Mute setting for this channel */
+ OMX_BOOL bIsMIDI; /**< TRUE if nChannel refers to a MIDI channel,
+ FALSE otherwise */
+} OMX_AUDIO_CONFIG_CHANNELMUTETYPE;
+
+
+
+/** Enable / Disable for loudness control, which boosts bass and to a
+ * smaller extent high end frequencies to compensate for hearing
+ * ability at the extreme ends of the audio spectrum
+ */
+typedef struct OMX_AUDIO_CONFIG_LOUDNESSTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bLoudness; /**< Enable/disable for loudness */
+} OMX_AUDIO_CONFIG_LOUDNESSTYPE;
+
+
+/** Enable / Disable for bass, which controls low frequencies
+ */
+typedef struct OMX_AUDIO_CONFIG_BASSTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bEnable; /**< Enable/disable for bass control */
+ OMX_S32 nBass; /**< bass setting for the port, as a
+ continuous value from -100 to 100
+ (0 means no change in bass level)*/
+} OMX_AUDIO_CONFIG_BASSTYPE;
+
+
+/** Enable / Disable for treble, which controls high frequencies tones
+ */
+typedef struct OMX_AUDIO_CONFIG_TREBLETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bEnable; /**< Enable/disable for treble control */
+ OMX_S32 nTreble; /**< treble setting for the port, as a
+ continuous value from -100 to 100
+ (0 means no change in treble level) */
+} OMX_AUDIO_CONFIG_TREBLETYPE;
+
+
+/** An equalizer is typically used for two reasons: to compensate for an
+ * sub-optimal frequency response of a system to make it sound more natural
+ * or to create intentionally some unnatural coloring to the sound to create
+ * an effect.
+ * @ingroup effects
+ */
+typedef struct OMX_AUDIO_CONFIG_EQUALIZERTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bEnable; /**< Enable/disable for equalizer */
+ OMX_BU32 sBandIndex; /**< Band number to be set. Upper Limit is
+ N-1, where N is the number of bands, lower limit is 0 */
+ OMX_BU32 sCenterFreq; /**< Center frequecies in Hz. This is a
+ read only element and is used to determine
+ the lower, center and upper frequency of
+ this band. */
+ OMX_BS32 sBandLevel; /**< band level in millibels */
+} OMX_AUDIO_CONFIG_EQUALIZERTYPE;
+
+
+/** Stereo widening mode type
+ * @ingroup effects
+ */
+typedef enum OMX_AUDIO_STEREOWIDENINGTYPE {
+ OMX_AUDIO_StereoWideningHeadphones, /**< Stereo widening for loudspeakers */
+ OMX_AUDIO_StereoWideningLoudspeakers, /**< Stereo widening for closely spaced loudspeakers */
+ OMX_AUDIO_StereoWideningKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_StereoWideningVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_StereoWideningMax = 0x7FFFFFFF
+} OMX_AUDIO_STEREOWIDENINGTYPE;
+
+
+/** Control for stereo widening, which is a special 2-channel
+ * case of the audio virtualizer effect. For example, for 5.1-channel
+ * output, it translates to virtual surround sound.
+ * @ingroup effects
+ */
+typedef struct OMX_AUDIO_CONFIG_STEREOWIDENINGTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bEnable; /**< Enable/disable for stereo widening control */
+ OMX_AUDIO_STEREOWIDENINGTYPE eWideningType; /**< Stereo widening algorithm type */
+ OMX_U32 nStereoWidening; /**< stereo widening setting for the port,
+ as a continuous value from 0 to 100 */
+} OMX_AUDIO_CONFIG_STEREOWIDENINGTYPE;
+
+
+/** The chorus effect (or ``choralizer'') is any signal processor which makes
+ * one sound source (such as a voice) sound like many such sources singing
+ * (or playing) in unison. Since performance in unison is never exact, chorus
+ * effects simulate this by making independently modified copies of the input
+ * signal. Modifications may include (1) delay, (2) frequency shift, and
+ * (3) amplitude modulation.
+ * @ingroup effects
+ */
+typedef struct OMX_AUDIO_CONFIG_CHORUSTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bEnable; /**< Enable/disable for chorus */
+ OMX_BU32 sDelay; /**< average delay in milliseconds */
+ OMX_BU32 sModulationRate; /**< rate of modulation in millihertz */
+ OMX_U32 nModulationDepth; /**< depth of modulation as a percentage of
+ delay (i.e. 0 to 100) */
+ OMX_BU32 nFeedback; /**< Feedback from chorus output to input in percentage */
+} OMX_AUDIO_CONFIG_CHORUSTYPE;
+
+
+/** Reverberation is part of the reflected sound that follows the early
+ * reflections. In a typical room, this consists of a dense succession of
+ * echoes whose energy decays exponentially. The reverberation effect structure
+ * as defined here includes both (early) reflections as well as (late) reverberations.
+ * @ingroup effects
+ */
+typedef struct OMX_AUDIO_CONFIG_REVERBERATIONTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bEnable; /**< Enable/disable for reverberation control */
+ OMX_BS32 sRoomLevel; /**< Intensity level for the whole room effect
+ (i.e. both early reflections and late
+ reverberation) in millibels */
+ OMX_BS32 sRoomHighFreqLevel; /**< Attenuation at high frequencies
+ relative to the intensity at low
+ frequencies in millibels */
+ OMX_BS32 sReflectionsLevel; /**< Intensity level of early reflections
+ (relative to room value), in millibels */
+ OMX_BU32 sReflectionsDelay; /**< Delay time of the first reflection relative
+ to the direct path, in milliseconds */
+ OMX_BS32 sReverbLevel; /**< Intensity level of late reverberation
+ relative to room level, in millibels */
+ OMX_BU32 sReverbDelay; /**< Time delay from the first early reflection
+ to the beginning of the late reverberation
+ section, in milliseconds */
+ OMX_BU32 sDecayTime; /**< Late reverberation decay time at low
+ frequencies, in milliseconds */
+ OMX_BU32 nDecayHighFreqRatio; /**< Ratio of high frequency decay time relative
+ to low frequency decay time in percent */
+ OMX_U32 nDensity; /**< Modal density in the late reverberation decay,
+ in percent (i.e. 0 - 100) */
+ OMX_U32 nDiffusion; /**< Echo density in the late reverberation decay,
+ in percent (i.e. 0 - 100) */
+ OMX_BU32 sReferenceHighFreq; /**< Reference high frequency in Hertz. This is
+ the frequency used as the reference for all
+ the high-frequency settings above */
+
+} OMX_AUDIO_CONFIG_REVERBERATIONTYPE;
+
+
+/** Possible settings for the Echo Cancelation structure to use
+ * @ingroup effects
+ */
+typedef enum OMX_AUDIO_ECHOCANTYPE {
+ OMX_AUDIO_EchoCanOff = 0, /**< Echo Cancellation is disabled */
+ OMX_AUDIO_EchoCanNormal, /**< Echo Cancellation normal operation -
+ echo from plastics and face */
+ OMX_AUDIO_EchoCanHFree, /**< Echo Cancellation optimized for
+ Hands Free operation */
+ OMX_AUDIO_EchoCanCarKit, /**< Echo Cancellation optimized for
+ Car Kit (longer echo) */
+ OMX_AUDIO_EchoCanKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_AUDIO_EchoCanVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_AUDIO_EchoCanMax = 0x7FFFFFFF
+} OMX_AUDIO_ECHOCANTYPE;
+
+
+/** Enable / Disable for echo cancelation, which removes undesired echo's
+ * from the audio
+ * @ingroup effects
+ */
+typedef struct OMX_AUDIO_CONFIG_ECHOCANCELATIONTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_AUDIO_ECHOCANTYPE eEchoCancelation; /**< Echo cancelation settings */
+} OMX_AUDIO_CONFIG_ECHOCANCELATIONTYPE;
+
+
+/** Enable / Disable for noise reduction, which undesired noise from
+ * the audio
+ * @ingroup effects
+ */
+typedef struct OMX_AUDIO_CONFIG_NOISEREDUCTIONTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BOOL bNoiseReduction; /**< Enable/disable for noise reduction */
+} OMX_AUDIO_CONFIG_NOISEREDUCTIONTYPE;
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
+
diff --git a/mm-core/inc/OMX_Component.h b/mm-core/inc/OMX_Component.h
new file mode 100755
index 00000000..d5956405
--- /dev/null
+++ b/mm-core/inc/OMX_Component.h
@@ -0,0 +1,579 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/** OMX_Component.h - OpenMax IL version 1.1.2
+ * The OMX_Component header file contains the definitions used to define
+ * the public interface of a component. This header file is intended to
+ * be used by both the application and the component.
+ */
+
+#ifndef OMX_Component_h
+#define OMX_Component_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+/* Each OMX header must include all required header files to allow the
+ * header to compile without errors. The includes below are required
+ * for this header file to compile successfully
+ */
+
+#include <OMX_Audio.h>
+#include <OMX_Video.h>
+#include <OMX_Image.h>
+#include <OMX_Other.h>
+
+/** @ingroup comp */
+typedef enum OMX_PORTDOMAINTYPE {
+ OMX_PortDomainAudio,
+ OMX_PortDomainVideo,
+ OMX_PortDomainImage,
+ OMX_PortDomainOther,
+ OMX_PortDomainKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_PortDomainVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_PortDomainMax = 0x7ffffff
+} OMX_PORTDOMAINTYPE;
+
+/** @ingroup comp */
+typedef struct OMX_PARAM_PORTDEFINITIONTYPE {
+ OMX_U32 nSize; /**< Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port number the structure applies to */
+ OMX_DIRTYPE eDir; /**< Direction (input or output) of this port */
+ OMX_U32 nBufferCountActual; /**< The actual number of buffers allocated on this port */
+ OMX_U32 nBufferCountMin; /**< The minimum number of buffers this port requires */
+ OMX_U32 nBufferSize; /**< Size, in bytes, for buffers to be used for this channel */
+ OMX_BOOL bEnabled; /**< Ports default to enabled and are enabled/disabled by
+ OMX_CommandPortEnable/OMX_CommandPortDisable.
+ When disabled a port is unpopulated. A disabled port
+ is not populated with buffers on a transition to IDLE. */
+ OMX_BOOL bPopulated; /**< Port is populated with all of its buffers as indicated by
+ nBufferCountActual. A disabled port is always unpopulated.
+ An enabled port is populated on a transition to OMX_StateIdle
+ and unpopulated on a transition to loaded. */
+ OMX_PORTDOMAINTYPE eDomain; /**< Domain of the port. Determines the contents of metadata below. */
+ union {
+ OMX_AUDIO_PORTDEFINITIONTYPE audio;
+ OMX_VIDEO_PORTDEFINITIONTYPE video;
+ OMX_IMAGE_PORTDEFINITIONTYPE image;
+ OMX_OTHER_PORTDEFINITIONTYPE other;
+ } format;
+ OMX_BOOL bBuffersContiguous;
+ OMX_U32 nBufferAlignment;
+} OMX_PARAM_PORTDEFINITIONTYPE;
+
+/** @ingroup comp */
+typedef struct OMX_PARAM_U32TYPE {
+ OMX_U32 nSize; /**< Size of this structure, in Bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_U32 nU32; /**< U32 value */
+} OMX_PARAM_U32TYPE;
+
+/** @ingroup rpm */
+typedef enum OMX_SUSPENSIONPOLICYTYPE {
+ OMX_SuspensionDisabled, /**< No suspension; v1.0 behavior */
+ OMX_SuspensionEnabled, /**< Suspension allowed */
+ OMX_SuspensionPolicyKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_SuspensionPolicyStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_SuspensionPolicyMax = 0x7fffffff
+} OMX_SUSPENSIONPOLICYTYPE;
+
+/** @ingroup rpm */
+typedef struct OMX_PARAM_SUSPENSIONPOLICYTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_SUSPENSIONPOLICYTYPE ePolicy;
+} OMX_PARAM_SUSPENSIONPOLICYTYPE;
+
+/** @ingroup rpm */
+typedef enum OMX_SUSPENSIONTYPE {
+ OMX_NotSuspended, /**< component is not suspended */
+ OMX_Suspended, /**< component is suspended */
+ OMX_SuspensionKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_SuspensionVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_SuspendMax = 0x7FFFFFFF
+} OMX_SUSPENSIONTYPE;
+
+/** @ingroup rpm */
+typedef struct OMX_PARAM_SUSPENSIONTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_SUSPENSIONTYPE eType;
+} OMX_PARAM_SUSPENSIONTYPE ;
+
+typedef struct OMX_CONFIG_BOOLEANTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_BOOL bEnabled;
+} OMX_CONFIG_BOOLEANTYPE;
+
+/* Parameter specifying the content uri to use. */
+/** @ingroup cp */
+typedef struct OMX_PARAM_CONTENTURITYPE
+{
+ OMX_U32 nSize; /**< size of the structure in bytes, including
+ actual URI name */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U8 contentURI[1]; /**< The URI name */
+} OMX_PARAM_CONTENTURITYPE;
+
+/* Parameter specifying the pipe to use. */
+/** @ingroup cp */
+typedef struct OMX_PARAM_CONTENTPIPETYPE
+{
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_HANDLETYPE hPipe; /**< The pipe handle*/
+} OMX_PARAM_CONTENTPIPETYPE;
+
+/** @ingroup rpm */
+typedef struct OMX_RESOURCECONCEALMENTTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bResourceConcealmentForbidden; /**< disallow the use of resource concealment
+ methods (like degrading algorithm quality to
+ lower resource consumption or functional bypass)
+ on a component as a resolution to resource conflicts. */
+} OMX_RESOURCECONCEALMENTTYPE;
+
+
+/** @ingroup metadata */
+typedef enum OMX_METADATACHARSETTYPE {
+ OMX_MetadataCharsetUnknown = 0,
+ OMX_MetadataCharsetASCII,
+ OMX_MetadataCharsetBinary,
+ OMX_MetadataCharsetCodePage1252,
+ OMX_MetadataCharsetUTF8,
+ OMX_MetadataCharsetJavaConformantUTF8,
+ OMX_MetadataCharsetUTF7,
+ OMX_MetadataCharsetImapUTF7,
+ OMX_MetadataCharsetUTF16LE,
+ OMX_MetadataCharsetUTF16BE,
+ OMX_MetadataCharsetGB12345,
+ OMX_MetadataCharsetHZGB2312,
+ OMX_MetadataCharsetGB2312,
+ OMX_MetadataCharsetGB18030,
+ OMX_MetadataCharsetGBK,
+ OMX_MetadataCharsetBig5,
+ OMX_MetadataCharsetISO88591,
+ OMX_MetadataCharsetISO88592,
+ OMX_MetadataCharsetISO88593,
+ OMX_MetadataCharsetISO88594,
+ OMX_MetadataCharsetISO88595,
+ OMX_MetadataCharsetISO88596,
+ OMX_MetadataCharsetISO88597,
+ OMX_MetadataCharsetISO88598,
+ OMX_MetadataCharsetISO88599,
+ OMX_MetadataCharsetISO885910,
+ OMX_MetadataCharsetISO885913,
+ OMX_MetadataCharsetISO885914,
+ OMX_MetadataCharsetISO885915,
+ OMX_MetadataCharsetShiftJIS,
+ OMX_MetadataCharsetISO2022JP,
+ OMX_MetadataCharsetISO2022JP1,
+ OMX_MetadataCharsetISOEUCJP,
+ OMX_MetadataCharsetSMS7Bit,
+ OMX_MetadataCharsetKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_MetadataCharsetVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_MetadataCharsetTypeMax= 0x7FFFFFFF
+} OMX_METADATACHARSETTYPE;
+
+/** @ingroup metadata */
+typedef enum OMX_METADATASCOPETYPE
+{
+ OMX_MetadataScopeAllLevels,
+ OMX_MetadataScopeTopLevel,
+ OMX_MetadataScopePortLevel,
+ OMX_MetadataScopeNodeLevel,
+ OMX_MetadataScopeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_MetadataScopeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_MetadataScopeTypeMax = 0x7fffffff
+} OMX_METADATASCOPETYPE;
+
+/** @ingroup metadata */
+typedef enum OMX_METADATASEARCHMODETYPE
+{
+ OMX_MetadataSearchValueSizeByIndex,
+ OMX_MetadataSearchItemByIndex,
+ OMX_MetadataSearchNextItemByKey,
+ OMX_MetadataSearchKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_MetadataSearchVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_MetadataSearchTypeMax = 0x7fffffff
+} OMX_METADATASEARCHMODETYPE;
+/** @ingroup metadata */
+typedef struct OMX_CONFIG_METADATAITEMCOUNTTYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_METADATASCOPETYPE eScopeMode;
+ OMX_U32 nScopeSpecifier;
+ OMX_U32 nMetadataItemCount;
+} OMX_CONFIG_METADATAITEMCOUNTTYPE;
+
+/** @ingroup metadata */
+typedef struct OMX_CONFIG_METADATAITEMTYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_METADATASCOPETYPE eScopeMode;
+ OMX_U32 nScopeSpecifier;
+ OMX_U32 nMetadataItemIndex;
+ OMX_METADATASEARCHMODETYPE eSearchMode;
+ OMX_METADATACHARSETTYPE eKeyCharset;
+ OMX_U8 nKeySizeUsed;
+ OMX_U8 nKey[128];
+ OMX_METADATACHARSETTYPE eValueCharset;
+ OMX_STRING sLanguageCountry;
+ OMX_U32 nValueMaxSize;
+ OMX_U32 nValueSizeUsed;
+ OMX_U8 nValue[1];
+} OMX_CONFIG_METADATAITEMTYPE;
+
+/* @ingroup metadata */
+typedef struct OMX_CONFIG_CONTAINERNODECOUNTTYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_BOOL bAllKeys;
+ OMX_U32 nParentNodeID;
+ OMX_U32 nNumNodes;
+} OMX_CONFIG_CONTAINERNODECOUNTTYPE;
+
+/** @ingroup metadata */
+typedef struct OMX_CONFIG_CONTAINERNODEIDTYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_BOOL bAllKeys;
+ OMX_U32 nParentNodeID;
+ OMX_U32 nNodeIndex;
+ OMX_U32 nNodeID;
+ OMX_STRING cNodeName;
+ OMX_BOOL bIsLeafType;
+} OMX_CONFIG_CONTAINERNODEIDTYPE;
+
+/** @ingroup metadata */
+typedef struct OMX_PARAM_METADATAFILTERTYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_BOOL bAllKeys; /* if true then this structure refers to all keys and
+ * the three key fields below are ignored */
+ OMX_METADATACHARSETTYPE eKeyCharset;
+ OMX_U32 nKeySizeUsed;
+ OMX_U8 nKey [128];
+ OMX_U32 nLanguageCountrySizeUsed;
+ OMX_U8 nLanguageCountry[128];
+ OMX_BOOL bEnabled; /* if true then key is part of filter (e.g.
+ * retained for query later). If false then
+ * key is not part of filter */
+} OMX_PARAM_METADATAFILTERTYPE;
+
+/** The OMX_HANDLETYPE structure defines the component handle. The component
+ * handle is used to access all of the component's public methods and also
+ * contains pointers to the component's private data area. The component
+ * handle is initialized by the OMX core (with help from the component)
+ * during the process of loading the component. After the component is
+ * successfully loaded, the application can safely access any of the
+ * component's public functions (although some may return an error because
+ * the state is inappropriate for the access).
+ *
+ * @ingroup comp
+ */
+typedef struct OMX_COMPONENTTYPE
+{
+ /** The size of this structure, in bytes. It is the responsibility
+ of the allocator of this structure to fill in this value. Since
+ this structure is allocated by the GetHandle function, this
+ function will fill in this value. */
+ OMX_U32 nSize;
+
+ /** nVersion is the version of the OMX specification that the structure
+ is built against. It is the responsibility of the creator of this
+ structure to initialize this value and every user of this structure
+ should verify that it knows how to use the exact version of
+ this structure found herein. */
+ OMX_VERSIONTYPE nVersion;
+
+ /** pComponentPrivate is a pointer to the component private data area.
+ This member is allocated and initialized by the component when the
+ component is first loaded. The application should not access this
+ data area. */
+ OMX_PTR pComponentPrivate;
+
+ /** pApplicationPrivate is a pointer that is a parameter to the
+ OMX_GetHandle method, and contains an application private value
+ provided by the IL client. This application private data is
+ returned to the IL Client by OMX in all callbacks */
+ OMX_PTR pApplicationPrivate;
+
+ /** refer to OMX_GetComponentVersion in OMX_core.h or the OMX IL
+ specification for details on the GetComponentVersion method.
+ */
+ OMX_ERRORTYPE (*GetComponentVersion)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_OUT OMX_STRING pComponentName,
+ OMX_OUT OMX_VERSIONTYPE* pComponentVersion,
+ OMX_OUT OMX_VERSIONTYPE* pSpecVersion,
+ OMX_OUT OMX_UUIDTYPE* pComponentUUID);
+
+ /** refer to OMX_SendCommand in OMX_core.h or the OMX IL
+ specification for details on the SendCommand method.
+ */
+ OMX_ERRORTYPE (*SendCommand)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_COMMANDTYPE Cmd,
+ OMX_IN OMX_U32 nParam1,
+ OMX_IN OMX_PTR pCmdData);
+
+ /** refer to OMX_GetParameter in OMX_core.h or the OMX IL
+ specification for details on the GetParameter method.
+ */
+ OMX_ERRORTYPE (*GetParameter)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_INDEXTYPE nParamIndex,
+ OMX_INOUT OMX_PTR pComponentParameterStructure);
+
+
+ /** refer to OMX_SetParameter in OMX_core.h or the OMX IL
+ specification for details on the SetParameter method.
+ */
+ OMX_ERRORTYPE (*SetParameter)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_INDEXTYPE nIndex,
+ OMX_IN OMX_PTR pComponentParameterStructure);
+
+
+ /** refer to OMX_GetConfig in OMX_core.h or the OMX IL
+ specification for details on the GetConfig method.
+ */
+ OMX_ERRORTYPE (*GetConfig)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_INDEXTYPE nIndex,
+ OMX_INOUT OMX_PTR pComponentConfigStructure);
+
+
+ /** refer to OMX_SetConfig in OMX_core.h or the OMX IL
+ specification for details on the SetConfig method.
+ */
+ OMX_ERRORTYPE (*SetConfig)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_INDEXTYPE nIndex,
+ OMX_IN OMX_PTR pComponentConfigStructure);
+
+
+ /** refer to OMX_GetExtensionIndex in OMX_core.h or the OMX IL
+ specification for details on the GetExtensionIndex method.
+ */
+ OMX_ERRORTYPE (*GetExtensionIndex)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_STRING cParameterName,
+ OMX_OUT OMX_INDEXTYPE* pIndexType);
+
+
+ /** refer to OMX_GetState in OMX_core.h or the OMX IL
+ specification for details on the GetState method.
+ */
+ OMX_ERRORTYPE (*GetState)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_OUT OMX_STATETYPE* pState);
+
+
+ /** The ComponentTunnelRequest method will interact with another OMX
+ component to determine if tunneling is possible and to setup the
+ tunneling. The return codes for this method can be used to
+ determine if tunneling is not possible, or if tunneling is not
+ supported.
+
+ Base profile components (i.e. non-interop) do not support this
+ method and should return OMX_ErrorNotImplemented
+
+ The interop profile component MUST support tunneling to another
+ interop profile component with a compatible port parameters.
+ A component may also support proprietary communication.
+
+ If proprietary communication is supported the negotiation of
+ proprietary communication is done outside of OMX in a vendor
+ specific way. It is only required that the proper result be
+ returned and the details of how the setup is done is left
+ to the component implementation.
+
+ When this method is invoked when nPort in an output port, the
+ component will:
+ 1. Populate the pTunnelSetup structure with the output port's
+ requirements and constraints for the tunnel.
+
+ When this method is invoked when nPort in an input port, the
+ component will:
+ 1. Query the necessary parameters from the output port to
+ determine if the ports are compatible for tunneling
+ 2. If the ports are compatible, the component should store
+ the tunnel step provided by the output port
+ 3. Determine which port (either input or output) is the buffer
+ supplier, and call OMX_SetParameter on the output port to
+ indicate this selection.
+
+ The component will return from this call within 5 msec.
+
+ @param [in] hComp
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle method.
+ @param [in] nPort
+ nPort is used to select the port on the component to be used
+ for tunneling.
+ @param [in] hTunneledComp
+ Handle of the component to tunnel with. This is the component
+ handle returned by the call to the OMX_GetHandle method. When
+ this parameter is 0x0 the component should setup the port for
+ communication with the application / IL Client.
+ @param [in] nPortOutput
+ nPortOutput is used indicate the port the component should
+ tunnel with.
+ @param [in] pTunnelSetup
+ Pointer to the tunnel setup structure. When nPort is an output port
+ the component should populate the fields of this structure. When
+ When nPort is an input port the component should review the setup
+ provided by the component with the output port.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup tun
+ */
+
+ OMX_ERRORTYPE (*ComponentTunnelRequest)(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_U32 nPort,
+ OMX_IN OMX_HANDLETYPE hTunneledComp,
+ OMX_IN OMX_U32 nTunneledPort,
+ OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup);
+
+ /** refer to OMX_UseBuffer in OMX_core.h or the OMX IL
+ specification for details on the UseBuffer method.
+ @ingroup buf
+ */
+ OMX_ERRORTYPE (*UseBuffer)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
+ OMX_IN OMX_U32 nPortIndex,
+ OMX_IN OMX_PTR pAppPrivate,
+ OMX_IN OMX_U32 nSizeBytes,
+ OMX_IN OMX_U8* pBuffer);
+
+ /** refer to OMX_AllocateBuffer in OMX_core.h or the OMX IL
+ specification for details on the AllocateBuffer method.
+ @ingroup buf
+ */
+ OMX_ERRORTYPE (*AllocateBuffer)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
+ OMX_IN OMX_U32 nPortIndex,
+ OMX_IN OMX_PTR pAppPrivate,
+ OMX_IN OMX_U32 nSizeBytes);
+
+ /** refer to OMX_FreeBuffer in OMX_core.h or the OMX IL
+ specification for details on the FreeBuffer method.
+ @ingroup buf
+ */
+ OMX_ERRORTYPE (*FreeBuffer)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_U32 nPortIndex,
+ OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
+
+ /** refer to OMX_EmptyThisBuffer in OMX_core.h or the OMX IL
+ specification for details on the EmptyThisBuffer method.
+ @ingroup buf
+ */
+ OMX_ERRORTYPE (*EmptyThisBuffer)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
+
+ /** refer to OMX_FillThisBuffer in OMX_core.h or the OMX IL
+ specification for details on the FillThisBuffer method.
+ @ingroup buf
+ */
+ OMX_ERRORTYPE (*FillThisBuffer)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
+
+ /** The SetCallbacks method is used by the core to specify the callback
+ structure from the application to the component. This is a blocking
+ call. The component will return from this call within 5 msec.
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the GetHandle function.
+ @param [in] pCallbacks
+ pointer to an OMX_CALLBACKTYPE structure used to provide the
+ callback information to the component
+ @param [in] pAppData
+ pointer to an application defined value. It is anticipated that
+ the application will pass a pointer to a data structure or a "this
+ pointer" in this area to allow the callback (in the application)
+ to determine the context of the call
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ */
+ OMX_ERRORTYPE (*SetCallbacks)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_CALLBACKTYPE* pCallbacks,
+ OMX_IN OMX_PTR pAppData);
+
+ /** ComponentDeInit method is used to deinitialize the component
+ providing a means to free any resources allocated at component
+ initialization. NOTE: After this call the component handle is
+ not valid for further use.
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the GetHandle function.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ */
+ OMX_ERRORTYPE (*ComponentDeInit)(
+ OMX_IN OMX_HANDLETYPE hComponent);
+
+ /** @ingroup buf */
+ OMX_ERRORTYPE (*UseEGLImage)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
+ OMX_IN OMX_U32 nPortIndex,
+ OMX_IN OMX_PTR pAppPrivate,
+ OMX_IN void* eglImage);
+
+ OMX_ERRORTYPE (*ComponentRoleEnum)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_OUT OMX_U8 *cRole,
+ OMX_IN OMX_U32 nIndex);
+
+} OMX_COMPONENTTYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/mm-core/inc/OMX_ContentPipe.h b/mm-core/inc/OMX_ContentPipe.h
new file mode 100755
index 00000000..5f6310c2
--- /dev/null
+++ b/mm-core/inc/OMX_ContentPipe.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/** OMX_ContentPipe.h - OpenMax IL version 1.1.2
+ * The OMX_ContentPipe header file contains the definitions used to define
+ * the public interface for content piples. This header file is intended to
+ * be used by the component.
+ */
+
+#ifndef OMX_CONTENTPIPE_H
+#define OMX_CONTENTPIPE_H
+
+#ifndef KD_EACCES
+/* OpenKODE error codes. CPResult values may be zero (indicating success
+ or one of the following values) */
+#define KD_EACCES (1)
+#define KD_EADDRINUSE (2)
+#define KD_EAGAIN (5)
+#define KD_EBADF (7)
+#define KD_EBUSY (8)
+#define KD_ECONNREFUSED (9)
+#define KD_ECONNRESET (10)
+#define KD_EDEADLK (11)
+#define KD_EDESTADDRREQ (12)
+#define KD_ERANGE (35)
+#define KD_EEXIST (13)
+#define KD_EFBIG (14)
+#define KD_EHOSTUNREACH (15)
+#define KD_EINVAL (17)
+#define KD_EIO (18)
+#define KD_EISCONN (20)
+#define KD_EISDIR (21)
+#define KD_EMFILE (22)
+#define KD_ENAMETOOLONG (23)
+#define KD_ENOENT (24)
+#define KD_ENOMEM (25)
+#define KD_ENOSPC (26)
+#define KD_ENOSYS (27)
+#define KD_ENOTCONN (28)
+#define KD_EPERM (33)
+#define KD_ETIMEDOUT (36)
+#define KD_EILSEQ (19)
+#endif
+
+/** Map types from OMX standard types only here so interface is as generic as possible. */
+typedef OMX_U32 CPresult;
+typedef char * CPstring;
+typedef void * CPhandle;
+typedef OMX_U32 CPuint;
+typedef OMX_S32 CPint;
+typedef char CPbyte;
+typedef OMX_BOOL CPbool;
+
+/** enumeration of origin types used in the CP_PIPETYPE's Seek function
+ * @ingroup cp
+ */
+typedef enum CP_ORIGINTYPE {
+ CP_OriginBegin,
+ CP_OriginCur,
+ CP_OriginEnd,
+ CP_OriginKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ CP_OriginVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ CP_OriginMax = 0X7FFFFFFF
+} CP_ORIGINTYPE;
+
+/** enumeration of contact access types used in the CP_PIPETYPE's Open function
+ * @ingroup cp
+ */
+typedef enum CP_ACCESSTYPE {
+ CP_AccessRead,
+ CP_AccessWrite,
+ CP_AccessReadWrite ,
+ CP_AccessKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ CP_AccessVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ CP_AccessMax = 0X7FFFFFFF
+} CP_ACCESSTYPE;
+
+/** enumeration of results returned by the CP_PIPETYPE's CheckAvailableBytes function
+ * @ingroup cp
+ */
+typedef enum CP_CHECKBYTESRESULTTYPE
+{
+ CP_CheckBytesOk, /**< There are at least the request number
+ of bytes available */
+ CP_CheckBytesNotReady, /**< The pipe is still retrieving bytes
+ and presently lacks sufficient bytes.
+ Client will be called when they are
+ sufficient bytes are available. */
+ CP_CheckBytesInsufficientBytes , /**< The pipe has retrieved all bytes
+ but those available are less than those
+ requested */
+ CP_CheckBytesAtEndOfStream, /**< The pipe has reached the end of stream
+ and no more bytes are available. */
+ CP_CheckBytesOutOfBuffers, /**< All read/write buffers are currently in use. */
+ CP_CheckBytesKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ CP_CheckBytesVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ CP_CheckBytesMax = 0X7FFFFFFF
+} CP_CHECKBYTESRESULTTYPE;
+
+/** enumeration of content pipe events sent to the client callback.
+ * @ingroup cp
+ */
+typedef enum CP_EVENTTYPE{
+ CP_BytesAvailable, /** bytes requested in a CheckAvailableBytes call are now available*/
+ CP_Overflow, /** enumeration of content pipe events sent to the client callback*/
+ CP_PipeDisconnected , /** enumeration of content pipe events sent to the client callback*/
+ CP_EventKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ CP_EventVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ CP_EventMax = 0X7FFFFFFF
+} CP_EVENTTYPE;
+
+/** content pipe definition
+ * @ingroup cp
+ */
+typedef struct CP_PIPETYPE
+{
+ /** Open a content stream for reading or writing. */
+ CPresult (*Open)( CPhandle* hContent, CPstring szURI, CP_ACCESSTYPE eAccess );
+
+ /** Close a content stream. */
+ CPresult (*Close)( CPhandle hContent );
+
+ /** Create a content source and open it for writing. */
+ CPresult (*Create)( CPhandle *hContent, CPstring szURI );
+
+ /** Check the that specified number of bytes are available for reading or writing (depending on access type).*/
+ CPresult (*CheckAvailableBytes)( CPhandle hContent, CPuint nBytesRequested, CP_CHECKBYTESRESULTTYPE *eResult );
+
+ /** Seek to certain position in the content relative to the specified origin. */
+ CPresult (*SetPosition)( CPhandle hContent, CPint nOffset, CP_ORIGINTYPE eOrigin);
+
+ /** Retrieve the current position relative to the start of the content. */
+ CPresult (*GetPosition)( CPhandle hContent, CPuint *pPosition);
+
+ /** Retrieve data of the specified size from the content stream (advance content pointer by size of data).
+ Note: pipe client provides pointer. This function is appropriate for small high frequency reads. */
+ CPresult (*Read)( CPhandle hContent, CPbyte *pData, CPuint nSize);
+
+ /** Retrieve a buffer allocated by the pipe that contains the requested number of bytes.
+ Buffer contains the next block of bytes, as specified by nSize, of the content. nSize also
+ returns the size of the block actually read. Content pointer advances the by the returned size.
+ Note: pipe provides pointer. This function is appropriate for large reads. The client must call
+ ReleaseReadBuffer when done with buffer.
+
+ In some cases the requested block may not reside in contiguous memory within the
+ pipe implementation. For instance if the pipe leverages a circular buffer then the requested
+ block may straddle the boundary of the circular buffer. By default a pipe implementation
+ performs a copy in this case to provide the block to the pipe client in one contiguous buffer.
+ If, however, the client sets bForbidCopy, then the pipe returns only those bytes preceding the memory
+ boundary. Here the client may retrieve the data in segments over successive calls. */
+ CPresult (*ReadBuffer)( CPhandle hContent, CPbyte **ppBuffer, CPuint *nSize, CPbool bForbidCopy);
+
+ /** Release a buffer obtained by ReadBuffer back to the pipe. */
+ CPresult (*ReleaseReadBuffer)(CPhandle hContent, CPbyte *pBuffer);
+
+ /** Write data of the specified size to the content (advance content pointer by size of data).
+ Note: pipe client provides pointer. This function is appropriate for small high frequency writes. */
+ CPresult (*Write)( CPhandle hContent, CPbyte *data, CPuint nSize);
+
+ /** Retrieve a buffer allocated by the pipe used to write data to the content.
+ Client will fill buffer with output data. Note: pipe provides pointer. This function is appropriate
+ for large writes. The client must call WriteBuffer when done it has filled the buffer with data.*/
+ CPresult (*GetWriteBuffer)( CPhandle hContent, CPbyte **ppBuffer, CPuint nSize);
+
+ /** Deliver a buffer obtained via GetWriteBuffer to the pipe. Pipe will write the
+ the contents of the buffer to content and advance content pointer by the size of the buffer */
+ CPresult (*WriteBuffer)( CPhandle hContent, CPbyte *pBuffer, CPuint nFilledSize);
+
+ /** Register a per-handle client callback with the content pipe. */
+ CPresult (*RegisterCallback)( CPhandle hContent, CPresult (*ClientCallback)(CP_EVENTTYPE eEvent, CPuint iParam));
+
+} CP_PIPETYPE;
+
+#endif
+
diff --git a/mm-core/inc/OMX_Core.h b/mm-core/inc/OMX_Core.h
new file mode 100755
index 00000000..a076f2f4
--- /dev/null
+++ b/mm-core/inc/OMX_Core.h
@@ -0,0 +1,1431 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/** OMX_Core.h - OpenMax IL version 1.1.2
+ * The OMX_Core header file contains the definitions used by both the
+ * application and the component to access common items.
+ */
+
+#ifndef OMX_Core_h
+#define OMX_Core_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Each OMX header shall include all required header files to allow the
+ * header to compile without errors. The includes below are required
+ * for this header file to compile successfully
+ */
+
+#include <OMX_Index.h>
+
+
+/** The OMX_COMMANDTYPE enumeration is used to specify the action in the
+ * OMX_SendCommand macro.
+ * @ingroup core
+ */
+typedef enum OMX_COMMANDTYPE
+{
+ OMX_CommandStateSet, /**< Change the component state */
+ OMX_CommandFlush, /**< Flush the data queue(s) of a component */
+ OMX_CommandPortDisable, /**< Disable a port on a component. */
+ OMX_CommandPortEnable, /**< Enable a port on a component. */
+ OMX_CommandMarkBuffer, /**< Mark a component/buffer for observation */
+ OMX_CommandKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_CommandVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_CommandMax = 0X7FFFFFFF
+} OMX_COMMANDTYPE;
+
+
+
+/** The OMX_STATETYPE enumeration is used to indicate or change the component
+ * state. This enumeration reflects the current state of the component when
+ * used with the OMX_GetState macro or becomes the parameter in a state change
+ * command when used with the OMX_SendCommand macro.
+ *
+ * The component will be in the Loaded state after the component is initially
+ * loaded into memory. In the Loaded state, the component is not allowed to
+ * allocate or hold resources other than to build it's internal parameter
+ * and configuration tables. The application will send one or more
+ * SetParameters/GetParameters and SetConfig/GetConfig commands to the
+ * component and the component will record each of these parameter and
+ * configuration changes for use later. When the application sends the
+ * Idle command, the component will acquire the resources needed for the
+ * specified configuration and will transition to the idle state if the
+ * allocation is successful. If the component cannot successfully
+ * transition to the idle state for any reason, the state of the component
+ * shall be fully rolled back to the Loaded state (e.g. all allocated
+ * resources shall be released). When the component receives the command
+ * to go to the Executing state, it shall begin processing buffers by
+ * sending all input buffers it holds to the application. While
+ * the component is in the Idle state, the application may also send the
+ * Pause command. If the component receives the pause command while in the
+ * Idle state, the component shall send all input buffers it holds to the
+ * application, but shall not begin processing buffers. This will allow the
+ * application to prefill buffers.
+ *
+ * @ingroup comp
+ */
+
+typedef enum OMX_STATETYPE
+{
+ OMX_StateInvalid, /**< component has detected that it's internal data
+ structures are corrupted to the point that
+ it cannot determine it's state properly */
+ OMX_StateLoaded, /**< component has been loaded but has not completed
+ initialization. The OMX_SetParameter macro
+ and the OMX_GetParameter macro are the only
+ valid macros allowed to be sent to the
+ component in this state. */
+ OMX_StateIdle, /**< component initialization has been completed
+ successfully and the component is ready to
+ to start. */
+ OMX_StateExecuting, /**< component has accepted the start command and
+ is processing data (if data is available) */
+ OMX_StatePause, /**< component has received pause command */
+ OMX_StateWaitForResources, /**< component is waiting for resources, either after
+ preemption or before it gets the resources requested.
+ See specification for complete details. */
+ OMX_StateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_StateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_StateMax = 0X7FFFFFFF
+} OMX_STATETYPE;
+
+/** The OMX_ERRORTYPE enumeration defines the standard OMX Errors. These
+ * errors should cover most of the common failure cases. However,
+ * vendors are free to add additional error messages of their own as
+ * long as they follow these rules:
+ * 1. Vendor error messages shall be in the range of 0x90000000 to
+ * 0x9000FFFF.
+ * 2. Vendor error messages shall be defined in a header file provided
+ * with the component. No error messages are allowed that are
+ * not defined.
+ */
+typedef enum OMX_ERRORTYPE
+{
+ OMX_ErrorNone = 0,
+
+ /** There were insufficient resources to perform the requested operation */
+ OMX_ErrorInsufficientResources = (OMX_S32) 0x80001000,
+
+ /** There was an error, but the cause of the error could not be determined */
+ OMX_ErrorUndefined = (OMX_S32) 0x80001001,
+
+ /** The component name string was not valid */
+ OMX_ErrorInvalidComponentName = (OMX_S32) 0x80001002,
+
+ /** No component with the specified name string was found */
+ OMX_ErrorComponentNotFound = (OMX_S32) 0x80001003,
+
+ /** The component specified did not have a "OMX_ComponentInit" or
+ "OMX_ComponentDeInit entry point */
+ OMX_ErrorInvalidComponent = (OMX_S32) 0x80001004,
+
+ /** One or more parameters were not valid */
+ OMX_ErrorBadParameter = (OMX_S32) 0x80001005,
+
+ /** The requested function is not implemented */
+ OMX_ErrorNotImplemented = (OMX_S32) 0x80001006,
+
+ /** The buffer was emptied before the next buffer was ready */
+ OMX_ErrorUnderflow = (OMX_S32) 0x80001007,
+
+ /** The buffer was not available when it was needed */
+ OMX_ErrorOverflow = (OMX_S32) 0x80001008,
+
+ /** The hardware failed to respond as expected */
+ OMX_ErrorHardware = (OMX_S32) 0x80001009,
+
+ /** The component is in the state OMX_StateInvalid */
+ OMX_ErrorInvalidState = (OMX_S32) 0x8000100A,
+
+ /** Stream is found to be corrupt */
+ OMX_ErrorStreamCorrupt = (OMX_S32) 0x8000100B,
+
+ /** Ports being connected are not compatible */
+ OMX_ErrorPortsNotCompatible = (OMX_S32) 0x8000100C,
+
+ /** Resources allocated to an idle component have been
+ lost resulting in the component returning to the loaded state */
+ OMX_ErrorResourcesLost = (OMX_S32) 0x8000100D,
+
+ /** No more indicies can be enumerated */
+ OMX_ErrorNoMore = (OMX_S32) 0x8000100E,
+
+ /** The component detected a version mismatch */
+ OMX_ErrorVersionMismatch = (OMX_S32) 0x8000100F,
+
+ /** The component is not ready to return data at this time */
+ OMX_ErrorNotReady = (OMX_S32) 0x80001010,
+
+ /** There was a timeout that occurred */
+ OMX_ErrorTimeout = (OMX_S32) 0x80001011,
+
+ /** This error occurs when trying to transition into the state you are already in */
+ OMX_ErrorSameState = (OMX_S32) 0x80001012,
+
+ /** Resources allocated to an executing or paused component have been
+ preempted, causing the component to return to the idle state */
+ OMX_ErrorResourcesPreempted = (OMX_S32) 0x80001013,
+
+ /** A non-supplier port sends this error to the IL client (via the EventHandler callback)
+ during the allocation of buffers (on a transition from the LOADED to the IDLE state or
+ on a port restart) when it deems that it has waited an unusually long time for the supplier
+ to send it an allocated buffer via a UseBuffer call. */
+ OMX_ErrorPortUnresponsiveDuringAllocation = (OMX_S32) 0x80001014,
+
+ /** A non-supplier port sends this error to the IL client (via the EventHandler callback)
+ during the deallocation of buffers (on a transition from the IDLE to LOADED state or
+ on a port stop) when it deems that it has waited an unusually long time for the supplier
+ to request the deallocation of a buffer header via a FreeBuffer call. */
+ OMX_ErrorPortUnresponsiveDuringDeallocation = (OMX_S32) 0x80001015,
+
+ /** A supplier port sends this error to the IL client (via the EventHandler callback)
+ during the stopping of a port (either on a transition from the IDLE to LOADED
+ state or a port stop) when it deems that it has waited an unusually long time for
+ the non-supplier to return a buffer via an EmptyThisBuffer or FillThisBuffer call. */
+ OMX_ErrorPortUnresponsiveDuringStop = (OMX_S32) 0x80001016,
+
+ /** Attempting a state transtion that is not allowed */
+ OMX_ErrorIncorrectStateTransition = (OMX_S32) 0x80001017,
+
+ /* Attempting a command that is not allowed during the present state. */
+ OMX_ErrorIncorrectStateOperation = (OMX_S32) 0x80001018,
+
+ /** The values encapsulated in the parameter or config structure are not supported. */
+ OMX_ErrorUnsupportedSetting = (OMX_S32) 0x80001019,
+
+ /** The parameter or config indicated by the given index is not supported. */
+ OMX_ErrorUnsupportedIndex = (OMX_S32) 0x8000101A,
+
+ /** The port index supplied is incorrect. */
+ OMX_ErrorBadPortIndex = (OMX_S32) 0x8000101B,
+
+ /** The port has lost one or more of its buffers and it thus unpopulated. */
+ OMX_ErrorPortUnpopulated = (OMX_S32) 0x8000101C,
+
+ /** Component suspended due to temporary loss of resources */
+ OMX_ErrorComponentSuspended = (OMX_S32) 0x8000101D,
+
+ /** Component suspended due to an inability to acquire dynamic resources */
+ OMX_ErrorDynamicResourcesUnavailable = (OMX_S32) 0x8000101E,
+
+ /** When the macroblock error reporting is enabled the component returns new error
+ for every frame that has errors */
+ OMX_ErrorMbErrorsInFrame = (OMX_S32) 0x8000101F,
+
+ /** A component reports this error when it cannot parse or determine the format of an input stream. */
+ OMX_ErrorFormatNotDetected = (OMX_S32) 0x80001020,
+
+ /** The content open operation failed. */
+ OMX_ErrorContentPipeOpenFailed = (OMX_S32) 0x80001021,
+
+ /** The content creation operation failed. */
+ OMX_ErrorContentPipeCreationFailed = (OMX_S32) 0x80001022,
+
+ /** Separate table information is being used */
+ OMX_ErrorSeperateTablesUsed = (OMX_S32) 0x80001023,
+
+ /** Tunneling is unsupported by the component*/
+ OMX_ErrorTunnelingUnsupported = (OMX_S32) 0x80001024,
+
+ OMX_ErrorKhronosExtensions = (OMX_S32)0x8F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_ErrorVendorStartUnused = (OMX_S32)0x90000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_ErrorMax = 0x7FFFFFFF
+} OMX_ERRORTYPE;
+
+/** @ingroup core */
+typedef OMX_ERRORTYPE (* OMX_COMPONENTINITTYPE)(OMX_IN OMX_HANDLETYPE hComponent);
+
+/** @ingroup core */
+typedef struct OMX_COMPONENTREGISTERTYPE
+{
+ const char * pName; /* Component name, 128 byte limit (including '\0') applies */
+ OMX_COMPONENTINITTYPE pInitialize; /* Component instance initialization function */
+} OMX_COMPONENTREGISTERTYPE;
+
+/** @ingroup core */
+extern OMX_COMPONENTREGISTERTYPE OMX_ComponentRegistered[];
+
+/** @ingroup rpm */
+typedef struct OMX_PRIORITYMGMTTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nGroupPriority; /**< Priority of the component group */
+ OMX_U32 nGroupID; /**< ID of the component group */
+} OMX_PRIORITYMGMTTYPE;
+
+/* Component name and Role names are limited to 128 characters including the terminating '\0'. */
+#define OMX_MAX_STRINGNAME_SIZE 128
+
+/** @ingroup comp */
+typedef struct OMX_PARAM_COMPONENTROLETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U8 cRole[OMX_MAX_STRINGNAME_SIZE]; /**< name of standard component which defines component role */
+} OMX_PARAM_COMPONENTROLETYPE;
+
+/** End of Stream Buffer Flag:
+ *
+ * A component sets EOS when it has no more data to emit on a particular
+ * output port. Thus an output port shall set EOS on the last buffer it
+ * emits. A component's determination of when an output port should
+ * cease sending data is implemenation specific.
+ * @ingroup buf
+ */
+
+#define OMX_BUFFERFLAG_EOS 0x00000001
+
+/** Start Time Buffer Flag:
+ *
+ * The source of a stream (e.g. a demux component) sets the STARTTIME
+ * flag on the buffer that contains the starting timestamp for the
+ * stream. The starting timestamp corresponds to the first data that
+ * should be displayed at startup or after a seek.
+ * The first timestamp of the stream is not necessarily the start time.
+ * For instance, in the case of a seek to a particular video frame,
+ * the target frame may be an interframe. Thus the first buffer of
+ * the stream will be the intra-frame preceding the target frame and
+ * the starttime will occur with the target frame (with any other
+ * required frames required to reconstruct the target intervening).
+ *
+ * The STARTTIME flag is directly associated with the buffer's
+ * timestamp ' thus its association to buffer data and its
+ * propagation is identical to the timestamp's.
+ *
+ * When a Sync Component client receives a buffer with the
+ * STARTTIME flag it shall perform a SetConfig on its sync port
+ * using OMX_ConfigTimeClientStartTime and passing the buffer's
+ * timestamp.
+ *
+ * @ingroup buf
+ */
+
+#define OMX_BUFFERFLAG_STARTTIME 0x00000002
+
+
+
+/** Decode Only Buffer Flag:
+ *
+ * The source of a stream (e.g. a demux component) sets the DECODEONLY
+ * flag on any buffer that should shall be decoded but should not be
+ * displayed. This flag is used, for instance, when a source seeks to
+ * a target interframe that requires the decode of frames preceding the
+ * target to facilitate the target's reconstruction. In this case the
+ * source would emit the frames preceding the target downstream
+ * but mark them as decode only.
+ *
+ * The DECODEONLY is associated with buffer data and propagated in a
+ * manner identical to the buffer timestamp.
+ *
+ * A component that renders data should ignore all buffers with
+ * the DECODEONLY flag set.
+ *
+ * @ingroup buf
+ */
+
+#define OMX_BUFFERFLAG_DECODEONLY 0x00000004
+
+
+/* Data Corrupt Flag: This flag is set when the IL client believes the data in the associated buffer is corrupt
+ * @ingroup buf
+ */
+
+#define OMX_BUFFERFLAG_DATACORRUPT 0x00000008
+
+/* End of Frame: The buffer contains exactly one end of frame and no data
+ * occurs after the end of frame. This flag is an optional hint. The absence
+ * of this flag does not imply the absence of an end of frame within the buffer.
+ * @ingroup buf
+*/
+#define OMX_BUFFERFLAG_ENDOFFRAME 0x00000010
+
+/* Sync Frame Flag: This flag is set when the buffer content contains a coded sync frame '
+ * a frame that has no dependency on any other frame information
+ * @ingroup buf
+ */
+#define OMX_BUFFERFLAG_SYNCFRAME 0x00000020
+
+/* Extra data present flag: there is extra data appended to the data stream
+ * residing in the buffer
+ * @ingroup buf
+ */
+#define OMX_BUFFERFLAG_EXTRADATA 0x00000040
+
+/** Codec Config Buffer Flag:
+* OMX_BUFFERFLAG_CODECCONFIG is an optional flag that is set by an
+* output port when all bytes in the buffer form part or all of a set of
+* codec specific configuration data. Examples include SPS/PPS nal units
+* for OMX_VIDEO_CodingAVC or AudioSpecificConfig data for
+* OMX_AUDIO_CodingAAC. Any component that for a given stream sets
+* OMX_BUFFERFLAG_CODECCONFIG shall not mix codec configuration bytes
+* with frame data in the same buffer, and shall send all buffers
+* containing codec configuration bytes before any buffers containing
+* frame data that those configurations bytes describe.
+* If the stream format for a particular codec has a frame specific
+* header at the start of each frame, for example OMX_AUDIO_CodingMP3 or
+* OMX_AUDIO_CodingAAC in ADTS mode, then these shall be presented as
+* normal without setting OMX_BUFFERFLAG_CODECCONFIG.
+ * @ingroup buf
+ */
+#define OMX_BUFFERFLAG_CODECCONFIG 0x00000080
+
+
+
+/** @ingroup buf */
+typedef struct OMX_BUFFERHEADERTYPE
+{
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U8* pBuffer; /**< Pointer to actual block of memory
+ that is acting as the buffer */
+ OMX_U32 nAllocLen; /**< size of the buffer allocated, in bytes */
+ OMX_U32 nFilledLen; /**< number of bytes currently in the
+ buffer */
+ OMX_U32 nOffset; /**< start offset of valid data in bytes from
+ the start of the buffer */
+ OMX_PTR pAppPrivate; /**< pointer to any data the application
+ wants to associate with this buffer */
+ OMX_PTR pPlatformPrivate; /**< pointer to any data the platform
+ wants to associate with this buffer */
+ OMX_PTR pInputPortPrivate; /**< pointer to any data the input port
+ wants to associate with this buffer */
+ OMX_PTR pOutputPortPrivate; /**< pointer to any data the output port
+ wants to associate with this buffer */
+ OMX_HANDLETYPE hMarkTargetComponent; /**< The component that will generate a
+ mark event upon processing this buffer. */
+ OMX_PTR pMarkData; /**< Application specific data associated with
+ the mark sent on a mark event to disambiguate
+ this mark from others. */
+ OMX_U32 nTickCount; /**< Optional entry that the component and
+ application can update with a tick count
+ when they access the component. This
+ value should be in microseconds. Since
+ this is a value relative to an arbitrary
+ starting point, this value cannot be used
+ to determine absolute time. This is an
+ optional entry and not all components
+ will update it.*/
+ OMX_TICKS nTimeStamp; /**< Timestamp corresponding to the sample
+ starting at the first logical sample
+ boundary in the buffer. Timestamps of
+ successive samples within the buffer may
+ be inferred by adding the duration of the
+ of the preceding buffer to the timestamp
+ of the preceding buffer.*/
+ OMX_U32 nFlags; /**< buffer specific flags */
+ OMX_U32 nOutputPortIndex; /**< The index of the output port (if any) using
+ this buffer */
+ OMX_U32 nInputPortIndex; /**< The index of the input port (if any) using
+ this buffer */
+} OMX_BUFFERHEADERTYPE;
+
+/** The OMX_EXTRADATATYPE enumeration is used to define the
+ * possible extra data payload types.
+ * NB: this enum is binary backwards compatible with the previous
+ * OMX_EXTRADATA_QUANT define. This should be replaced with
+ * OMX_ExtraDataQuantization.
+ */
+typedef enum OMX_EXTRADATATYPE
+{
+ OMX_ExtraDataNone = 0, /**< Indicates that no more extra data sections follow */
+ OMX_ExtraDataQuantization, /**< The data payload contains quantization data */
+ OMX_ExtraDataKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_ExtraDataVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_ExtraDataMax = 0x7FFFFFFF
+} OMX_EXTRADATATYPE;
+
+
+typedef struct OMX_OTHER_EXTRADATATYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_EXTRADATATYPE eType; /* Extra Data type */
+ OMX_U32 nDataSize; /* Size of the supporting data to follow */
+ OMX_U8 data[1]; /* Supporting data hint */
+} OMX_OTHER_EXTRADATATYPE;
+
+/** @ingroup comp */
+typedef struct OMX_PORT_PARAM_TYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPorts; /**< The number of ports for this component */
+ OMX_U32 nStartPortNumber; /** first port number for this type of port */
+} OMX_PORT_PARAM_TYPE;
+
+/** @ingroup comp */
+typedef enum OMX_EVENTTYPE
+{
+ OMX_EventCmdComplete, /**< component has sucessfully completed a command */
+ OMX_EventError, /**< component has detected an error condition */
+ OMX_EventMark, /**< component has detected a buffer mark */
+ OMX_EventPortSettingsChanged, /**< component is reported a port settings change */
+ OMX_EventBufferFlag, /**< component has detected an EOS */
+ OMX_EventResourcesAcquired, /**< component has been granted resources and is
+ automatically starting the state change from
+ OMX_StateWaitForResources to OMX_StateIdle. */
+ OMX_EventComponentResumed, /**< Component resumed due to reacquisition of resources */
+ OMX_EventDynamicResourcesAvailable, /**< Component has acquired previously unavailable dynamic resources */
+ OMX_EventPortFormatDetected, /**< Component has detected a supported format. */
+ OMX_EventKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_EventVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_EventMax = 0x7FFFFFFF
+} OMX_EVENTTYPE;
+
+typedef struct OMX_CALLBACKTYPE
+{
+ /** The EventHandler method is used to notify the application when an
+ event of interest occurs. Events are defined in the OMX_EVENTTYPE
+ enumeration. Please see that enumeration for details of what will
+ be returned for each type of event. Callbacks should not return
+ an error to the component, so if an error occurs, the application
+ shall handle it internally. This is a blocking call.
+
+ The application should return from this call within 5 msec to avoid
+ blocking the component for an excessively long period of time.
+
+ @param hComponent
+ handle of the component to access. This is the component
+ handle returned by the call to the GetHandle function.
+ @param pAppData
+ pointer to an application defined value that was provided in the
+ pAppData parameter to the OMX_GetHandle method for the component.
+ This application defined value is provided so that the application
+ can have a component specific context when receiving the callback.
+ @param eEvent
+ Event that the component wants to notify the application about.
+ @param nData1
+ nData will be the OMX_ERRORTYPE for an error event and will be
+ an OMX_COMMANDTYPE for a command complete event and OMX_INDEXTYPE for a OMX_PortSettingsChanged event.
+ @param nData2
+ nData2 will hold further information related to the event. Can be OMX_STATETYPE for
+ a OMX_CommandStateSet command or port index for a OMX_PortSettingsChanged event.
+ Default value is 0 if not used. )
+ @param pEventData
+ Pointer to additional event-specific data (see spec for meaning).
+ */
+
+ OMX_ERRORTYPE (*EventHandler)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_PTR pAppData,
+ OMX_IN OMX_EVENTTYPE eEvent,
+ OMX_IN OMX_U32 nData1,
+ OMX_IN OMX_U32 nData2,
+ OMX_IN OMX_PTR pEventData);
+
+ /** The EmptyBufferDone method is used to return emptied buffers from an
+ input port back to the application for reuse. This is a blocking call
+ so the application should not attempt to refill the buffers during this
+ call, but should queue them and refill them in another thread. There
+ is no error return, so the application shall handle any errors generated
+ internally.
+
+ The application should return from this call within 5 msec.
+
+ @param hComponent
+ handle of the component to access. This is the component
+ handle returned by the call to the GetHandle function.
+ @param pAppData
+ pointer to an application defined value that was provided in the
+ pAppData parameter to the OMX_GetHandle method for the component.
+ This application defined value is provided so that the application
+ can have a component specific context when receiving the callback.
+ @param pBuffer
+ pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+ or AllocateBuffer indicating the buffer that was emptied.
+ @ingroup buf
+ */
+ OMX_ERRORTYPE (*EmptyBufferDone)(
+ OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_PTR pAppData,
+ OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
+
+ /** The FillBufferDone method is used to return filled buffers from an
+ output port back to the application for emptying and then reuse.
+ This is a blocking call so the application should not attempt to
+ empty the buffers during this call, but should queue the buffers
+ and empty them in another thread. There is no error return, so
+ the application shall handle any errors generated internally. The
+ application shall also update the buffer header to indicate the
+ number of bytes placed into the buffer.
+
+ The application should return from this call within 5 msec.
+
+ @param hComponent
+ handle of the component to access. This is the component
+ handle returned by the call to the GetHandle function.
+ @param pAppData
+ pointer to an application defined value that was provided in the
+ pAppData parameter to the OMX_GetHandle method for the component.
+ This application defined value is provided so that the application
+ can have a component specific context when receiving the callback.
+ @param pBuffer
+ pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+ or AllocateBuffer indicating the buffer that was filled.
+ @ingroup buf
+ */
+ OMX_ERRORTYPE (*FillBufferDone)(
+ OMX_OUT OMX_HANDLETYPE hComponent,
+ OMX_OUT OMX_PTR pAppData,
+ OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);
+
+} OMX_CALLBACKTYPE;
+
+/** The OMX_BUFFERSUPPLIERTYPE enumeration is used to dictate port supplier
+ preference when tunneling between two ports.
+ @ingroup tun buf
+*/
+typedef enum OMX_BUFFERSUPPLIERTYPE
+{
+ OMX_BufferSupplyUnspecified = 0x0, /**< port supplying the buffers is unspecified,
+ or don't care */
+ OMX_BufferSupplyInput, /**< input port supplies the buffers */
+ OMX_BufferSupplyOutput, /**< output port supplies the buffers */
+ OMX_BufferSupplyKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_BufferSupplyVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_BufferSupplyMax = 0x7FFFFFFF
+} OMX_BUFFERSUPPLIERTYPE;
+
+
+/** buffer supplier parameter
+ * @ingroup tun
+ */
+typedef struct OMX_PARAM_BUFFERSUPPLIERTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_BUFFERSUPPLIERTYPE eBufferSupplier; /**< buffer supplier */
+} OMX_PARAM_BUFFERSUPPLIERTYPE;
+
+
+/**< indicates that buffers received by an input port of a tunnel
+ may not modify the data in the buffers
+ @ingroup tun
+ */
+#define OMX_PORTTUNNELFLAG_READONLY 0x00000001
+
+
+/** The OMX_TUNNELSETUPTYPE structure is used to pass data from an output
+ port to an input port as part the two ComponentTunnelRequest calls
+ resulting from a OMX_SetupTunnel call from the IL Client.
+ @ingroup tun
+ */
+typedef struct OMX_TUNNELSETUPTYPE
+{
+ OMX_U32 nTunnelFlags; /**< bit flags for tunneling */
+ OMX_BUFFERSUPPLIERTYPE eSupplier; /**< supplier preference */
+} OMX_TUNNELSETUPTYPE;
+
+/* OMX Component headers is included to enable the core to use
+ macros for functions into the component for OMX release 1.0.
+ Developers should not access any structures or data from within
+ the component header directly */
+/* TO BE REMOVED - #include <OMX_Component.h> */
+
+/** GetComponentVersion will return information about the component.
+ This is a blocking call. This macro will go directly from the
+ application to the component (via a core macro). The
+ component will return from this call within 5 msec.
+ @param [in] hComponent
+ handle of component to execute the command
+ @param [out] pComponentName
+ pointer to an empty string of length 128 bytes. The component
+ will write its name into this string. The name will be
+ terminated by a single zero byte. The name of a component will
+ be 127 bytes or less to leave room for the trailing zero byte.
+ An example of a valid component name is "OMX.ABC.ChannelMixer\0".
+ @param [out] pComponentVersion
+ pointer to an OMX Version structure that the component will fill
+ in. The component will fill in a value that indicates the
+ component version. NOTE: the component version is NOT the same
+ as the OMX Specification version (found in all structures). The
+ component version is defined by the vendor of the component and
+ its value is entirely up to the component vendor.
+ @param [out] pSpecVersion
+ pointer to an OMX Version structure that the component will fill
+ in. The SpecVersion is the version of the specification that the
+ component was built against. Please note that this value may or
+ may not match the structure's version. For example, if the
+ component was built against the 2.0 specification, but the
+ application (which creates the structure is built against the
+ 1.0 specification the versions would be different.
+ @param [out] pComponentUUID
+ pointer to the UUID of the component which will be filled in by
+ the component. The UUID is a unique identifier that is set at
+ RUN time for the component and is unique to each instantion of
+ the component.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp
+ */
+#define OMX_GetComponentVersion( \
+ hComponent, \
+ pComponentName, \
+ pComponentVersion, \
+ pSpecVersion, \
+ pComponentUUID) \
+ ((OMX_COMPONENTTYPE*)hComponent)->GetComponentVersion( \
+ hComponent, \
+ pComponentName, \
+ pComponentVersion, \
+ pSpecVersion, \
+ pComponentUUID) /* Macro End */
+
+
+/** Send a command to the component. This call is a non-blocking call.
+ The component should check the parameters and then queue the command
+ to the component thread to be executed. The component thread shall
+ send the EventHandler() callback at the conclusion of the command.
+ This macro will go directly from the application to the component (via
+ a core macro). The component will return from this call within 5 msec.
+
+ When the command is "OMX_CommandStateSet" the component will queue a
+ state transition to the new state idenfied in nParam.
+
+ When the command is "OMX_CommandFlush", to flush a port's buffer queues,
+ the command will force the component to return all buffers NOT CURRENTLY
+ BEING PROCESSED to the application, in the order in which the buffers
+ were received.
+
+ When the command is "OMX_CommandPortDisable" or
+ "OMX_CommandPortEnable", the component's port (given by the value of
+ nParam) will be stopped or restarted.
+
+ When the command "OMX_CommandMarkBuffer" is used to mark a buffer, the
+ pCmdData will point to a OMX_MARKTYPE structure containing the component
+ handle of the component to examine the buffer chain for the mark. nParam1
+ contains the index of the port on which the buffer mark is applied.
+
+ Specification text for more details.
+
+ @param [in] hComponent
+ handle of component to execute the command
+ @param [in] Cmd
+ Command for the component to execute
+ @param [in] nParam
+ Parameter for the command to be executed. When Cmd has the value
+ OMX_CommandStateSet, value is a member of OMX_STATETYPE. When Cmd has
+ the value OMX_CommandFlush, value of nParam indicates which port(s)
+ to flush. -1 is used to flush all ports a single port index will
+ only flush that port. When Cmd has the value "OMX_CommandPortDisable"
+ or "OMX_CommandPortEnable", the component's port is given by
+ the value of nParam. When Cmd has the value "OMX_CommandMarkBuffer"
+ the components pot is given by the value of nParam.
+ @param [in] pCmdData
+ Parameter pointing to the OMX_MARKTYPE structure when Cmd has the value
+ "OMX_CommandMarkBuffer".
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp
+ */
+#define OMX_SendCommand( \
+ hComponent, \
+ Cmd, \
+ nParam, \
+ pCmdData) \
+ ((OMX_COMPONENTTYPE*)hComponent)->SendCommand( \
+ hComponent, \
+ Cmd, \
+ nParam, \
+ pCmdData) /* Macro End */
+
+
+/** The OMX_GetParameter macro will get one of the current parameter
+ settings from the component. This macro cannot only be invoked when
+ the component is in the OMX_StateInvalid state. The nParamIndex
+ parameter is used to indicate which structure is being requested from
+ the component. The application shall allocate the correct structure
+ and shall fill in the structure size and version information before
+ invoking this macro. When the parameter applies to a port, the
+ caller shall fill in the appropriate nPortIndex value indicating the
+ port on which the parameter applies. If the component has not had
+ any settings changed, then the component should return a set of
+ valid DEFAULT parameters for the component. This is a blocking
+ call.
+
+ The component should return from this call within 20 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [in] nParamIndex
+ Index of the structure to be filled. This value is from the
+ OMX_INDEXTYPE enumeration.
+ @param [in,out] pComponentParameterStructure
+ Pointer to application allocated structure to be filled by the
+ component.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp
+ */
+#define OMX_GetParameter( \
+ hComponent, \
+ nParamIndex, \
+ pComponentParameterStructure) \
+ ((OMX_COMPONENTTYPE*)hComponent)->GetParameter( \
+ hComponent, \
+ nParamIndex, \
+ pComponentParameterStructure) /* Macro End */
+
+
+/** The OMX_SetParameter macro will send an initialization parameter
+ structure to a component. Each structure shall be sent one at a time,
+ in a separate invocation of the macro. This macro can only be
+ invoked when the component is in the OMX_StateLoaded state, or the
+ port is disabled (when the parameter applies to a port). The
+ nParamIndex parameter is used to indicate which structure is being
+ passed to the component. The application shall allocate the
+ correct structure and shall fill in the structure size and version
+ information (as well as the actual data) before invoking this macro.
+ The application is free to dispose of this structure after the call
+ as the component is required to copy any data it shall retain. This
+ is a blocking call.
+
+ The component should return from this call within 20 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [in] nIndex
+ Index of the structure to be sent. This value is from the
+ OMX_INDEXTYPE enumeration.
+ @param [in] pComponentParameterStructure
+ pointer to application allocated structure to be used for
+ initialization by the component.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp
+ */
+#define OMX_SetParameter( \
+ hComponent, \
+ nParamIndex, \
+ pComponentParameterStructure) \
+ ((OMX_COMPONENTTYPE*)hComponent)->SetParameter( \
+ hComponent, \
+ nParamIndex, \
+ pComponentParameterStructure) /* Macro End */
+
+
+/** The OMX_GetConfig macro will get one of the configuration structures
+ from a component. This macro can be invoked anytime after the
+ component has been loaded. The nParamIndex call parameter is used to
+ indicate which structure is being requested from the component. The
+ application shall allocate the correct structure and shall fill in the
+ structure size and version information before invoking this macro.
+ If the component has not had this configuration parameter sent before,
+ then the component should return a set of valid DEFAULT values for the
+ component. This is a blocking call.
+
+ The component should return from this call within 5 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [in] nIndex
+ Index of the structure to be filled. This value is from the
+ OMX_INDEXTYPE enumeration.
+ @param [in,out] pComponentConfigStructure
+ pointer to application allocated structure to be filled by the
+ component.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp
+*/
+#define OMX_GetConfig( \
+ hComponent, \
+ nConfigIndex, \
+ pComponentConfigStructure) \
+ ((OMX_COMPONENTTYPE*)hComponent)->GetConfig( \
+ hComponent, \
+ nConfigIndex, \
+ pComponentConfigStructure) /* Macro End */
+
+
+/** The OMX_SetConfig macro will send one of the configuration
+ structures to a component. Each structure shall be sent one at a time,
+ each in a separate invocation of the macro. This macro can be invoked
+ anytime after the component has been loaded. The application shall
+ allocate the correct structure and shall fill in the structure size
+ and version information (as well as the actual data) before invoking
+ this macro. The application is free to dispose of this structure after
+ the call as the component is required to copy any data it shall retain.
+ This is a blocking call.
+
+ The component should return from this call within 5 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [in] nConfigIndex
+ Index of the structure to be sent. This value is from the
+ OMX_INDEXTYPE enumeration above.
+ @param [in] pComponentConfigStructure
+ pointer to application allocated structure to be used for
+ initialization by the component.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp
+ */
+#define OMX_SetConfig( \
+ hComponent, \
+ nConfigIndex, \
+ pComponentConfigStructure) \
+ ((OMX_COMPONENTTYPE*)hComponent)->SetConfig( \
+ hComponent, \
+ nConfigIndex, \
+ pComponentConfigStructure) /* Macro End */
+
+
+/** The OMX_GetExtensionIndex macro will invoke a component to translate
+ a vendor specific configuration or parameter string into an OMX
+ structure index. There is no requirement for the vendor to support
+ this command for the indexes already found in the OMX_INDEXTYPE
+ enumeration (this is done to save space in small components). The
+ component shall support all vendor supplied extension indexes not found
+ in the master OMX_INDEXTYPE enumeration. This is a blocking call.
+
+ The component should return from this call within 5 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the GetHandle function.
+ @param [in] cParameterName
+ OMX_STRING that shall be less than 128 characters long including
+ the trailing null byte. This is the string that will get
+ translated by the component into a configuration index.
+ @param [out] pIndexType
+ a pointer to a OMX_INDEXTYPE to receive the index value.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp
+ */
+#define OMX_GetExtensionIndex( \
+ hComponent, \
+ cParameterName, \
+ pIndexType) \
+ ((OMX_COMPONENTTYPE*)hComponent)->GetExtensionIndex( \
+ hComponent, \
+ cParameterName, \
+ pIndexType) /* Macro End */
+
+
+/** The OMX_GetState macro will invoke the component to get the current
+ state of the component and place the state value into the location
+ pointed to by pState.
+
+ The component should return from this call within 5 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [out] pState
+ pointer to the location to receive the state. The value returned
+ is one of the OMX_STATETYPE members
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp
+ */
+#define OMX_GetState( \
+ hComponent, \
+ pState) \
+ ((OMX_COMPONENTTYPE*)hComponent)->GetState( \
+ hComponent, \
+ pState) /* Macro End */
+
+
+/** The OMX_UseBuffer macro will request that the component use
+ a buffer (and allocate its own buffer header) already allocated
+ by another component, or by the IL Client. This is a blocking
+ call.
+
+ The component should return from this call within 20 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [out] ppBuffer
+ pointer to an OMX_BUFFERHEADERTYPE structure used to receive the
+ pointer to the buffer header
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp buf
+ */
+
+#define OMX_UseBuffer( \
+ hComponent, \
+ ppBufferHdr, \
+ nPortIndex, \
+ pAppPrivate, \
+ nSizeBytes, \
+ pBuffer) \
+ ((OMX_COMPONENTTYPE*)hComponent)->UseBuffer( \
+ hComponent, \
+ ppBufferHdr, \
+ nPortIndex, \
+ pAppPrivate, \
+ nSizeBytes, \
+ pBuffer)
+
+
+/** The OMX_AllocateBuffer macro will request that the component allocate
+ a new buffer and buffer header. The component will allocate the
+ buffer and the buffer header and return a pointer to the buffer
+ header. This is a blocking call.
+
+ The component should return from this call within 5 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [out] ppBuffer
+ pointer to an OMX_BUFFERHEADERTYPE structure used to receive
+ the pointer to the buffer header
+ @param [in] nPortIndex
+ nPortIndex is used to select the port on the component the buffer will
+ be used with. The port can be found by using the nPortIndex
+ value as an index into the Port Definition array of the component.
+ @param [in] pAppPrivate
+ pAppPrivate is used to initialize the pAppPrivate member of the
+ buffer header structure.
+ @param [in] nSizeBytes
+ size of the buffer to allocate. Used when bAllocateNew is true.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp buf
+ */
+#define OMX_AllocateBuffer( \
+ hComponent, \
+ ppBuffer, \
+ nPortIndex, \
+ pAppPrivate, \
+ nSizeBytes) \
+ ((OMX_COMPONENTTYPE*)hComponent)->AllocateBuffer( \
+ hComponent, \
+ ppBuffer, \
+ nPortIndex, \
+ pAppPrivate, \
+ nSizeBytes) /* Macro End */
+
+
+/** The OMX_FreeBuffer macro will release a buffer header from the component
+ which was allocated using either OMX_AllocateBuffer or OMX_UseBuffer. If
+ the component allocated the buffer (see the OMX_UseBuffer macro) then
+ the component shall free the buffer and buffer header. This is a
+ blocking call.
+
+ The component should return from this call within 20 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [in] nPortIndex
+ nPortIndex is used to select the port on the component the buffer will
+ be used with.
+ @param [in] pBuffer
+ pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+ or AllocateBuffer.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp buf
+ */
+#define OMX_FreeBuffer( \
+ hComponent, \
+ nPortIndex, \
+ pBuffer) \
+ ((OMX_COMPONENTTYPE*)hComponent)->FreeBuffer( \
+ hComponent, \
+ nPortIndex, \
+ pBuffer) /* Macro End */
+
+
+/** The OMX_EmptyThisBuffer macro will send a buffer full of data to an
+ input port of a component. The buffer will be emptied by the component
+ and returned to the application via the EmptyBufferDone call back.
+ This is a non-blocking call in that the component will record the buffer
+ and return immediately and then empty the buffer, later, at the proper
+ time. As expected, this macro may be invoked only while the component
+ is in the OMX_StateExecuting. If nPortIndex does not specify an input
+ port, the component shall return an error.
+
+ The component should return from this call within 5 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [in] pBuffer
+ pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+ or AllocateBuffer.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp buf
+ */
+#define OMX_EmptyThisBuffer( \
+ hComponent, \
+ pBuffer) \
+ ((OMX_COMPONENTTYPE*)hComponent)->EmptyThisBuffer( \
+ hComponent, \
+ pBuffer) /* Macro End */
+
+
+/** The OMX_FillThisBuffer macro will send an empty buffer to an
+ output port of a component. The buffer will be filled by the component
+ and returned to the application via the FillBufferDone call back.
+ This is a non-blocking call in that the component will record the buffer
+ and return immediately and then fill the buffer, later, at the proper
+ time. As expected, this macro may be invoked only while the component
+ is in the OMX_ExecutingState. If nPortIndex does not specify an output
+ port, the component shall return an error.
+
+ The component should return from this call within 5 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [in] pBuffer
+ pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+ or AllocateBuffer.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp buf
+ */
+#define OMX_FillThisBuffer( \
+ hComponent, \
+ pBuffer) \
+ ((OMX_COMPONENTTYPE*)hComponent)->FillThisBuffer( \
+ hComponent, \
+ pBuffer) /* Macro End */
+
+
+
+/** The OMX_UseEGLImage macro will request that the component use
+ a EGLImage provided by EGL (and allocate its own buffer header)
+ This is a blocking call.
+
+ The component should return from this call within 20 msec.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the OMX_GetHandle function.
+ @param [out] ppBuffer
+ pointer to an OMX_BUFFERHEADERTYPE structure used to receive the
+ pointer to the buffer header. Note that the memory location used
+ for this buffer is NOT visible to the IL Client.
+ @param [in] nPortIndex
+ nPortIndex is used to select the port on the component the buffer will
+ be used with. The port can be found by using the nPortIndex
+ value as an index into the Port Definition array of the component.
+ @param [in] pAppPrivate
+ pAppPrivate is used to initialize the pAppPrivate member of the
+ buffer header structure.
+ @param [in] eglImage
+ eglImage contains the handle of the EGLImage to use as a buffer on the
+ specified port. The component is expected to validate properties of
+ the EGLImage against the configuration of the port to ensure the component
+ can use the EGLImage as a buffer.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup comp buf
+ */
+#define OMX_UseEGLImage( \
+ hComponent, \
+ ppBufferHdr, \
+ nPortIndex, \
+ pAppPrivate, \
+ eglImage) \
+ ((OMX_COMPONENTTYPE*)hComponent)->UseEGLImage( \
+ hComponent, \
+ ppBufferHdr, \
+ nPortIndex, \
+ pAppPrivate, \
+ eglImage)
+
+/** The OMX_Init method is used to initialize the OMX core. It shall be the
+ first call made into OMX and it should only be executed one time without
+ an interviening OMX_Deinit call.
+
+ The core should return from this call within 20 msec.
+
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void);
+
+
+/** The OMX_Deinit method is used to deinitialize the OMX core. It shall be
+ the last call made into OMX. In the event that the core determines that
+ thare are components loaded when this call is made, the core may return
+ with an error rather than try to unload the components.
+
+ The core should return from this call within 20 msec.
+
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void);
+
+
+/** The OMX_ComponentNameEnum method will enumerate through all the names of
+ recognised valid components in the system. This function is provided
+ as a means to detect all the components in the system run-time. There is
+ no strict ordering to the enumeration order of component names, although
+ each name will only be enumerated once. If the OMX core supports run-time
+ installation of new components, it is only requried to detect newly
+ installed components when the first call to enumerate component names
+ is made (i.e. when nIndex is 0x0).
+
+ The core should return from this call in 20 msec.
+
+ @param [out] cComponentName
+ pointer to a null terminated string with the component name. The
+ names of the components are strings less than 127 bytes in length
+ plus the trailing null for a maximum size of 128 bytes. An example
+ of a valid component name is "OMX.TI.AUDIO.DSP.MIXER\0". Names are
+ assigned by the vendor, but shall start with "OMX." and then have
+ the Vendor designation next.
+ @param [in] nNameLength
+ number of characters in the cComponentName string. With all
+ component name strings restricted to less than 128 characters
+ (including the trailing null) it is recomended that the caller
+ provide a input string for the cComponentName of 128 characters.
+ @param [in] nIndex
+ number containing the enumeration index for the component.
+ Multiple calls to OMX_ComponentNameEnum with increasing values
+ of nIndex will enumerate through the component names in the
+ system until OMX_ErrorNoMore is returned. The value of nIndex
+ is 0 to (N-1), where N is the number of valid installed components
+ in the system.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. When the value of nIndex exceeds the number of
+ components in the system minus 1, OMX_ErrorNoMore will be
+ returned. Otherwise the appropriate OMX error will be returned.
+ @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(
+ OMX_OUT OMX_STRING cComponentName,
+ OMX_IN OMX_U32 nNameLength,
+ OMX_IN OMX_U32 nIndex);
+
+
+/** The OMX_GetHandle method will locate the component specified by the
+ component name given, load that component into memory and then invoke
+ the component's methods to create an instance of the component.
+
+ The core should return from this call within 20 msec.
+
+ @param [out] pHandle
+ pointer to an OMX_HANDLETYPE pointer to be filled in by this method.
+ @param [in] cComponentName
+ pointer to a null terminated string with the component name. The
+ names of the components are strings less than 127 bytes in length
+ plus the trailing null for a maximum size of 128 bytes. An example
+ of a valid component name is "OMX.TI.AUDIO.DSP.MIXER\0". Names are
+ assigned by the vendor, but shall start with "OMX." and then have
+ the Vendor designation next.
+ @param [in] pAppData
+ pointer to an application defined value that will be returned
+ during callbacks so that the application can identify the source
+ of the callback.
+ @param [in] pCallBacks
+ pointer to a OMX_CALLBACKTYPE structure that will be passed to the
+ component to initialize it with.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle(
+ OMX_OUT OMX_HANDLETYPE* pHandle,
+ OMX_IN OMX_STRING cComponentName,
+ OMX_IN OMX_PTR pAppData,
+ OMX_IN OMX_CALLBACKTYPE* pCallBacks);
+
+
+/** The OMX_FreeHandle method will free a handle allocated by the OMX_GetHandle
+ method. If the component reference count goes to zero, the component will
+ be unloaded from memory.
+
+ The core should return from this call within 20 msec when the component is
+ in the OMX_StateLoaded state.
+
+ @param [in] hComponent
+ Handle of the component to be accessed. This is the component
+ handle returned by the call to the GetHandle function.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle(
+ OMX_IN OMX_HANDLETYPE hComponent);
+
+
+
+/** The OMX_SetupTunnel method will handle the necessary calls to the components
+ to setup the specified tunnel the two components. NOTE: This is
+ an actual method (not a #define macro). This method will make calls into
+ the component ComponentTunnelRequest method to do the actual tunnel
+ connection.
+
+ The ComponentTunnelRequest method on both components will be called.
+ This method shall not be called unless the component is in the
+ OMX_StateLoaded state except when the ports used for the tunnel are
+ disabled. In this case, the component may be in the OMX_StateExecuting,
+ OMX_StatePause, or OMX_StateIdle states.
+
+ The core should return from this call within 20 msec.
+
+ @param [in] hOutput
+ Handle of the component to be accessed. Also this is the handle
+ of the component whose port, specified in the nPortOutput parameter
+ will be used the source for the tunnel. This is the component handle
+ returned by the call to the OMX_GetHandle function. There is a
+ requirement that hOutput be the source for the data when
+ tunelling (i.e. nPortOutput is an output port). If 0x0, the component
+ specified in hInput will have it's port specified in nPortInput
+ setup for communication with the application / IL client.
+ @param [in] nPortOutput
+ nPortOutput is used to select the source port on component to be
+ used in the tunnel.
+ @param [in] hInput
+ This is the component to setup the tunnel with. This is the handle
+ of the component whose port, specified in the nPortInput parameter
+ will be used the destination for the tunnel. This is the component handle
+ returned by the call to the OMX_GetHandle function. There is a
+ requirement that hInput be the destination for the data when
+ tunelling (i.e. nPortInut is an input port). If 0x0, the component
+ specified in hOutput will have it's port specified in nPortPOutput
+ setup for communication with the application / IL client.
+ @param [in] nPortInput
+ nPortInput is used to select the destination port on component to be
+ used in the tunnel.
+ @return OMX_ERRORTYPE
+ If the command successfully executes, the return code will be
+ OMX_ErrorNone. Otherwise the appropriate OMX error will be returned.
+ When OMX_ErrorNotImplemented is returned, one or both components is
+ a non-interop component and does not support tunneling.
+
+ On failure, the ports of both components are setup for communication
+ with the application / IL Client.
+ @ingroup core tun
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel(
+ OMX_IN OMX_HANDLETYPE hOutput,
+ OMX_IN OMX_U32 nPortOutput,
+ OMX_IN OMX_HANDLETYPE hInput,
+ OMX_IN OMX_U32 nPortInput);
+
+/** @ingroup cp */
+OMX_API OMX_ERRORTYPE OMX_GetContentPipe(
+ OMX_OUT OMX_HANDLETYPE *hPipe,
+ OMX_IN OMX_STRING szURI);
+
+/** The OMX_GetComponentsOfRole method will return the number of components that support the given
+ role and (if the compNames field is non-NULL) the names of those components. The call will fail if
+ an insufficiently sized array of names is supplied. To ensure the array is sufficiently sized the
+ client should:
+ * first call this function with the compNames field NULL to determine the number of component names
+ * second call this function with the compNames field pointing to an array of names allocated
+ according to the number returned by the first call.
+
+ The core should return from this call within 5 msec.
+
+ @param [in] role
+ This is generic standard component name consisting only of component class
+ name and the type within that class (e.g. 'audio_decoder.aac').
+ @param [inout] pNumComps
+ This is used both as input and output.
+
+ If compNames is NULL, the input is ignored and the output specifies how many components support
+ the given role.
+
+ If compNames is not NULL, on input it bounds the size of the input structure and
+ on output, it specifies the number of components string names listed within the compNames parameter.
+ @param [inout] compNames
+ If NULL this field is ignored. If non-NULL this points to an array of 128-byte strings which accepts
+ a list of the names of all physical components that implement the specified standard component name.
+ Each name is NULL terminated. numComps indicates the number of names.
+ @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole (
+ OMX_IN OMX_STRING role,
+ OMX_INOUT OMX_U32 *pNumComps,
+ OMX_INOUT OMX_U8 **compNames);
+
+/** The OMX_GetRolesOfComponent method will return the number of roles supported by the given
+ component and (if the roles field is non-NULL) the names of those roles. The call will fail if
+ an insufficiently sized array of names is supplied. To ensure the array is sufficiently sized the
+ client should:
+ * first call this function with the roles field NULL to determine the number of role names
+ * second call this function with the roles field pointing to an array of names allocated
+ according to the number returned by the first call.
+
+ The core should return from this call within 5 msec.
+
+ @param [in] compName
+ This is the name of the component being queried about.
+ @param [inout] pNumRoles
+ This is used both as input and output.
+
+ If roles is NULL, the input is ignored and the output specifies how many roles the component supports.
+
+ If compNames is not NULL, on input it bounds the size of the input structure and
+ on output, it specifies the number of roles string names listed within the roles parameter.
+ @param [out] roles
+ If NULL this field is ignored. If non-NULL this points to an array of 128-byte strings
+ which accepts a list of the names of all standard components roles implemented on the
+ specified component name. numComps indicates the number of names.
+ @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent (
+ OMX_IN OMX_STRING compName,
+ OMX_INOUT OMX_U32 *pNumRoles,
+ OMX_OUT OMX_U8 **roles);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
+
diff --git a/mm-core/inc/OMX_CoreExt.h b/mm-core/inc/OMX_CoreExt.h
new file mode 100755
index 00000000..3ec14b05
--- /dev/null
+++ b/mm-core/inc/OMX_CoreExt.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2009 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/** OMX_CoreExt.h - OpenMax IL version 1.1.2
+ * The OMX_CoreExt header file contains extensions to the definitions used
+ * by both the application and the component to access common items.
+ */
+
+#ifndef OMX_CoreExt_h
+#define OMX_CoreExt_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Each OMX header shall include all required header files to allow the
+ * header to compile without errors. The includes below are required
+ * for this header file to compile successfully
+ */
+#include <OMX_Core.h>
+
+
+/** Event type extensions. */
+typedef enum OMX_EVENTEXTTYPE
+{
+ OMX_EventIndexSettingChanged = OMX_EventKhronosExtensions, /**< component signals the IL client of a change
+ in a param, config, or extension */
+ OMX_EventExtMax = 0x7FFFFFFF
+} OMX_EVENTEXTTYPE;
+
+
+/** Enable or disable a callback event. */
+typedef struct OMX_CONFIG_CALLBACKREQUESTTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_INDEXTYPE nIndex; /**< the index the callback is requested for */
+ OMX_BOOL bEnable; /**< enable (OMX_TRUE) or disable (OMX_FALSE) the callback */
+} OMX_CONFIG_CALLBACKREQUESTTYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* OMX_CoreExt_h */
+/* File EOF */
diff --git a/mm-core/inc/OMX_IVCommon.h b/mm-core/inc/OMX_IVCommon.h
new file mode 100755
index 00000000..4c4995ce
--- /dev/null
+++ b/mm-core/inc/OMX_IVCommon.h
@@ -0,0 +1,920 @@
+/**
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/**
+ * @file OMX_IVCommon.h - OpenMax IL version 1.1.2
+ * The structures needed by Video and Image components to exchange
+ * parameters and configuration data with the components.
+ */
+#ifndef OMX_IVCommon_h
+#define OMX_IVCommon_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * Each OMX header must include all required header files to allow the header
+ * to compile without errors. The includes below are required for this header
+ * file to compile successfully
+ */
+
+#include <OMX_Core.h>
+
+/** @defgroup iv OpenMAX IL Imaging and Video Domain
+ * Common structures for OpenMAX IL Imaging and Video domains
+ * @{
+ */
+
+
+/**
+ * Enumeration defining possible uncompressed image/video formats.
+ *
+ * ENUMS:
+ * Unused : Placeholder value when format is N/A
+ * Monochrome : black and white
+ * 8bitRGB332 : Red 7:5, Green 4:2, Blue 1:0
+ * 12bitRGB444 : Red 11:8, Green 7:4, Blue 3:0
+ * 16bitARGB4444 : Alpha 15:12, Red 11:8, Green 7:4, Blue 3:0
+ * 16bitARGB1555 : Alpha 15, Red 14:10, Green 9:5, Blue 4:0
+ * 16bitRGB565 : Red 15:11, Green 10:5, Blue 4:0
+ * 16bitBGR565 : Blue 15:11, Green 10:5, Red 4:0
+ * 18bitRGB666 : Red 17:12, Green 11:6, Blue 5:0
+ * 18bitARGB1665 : Alpha 17, Red 16:11, Green 10:5, Blue 4:0
+ * 19bitARGB1666 : Alpha 18, Red 17:12, Green 11:6, Blue 5:0
+ * 24bitRGB888 : Red 24:16, Green 15:8, Blue 7:0
+ * 24bitBGR888 : Blue 24:16, Green 15:8, Red 7:0
+ * 24bitARGB1887 : Alpha 23, Red 22:15, Green 14:7, Blue 6:0
+ * 25bitARGB1888 : Alpha 24, Red 23:16, Green 15:8, Blue 7:0
+ * 32bitBGRA8888 : Blue 31:24, Green 23:16, Red 15:8, Alpha 7:0
+ * 32bitARGB8888 : Alpha 31:24, Red 23:16, Green 15:8, Blue 7:0
+ * YUV411Planar : U,Y are subsampled by a factor of 4 horizontally
+ * YUV411PackedPlanar : packed per payload in planar slices
+ * YUV420Planar : Three arrays Y,U,V.
+ * YUV420PackedPlanar : packed per payload in planar slices
+ * YUV420SemiPlanar : Two arrays, one is all Y, the other is U and V
+ * YUV422Planar : Three arrays Y,U,V.
+ * YUV422PackedPlanar : packed per payload in planar slices
+ * YUV422SemiPlanar : Two arrays, one is all Y, the other is U and V
+ * YCbYCr : Organized as 16bit YUYV (i.e. YCbYCr)
+ * YCrYCb : Organized as 16bit YVYU (i.e. YCrYCb)
+ * CbYCrY : Organized as 16bit UYVY (i.e. CbYCrY)
+ * CrYCbY : Organized as 16bit VYUY (i.e. CrYCbY)
+ * YUV444Interleaved : Each pixel contains equal parts YUV
+ * RawBayer8bit : SMIA camera output format
+ * RawBayer10bit : SMIA camera output format
+ * RawBayer8bitcompressed : SMIA camera output format
+ */
+typedef enum OMX_COLOR_FORMATTYPE {
+ OMX_COLOR_FormatUnused,
+ OMX_COLOR_FormatMonochrome,
+ OMX_COLOR_Format8bitRGB332,
+ OMX_COLOR_Format12bitRGB444,
+ OMX_COLOR_Format16bitARGB4444,
+ OMX_COLOR_Format16bitARGB1555,
+ OMX_COLOR_Format16bitRGB565,
+ OMX_COLOR_Format16bitBGR565,
+ OMX_COLOR_Format18bitRGB666,
+ OMX_COLOR_Format18bitARGB1665,
+ OMX_COLOR_Format19bitARGB1666,
+ OMX_COLOR_Format24bitRGB888,
+ OMX_COLOR_Format24bitBGR888,
+ OMX_COLOR_Format24bitARGB1887,
+ OMX_COLOR_Format25bitARGB1888,
+ OMX_COLOR_Format32bitBGRA8888,
+ OMX_COLOR_Format32bitARGB8888,
+ OMX_COLOR_FormatYUV411Planar,
+ OMX_COLOR_FormatYUV411PackedPlanar,
+ OMX_COLOR_FormatYUV420Planar,
+ OMX_COLOR_FormatYUV420PackedPlanar,
+ OMX_COLOR_FormatYUV420SemiPlanar,
+ OMX_COLOR_FormatYUV422Planar,
+ OMX_COLOR_FormatYUV422PackedPlanar,
+ OMX_COLOR_FormatYUV422SemiPlanar,
+ OMX_COLOR_FormatYCbYCr,
+ OMX_COLOR_FormatYCrYCb,
+ OMX_COLOR_FormatCbYCrY,
+ OMX_COLOR_FormatCrYCbY,
+ OMX_COLOR_FormatYUV444Interleaved,
+ OMX_COLOR_FormatRawBayer8bit,
+ OMX_COLOR_FormatRawBayer10bit,
+ OMX_COLOR_FormatRawBayer8bitcompressed,
+ OMX_COLOR_FormatL2,
+ OMX_COLOR_FormatL4,
+ OMX_COLOR_FormatL8,
+ OMX_COLOR_FormatL16,
+ OMX_COLOR_FormatL24,
+ OMX_COLOR_FormatL32,
+ OMX_COLOR_FormatYUV420PackedSemiPlanar,
+ OMX_COLOR_FormatYUV422PackedSemiPlanar,
+ OMX_COLOR_Format18BitBGR666,
+ OMX_COLOR_Format24BitARGB6666,
+ OMX_COLOR_Format24BitABGR6666,
+ OMX_COLOR_FormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_COLOR_FormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_COLOR_FormatMax = 0x7FFFFFFF
+} OMX_COLOR_FORMATTYPE;
+
+
+/**
+ * Defines the matrix for conversion from RGB to YUV or vice versa.
+ * iColorMatrix should be initialized with the fixed point values
+ * used in converting between formats.
+ */
+typedef struct OMX_CONFIG_COLORCONVERSIONTYPE {
+ OMX_U32 nSize; /**< Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version info */
+ OMX_U32 nPortIndex; /**< Port that this struct applies to */
+ OMX_S32 xColorMatrix[3][3]; /**< Stored in signed Q16 format */
+ OMX_S32 xColorOffset[4]; /**< Stored in signed Q16 format */
+}OMX_CONFIG_COLORCONVERSIONTYPE;
+
+
+/**
+ * Structure defining percent to scale each frame dimension. For example:
+ * To make the width 50% larger, use fWidth = 1.5 and to make the width
+ * 1/2 the original size, use fWidth = 0.5
+ */
+typedef struct OMX_CONFIG_SCALEFACTORTYPE {
+ OMX_U32 nSize; /**< Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version info */
+ OMX_U32 nPortIndex; /**< Port that this struct applies to */
+ OMX_S32 xWidth; /**< Fixed point value stored as Q16 */
+ OMX_S32 xHeight; /**< Fixed point value stored as Q16 */
+}OMX_CONFIG_SCALEFACTORTYPE;
+
+
+/**
+ * Enumeration of possible image filter types
+ */
+typedef enum OMX_IMAGEFILTERTYPE {
+ OMX_ImageFilterNone,
+ OMX_ImageFilterNoise,
+ OMX_ImageFilterEmboss,
+ OMX_ImageFilterNegative,
+ OMX_ImageFilterSketch,
+ OMX_ImageFilterOilPaint,
+ OMX_ImageFilterHatch,
+ OMX_ImageFilterGpen,
+ OMX_ImageFilterAntialias,
+ OMX_ImageFilterDeRing,
+ OMX_ImageFilterSolarize,
+ OMX_ImageFilterKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_ImageFilterVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_ImageFilterMax = 0x7FFFFFFF
+} OMX_IMAGEFILTERTYPE;
+
+
+/**
+ * Image filter configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eImageFilter : Image filter type enumeration
+ */
+typedef struct OMX_CONFIG_IMAGEFILTERTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_IMAGEFILTERTYPE eImageFilter;
+} OMX_CONFIG_IMAGEFILTERTYPE;
+
+
+/**
+ * Customized U and V for color enhancement
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * bColorEnhancement : Enable/disable color enhancement
+ * nCustomizedU : Practical values: 16-240, range: 0-255, value set for
+ * U component
+ * nCustomizedV : Practical values: 16-240, range: 0-255, value set for
+ * V component
+ */
+typedef struct OMX_CONFIG_COLORENHANCEMENTTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bColorEnhancement;
+ OMX_U8 nCustomizedU;
+ OMX_U8 nCustomizedV;
+} OMX_CONFIG_COLORENHANCEMENTTYPE;
+
+
+/**
+ * Define color key and color key mask
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nARGBColor : 32bit Alpha, Red, Green, Blue Color
+ * nARGBMask : 32bit Mask for Alpha, Red, Green, Blue channels
+ */
+typedef struct OMX_CONFIG_COLORKEYTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nARGBColor;
+ OMX_U32 nARGBMask;
+} OMX_CONFIG_COLORKEYTYPE;
+
+
+/**
+ * List of color blend types for pre/post processing
+ *
+ * ENUMS:
+ * None : No color blending present
+ * AlphaConstant : Function is (alpha_constant * src) +
+ * (1 - alpha_constant) * dst)
+ * AlphaPerPixel : Function is (alpha * src) + (1 - alpha) * dst)
+ * Alternate : Function is alternating pixels from src and dst
+ * And : Function is (src & dst)
+ * Or : Function is (src | dst)
+ * Invert : Function is ~src
+ */
+typedef enum OMX_COLORBLENDTYPE {
+ OMX_ColorBlendNone,
+ OMX_ColorBlendAlphaConstant,
+ OMX_ColorBlendAlphaPerPixel,
+ OMX_ColorBlendAlternate,
+ OMX_ColorBlendAnd,
+ OMX_ColorBlendOr,
+ OMX_ColorBlendInvert,
+ OMX_ColorBlendKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_ColorBlendVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_ColorBlendMax = 0x7FFFFFFF
+} OMX_COLORBLENDTYPE;
+
+
+/**
+ * Color blend configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nRGBAlphaConstant : Constant global alpha values when global alpha is used
+ * eColorBlend : Color blend type enumeration
+ */
+typedef struct OMX_CONFIG_COLORBLENDTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nRGBAlphaConstant;
+ OMX_COLORBLENDTYPE eColorBlend;
+} OMX_CONFIG_COLORBLENDTYPE;
+
+
+/**
+ * Hold frame dimension
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nWidth : Frame width in pixels
+ * nHeight : Frame height in pixels
+ */
+typedef struct OMX_FRAMESIZETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nWidth;
+ OMX_U32 nHeight;
+} OMX_FRAMESIZETYPE;
+
+
+/**
+ * Rotation configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nRotation : +/- integer rotation value
+ */
+typedef struct OMX_CONFIG_ROTATIONTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_S32 nRotation;
+} OMX_CONFIG_ROTATIONTYPE;
+
+
+/**
+ * Possible mirroring directions for pre/post processing
+ *
+ * ENUMS:
+ * None : No mirroring
+ * Vertical : Vertical mirroring, flip on X axis
+ * Horizontal : Horizontal mirroring, flip on Y axis
+ * Both : Both vertical and horizontal mirroring
+ */
+typedef enum OMX_MIRRORTYPE {
+ OMX_MirrorNone = 0,
+ OMX_MirrorVertical,
+ OMX_MirrorHorizontal,
+ OMX_MirrorBoth,
+ OMX_MirrorKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_MirrorVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_MirrorMax = 0x7FFFFFFF
+} OMX_MIRRORTYPE;
+
+
+/**
+ * Mirroring configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eMirror : Mirror type enumeration
+ */
+typedef struct OMX_CONFIG_MIRRORTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_MIRRORTYPE eMirror;
+} OMX_CONFIG_MIRRORTYPE;
+
+
+/**
+ * Position information only
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nX : X coordinate for the point
+ * nY : Y coordinate for the point
+ */
+typedef struct OMX_CONFIG_POINTTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_S32 nX;
+ OMX_S32 nY;
+} OMX_CONFIG_POINTTYPE;
+
+
+/**
+ * Frame size plus position
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nLeft : X Coordinate of the top left corner of the rectangle
+ * nTop : Y Coordinate of the top left corner of the rectangle
+ * nWidth : Width of the rectangle
+ * nHeight : Height of the rectangle
+ */
+typedef struct OMX_CONFIG_RECTTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_S32 nLeft;
+ OMX_S32 nTop;
+ OMX_U32 nWidth;
+ OMX_U32 nHeight;
+} OMX_CONFIG_RECTTYPE;
+
+
+/**
+ * Deblocking state; it is required to be set up before starting the codec
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * bDeblocking : Enable/disable deblocking mode
+ */
+typedef struct OMX_PARAM_DEBLOCKINGTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bDeblocking;
+} OMX_PARAM_DEBLOCKINGTYPE;
+
+
+/**
+ * Stabilization state
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * bStab : Enable/disable frame stabilization state
+ */
+typedef struct OMX_CONFIG_FRAMESTABTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bStab;
+} OMX_CONFIG_FRAMESTABTYPE;
+
+
+/**
+ * White Balance control type
+ *
+ * STRUCT MEMBERS:
+ * SunLight : Referenced in JSR-234
+ * Flash : Optimal for device's integrated flash
+ */
+typedef enum OMX_WHITEBALCONTROLTYPE {
+ OMX_WhiteBalControlOff = 0,
+ OMX_WhiteBalControlAuto,
+ OMX_WhiteBalControlSunLight,
+ OMX_WhiteBalControlCloudy,
+ OMX_WhiteBalControlShade,
+ OMX_WhiteBalControlTungsten,
+ OMX_WhiteBalControlFluorescent,
+ OMX_WhiteBalControlIncandescent,
+ OMX_WhiteBalControlFlash,
+ OMX_WhiteBalControlHorizon,
+ OMX_WhiteBalControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_WhiteBalControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_WhiteBalControlMax = 0x7FFFFFFF
+} OMX_WHITEBALCONTROLTYPE;
+
+
+/**
+ * White Balance control configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eWhiteBalControl : White balance enumeration
+ */
+typedef struct OMX_CONFIG_WHITEBALCONTROLTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_WHITEBALCONTROLTYPE eWhiteBalControl;
+} OMX_CONFIG_WHITEBALCONTROLTYPE;
+
+
+/**
+ * Exposure control type
+ */
+typedef enum OMX_EXPOSURECONTROLTYPE {
+ OMX_ExposureControlOff = 0,
+ OMX_ExposureControlAuto,
+ OMX_ExposureControlNight,
+ OMX_ExposureControlBackLight,
+ OMX_ExposureControlSpotLight,
+ OMX_ExposureControlSports,
+ OMX_ExposureControlSnow,
+ OMX_ExposureControlBeach,
+ OMX_ExposureControlLargeAperture,
+ OMX_ExposureControlSmallApperture,
+ OMX_ExposureControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_ExposureControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_ExposureControlMax = 0x7FFFFFFF
+} OMX_EXPOSURECONTROLTYPE;
+
+
+/**
+ * White Balance control configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eExposureControl : Exposure control enumeration
+ */
+typedef struct OMX_CONFIG_EXPOSURECONTROLTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_EXPOSURECONTROLTYPE eExposureControl;
+} OMX_CONFIG_EXPOSURECONTROLTYPE;
+
+
+/**
+ * Defines sensor supported mode.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nFrameRate : Single shot mode is indicated by a 0
+ * bOneShot : Enable for single shot, disable for streaming
+ * sFrameSize : Framesize
+ */
+typedef struct OMX_PARAM_SENSORMODETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nFrameRate;
+ OMX_BOOL bOneShot;
+ OMX_FRAMESIZETYPE sFrameSize;
+} OMX_PARAM_SENSORMODETYPE;
+
+
+/**
+ * Defines contrast level
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nContrast : Values allowed for contrast -100 to 100, zero means no change
+ */
+typedef struct OMX_CONFIG_CONTRASTTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_S32 nContrast;
+} OMX_CONFIG_CONTRASTTYPE;
+
+
+/**
+ * Defines brightness level
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nBrightness : 0-100%
+ */
+typedef struct OMX_CONFIG_BRIGHTNESSTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nBrightness;
+} OMX_CONFIG_BRIGHTNESSTYPE;
+
+
+/**
+ * Defines backlight level configuration for a video sink, e.g. LCD panel
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nBacklight : Values allowed for backlight 0-100%
+ * nTimeout : Number of milliseconds before backlight automatically turns
+ * off. A value of 0x0 disables backight timeout
+ */
+typedef struct OMX_CONFIG_BACKLIGHTTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nBacklight;
+ OMX_U32 nTimeout;
+} OMX_CONFIG_BACKLIGHTTYPE;
+
+
+/**
+ * Defines setting for Gamma
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nGamma : Values allowed for gamma -100 to 100, zero means no change
+ */
+typedef struct OMX_CONFIG_GAMMATYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_S32 nGamma;
+} OMX_CONFIG_GAMMATYPE;
+
+
+/**
+ * Define for setting saturation
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nSaturation : Values allowed for saturation -100 to 100, zero means
+ * no change
+ */
+typedef struct OMX_CONFIG_SATURATIONTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_S32 nSaturation;
+} OMX_CONFIG_SATURATIONTYPE;
+
+
+/**
+ * Define for setting Lightness
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nLightness : Values allowed for lightness -100 to 100, zero means no
+ * change
+ */
+typedef struct OMX_CONFIG_LIGHTNESSTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_S32 nLightness;
+} OMX_CONFIG_LIGHTNESSTYPE;
+
+
+/**
+ * Plane blend configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Index of input port associated with the plane.
+ * nDepth : Depth of the plane in relation to the screen. Higher
+ * numbered depths are "behind" lower number depths.
+ * This number defaults to the Port Index number.
+ * nAlpha : Transparency blending component for the entire plane.
+ * See blending modes for more detail.
+ */
+typedef struct OMX_CONFIG_PLANEBLENDTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nDepth;
+ OMX_U32 nAlpha;
+} OMX_CONFIG_PLANEBLENDTYPE;
+
+
+/**
+ * Define interlace type
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * bEnable : Enable control variable for this functionality
+ * (see below)
+ * nInterleavePortIndex : Index of input or output port associated with
+ * the interleaved plane.
+ * pPlanarPortIndexes[4] : Index of input or output planar ports.
+ */
+typedef struct OMX_PARAM_INTERLEAVETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bEnable;
+ OMX_U32 nInterleavePortIndex;
+} OMX_PARAM_INTERLEAVETYPE;
+
+
+/**
+ * Defines the picture effect used for an input picture
+ */
+typedef enum OMX_TRANSITIONEFFECTTYPE {
+ OMX_EffectNone,
+ OMX_EffectFadeFromBlack,
+ OMX_EffectFadeToBlack,
+ OMX_EffectUnspecifiedThroughConstantColor,
+ OMX_EffectDissolve,
+ OMX_EffectWipe,
+ OMX_EffectUnspecifiedMixOfTwoScenes,
+ OMX_EffectKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_EffectVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_EffectMax = 0x7FFFFFFF
+} OMX_TRANSITIONEFFECTTYPE;
+
+
+/**
+ * Structure used to configure current transition effect
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eEffect : Effect to enable
+ */
+typedef struct OMX_CONFIG_TRANSITIONEFFECTTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_TRANSITIONEFFECTTYPE eEffect;
+} OMX_CONFIG_TRANSITIONEFFECTTYPE;
+
+
+/**
+ * Defines possible data unit types for encoded video data. The data unit
+ * types are used both for encoded video input for playback as well as
+ * encoded video output from recording.
+ */
+typedef enum OMX_DATAUNITTYPE {
+ OMX_DataUnitCodedPicture,
+ OMX_DataUnitVideoSegment,
+ OMX_DataUnitSeveralSegments,
+ OMX_DataUnitArbitraryStreamSection,
+ OMX_DataUnitKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_DataUnitVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_DataUnitMax = 0x7FFFFFFF
+} OMX_DATAUNITTYPE;
+
+
+/**
+ * Defines possible encapsulation types for coded video data unit. The
+ * encapsulation information is used both for encoded video input for
+ * playback as well as encoded video output from recording.
+ */
+typedef enum OMX_DATAUNITENCAPSULATIONTYPE {
+ OMX_DataEncapsulationElementaryStream,
+ OMX_DataEncapsulationGenericPayload,
+ OMX_DataEncapsulationRtpPayload,
+ OMX_DataEncapsulationKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_DataEncapsulationVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_DataEncapsulationMax = 0x7FFFFFFF
+} OMX_DATAUNITENCAPSULATIONTYPE;
+
+
+/**
+ * Structure used to configure the type of being decoded/encoded
+ */
+typedef struct OMX_PARAM_DATAUNITTYPE {
+ OMX_U32 nSize; /**< Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port that this structure applies to */
+ OMX_DATAUNITTYPE eUnitType;
+ OMX_DATAUNITENCAPSULATIONTYPE eEncapsulationType;
+} OMX_PARAM_DATAUNITTYPE;
+
+
+/**
+ * Defines dither types
+ */
+typedef enum OMX_DITHERTYPE {
+ OMX_DitherNone,
+ OMX_DitherOrdered,
+ OMX_DitherErrorDiffusion,
+ OMX_DitherOther,
+ OMX_DitherKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_DitherVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_DitherMax = 0x7FFFFFFF
+} OMX_DITHERTYPE;
+
+
+/**
+ * Structure used to configure current type of dithering
+ */
+typedef struct OMX_CONFIG_DITHERTYPE {
+ OMX_U32 nSize; /**< Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port that this structure applies to */
+ OMX_DITHERTYPE eDither; /**< Type of dithering to use */
+} OMX_CONFIG_DITHERTYPE;
+
+typedef struct OMX_CONFIG_CAPTUREMODETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex; /**< Port that this structure applies to */
+ OMX_BOOL bContinuous; /**< If true then ignore frame rate and emit capture
+ * data as fast as possible (otherwise obey port's frame rate). */
+ OMX_BOOL bFrameLimited; /**< If true then terminate capture after the port emits the
+ * specified number of frames (otherwise the port does not
+ * terminate the capture until instructed to do so by the client).
+ * Even if set, the client may manually terminate the capture prior
+ * to reaching the limit. */
+ OMX_U32 nFrameLimit; /**< Limit on number of frames emitted during a capture (only
+ * valid if bFrameLimited is set). */
+} OMX_CONFIG_CAPTUREMODETYPE;
+
+typedef enum OMX_METERINGTYPE {
+
+ OMX_MeteringModeAverage, /**< Center-weighted average metering. */
+ OMX_MeteringModeSpot, /**< Spot (partial) metering. */
+ OMX_MeteringModeMatrix, /**< Matrix or evaluative metering. */
+
+ OMX_MeteringKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_MeteringVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_EVModeMax = 0x7fffffff
+} OMX_METERINGTYPE;
+
+typedef struct OMX_CONFIG_EXPOSUREVALUETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_METERINGTYPE eMetering;
+ OMX_S32 xEVCompensation; /**< Fixed point value stored as Q16 */
+ OMX_U32 nApertureFNumber; /**< e.g. nApertureFNumber = 2 implies "f/2" - Q16 format */
+ OMX_BOOL bAutoAperture; /**< Whether aperture number is defined automatically */
+ OMX_U32 nShutterSpeedMsec; /**< Shutterspeed in milliseconds */
+ OMX_BOOL bAutoShutterSpeed; /**< Whether shutter speed is defined automatically */
+ OMX_U32 nSensitivity; /**< e.g. nSensitivity = 100 implies "ISO 100" */
+ OMX_BOOL bAutoSensitivity; /**< Whether sensitivity is defined automatically */
+} OMX_CONFIG_EXPOSUREVALUETYPE;
+
+/**
+ * Focus region configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * bCenter : Use center region as focus region of interest
+ * bLeft : Use left region as focus region of interest
+ * bRight : Use right region as focus region of interest
+ * bTop : Use top region as focus region of interest
+ * bBottom : Use bottom region as focus region of interest
+ * bTopLeft : Use top left region as focus region of interest
+ * bTopRight : Use top right region as focus region of interest
+ * bBottomLeft : Use bottom left region as focus region of interest
+ * bBottomRight : Use bottom right region as focus region of interest
+ */
+typedef struct OMX_CONFIG_FOCUSREGIONTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bCenter;
+ OMX_BOOL bLeft;
+ OMX_BOOL bRight;
+ OMX_BOOL bTop;
+ OMX_BOOL bBottom;
+ OMX_BOOL bTopLeft;
+ OMX_BOOL bTopRight;
+ OMX_BOOL bBottomLeft;
+ OMX_BOOL bBottomRight;
+} OMX_CONFIG_FOCUSREGIONTYPE;
+
+/**
+ * Focus Status type
+ */
+typedef enum OMX_FOCUSSTATUSTYPE {
+ OMX_FocusStatusOff = 0,
+ OMX_FocusStatusRequest,
+ OMX_FocusStatusReached,
+ OMX_FocusStatusUnableToReach,
+ OMX_FocusStatusLost,
+ OMX_FocusStatusKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_FocusStatusVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_FocusStatusMax = 0x7FFFFFFF
+} OMX_FOCUSSTATUSTYPE;
+
+/**
+ * Focus status configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFocusStatus : Specifies the focus status
+ * bCenterStatus : Use center region as focus region of interest
+ * bLeftStatus : Use left region as focus region of interest
+ * bRightStatus : Use right region as focus region of interest
+ * bTopStatus : Use top region as focus region of interest
+ * bBottomStatus : Use bottom region as focus region of interest
+ * bTopLeftStatus : Use top left region as focus region of interest
+ * bTopRightStatus : Use top right region as focus region of interest
+ * bBottomLeftStatus : Use bottom left region as focus region of interest
+ * bBottomRightStatus : Use bottom right region as focus region of interest
+ */
+typedef struct OMX_PARAM_FOCUSSTATUSTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_FOCUSSTATUSTYPE eFocusStatus;
+ OMX_BOOL bCenterStatus;
+ OMX_BOOL bLeftStatus;
+ OMX_BOOL bRightStatus;
+ OMX_BOOL bTopStatus;
+ OMX_BOOL bBottomStatus;
+ OMX_BOOL bTopLeftStatus;
+ OMX_BOOL bTopRightStatus;
+ OMX_BOOL bBottomLeftStatus;
+ OMX_BOOL bBottomRightStatus;
+} OMX_PARAM_FOCUSSTATUSTYPE;
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/mm-core/inc/OMX_Image.h b/mm-core/inc/OMX_Image.h
new file mode 100755
index 00000000..a6d4666c
--- /dev/null
+++ b/mm-core/inc/OMX_Image.h
@@ -0,0 +1,328 @@
+/**
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * @file OMX_Image.h - OpenMax IL version 1.1.2
+ * The structures needed by Image components to exchange parameters and
+ * configuration data with the components.
+ */
+#ifndef OMX_Image_h
+#define OMX_Image_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/**
+ * Each OMX header must include all required header files to allow the
+ * header to compile without errors. The includes below are required
+ * for this header file to compile successfully
+ */
+
+#include <OMX_IVCommon.h>
+
+/** @defgroup imaging OpenMAX IL Imaging Domain
+ * @ingroup iv
+ * Structures for OpenMAX IL Imaging domain
+ * @{
+ */
+
+/**
+ * Enumeration used to define the possible image compression coding.
+ */
+typedef enum OMX_IMAGE_CODINGTYPE {
+ OMX_IMAGE_CodingUnused, /**< Value when format is N/A */
+ OMX_IMAGE_CodingAutoDetect, /**< Auto detection of image format */
+ OMX_IMAGE_CodingJPEG, /**< JPEG/JFIF image format */
+ OMX_IMAGE_CodingJPEG2K, /**< JPEG 2000 image format */
+ OMX_IMAGE_CodingEXIF, /**< EXIF image format */
+ OMX_IMAGE_CodingTIFF, /**< TIFF image format */
+ OMX_IMAGE_CodingGIF, /**< Graphics image format */
+ OMX_IMAGE_CodingPNG, /**< PNG image format */
+ OMX_IMAGE_CodingLZW, /**< LZW image format */
+ OMX_IMAGE_CodingBMP, /**< Windows Bitmap format */
+ OMX_IMAGE_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_IMAGE_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_IMAGE_CodingMax = 0x7FFFFFFF
+} OMX_IMAGE_CODINGTYPE;
+
+
+/**
+ * Data structure used to define an image path. The number of image paths
+ * for input and output will vary by type of the image component.
+ *
+ * Input (aka Source) : Zero Inputs, one Output,
+ * Splitter : One Input, 2 or more Outputs,
+ * Processing Element : One Input, one output,
+ * Mixer : 2 or more inputs, one output,
+ * Output (aka Sink) : One Input, zero outputs.
+ *
+ * The PortDefinition structure is used to define all of the parameters
+ * necessary for the compliant component to setup an input or an output
+ * image path. If additional vendor specific data is required, it should
+ * be transmitted to the component using the CustomCommand function.
+ * Compliant components will prepopulate this structure with optimal
+ * values during the OMX_GetParameter() command.
+ *
+ * STRUCT MEMBERS:
+ * cMIMEType : MIME type of data for the port
+ * pNativeRender : Platform specific reference for a display if a
+ * sync, otherwise this field is 0
+ * nFrameWidth : Width of frame to be used on port if
+ * uncompressed format is used. Use 0 for
+ * unknown, don't care or variable
+ * nFrameHeight : Height of frame to be used on port if
+ * uncompressed format is used. Use 0 for
+ * unknown, don't care or variable
+ * nStride : Number of bytes per span of an image (i.e.
+ * indicates the number of bytes to get from
+ * span N to span N+1, where negative stride
+ * indicates the image is bottom up
+ * nSliceHeight : Height used when encoding in slices
+ * bFlagErrorConcealment : Turns on error concealment if it is supported by
+ * the OMX component
+ * eCompressionFormat : Compression format used in this instance of
+ * the component. When OMX_IMAGE_CodingUnused is
+ * specified, eColorFormat is valid
+ * eColorFormat : Decompressed format used by this component
+ * pNativeWindow : Platform specific reference for a window object if a
+ * display sink , otherwise this field is 0x0.
+ */
+typedef struct OMX_IMAGE_PORTDEFINITIONTYPE {
+ OMX_STRING cMIMEType;
+ OMX_NATIVE_DEVICETYPE pNativeRender;
+ OMX_U32 nFrameWidth;
+ OMX_U32 nFrameHeight;
+ OMX_S32 nStride;
+ OMX_U32 nSliceHeight;
+ OMX_BOOL bFlagErrorConcealment;
+ OMX_IMAGE_CODINGTYPE eCompressionFormat;
+ OMX_COLOR_FORMATTYPE eColorFormat;
+ OMX_NATIVE_WINDOWTYPE pNativeWindow;
+} OMX_IMAGE_PORTDEFINITIONTYPE;
+
+
+/**
+ * Port format parameter. This structure is used to enumerate the various
+ * data input/output format supported by the port.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Indicates which port to set
+ * nIndex : Indicates the enumeration index for the format from
+ * 0x0 to N-1
+ * eCompressionFormat : Compression format used in this instance of the
+ * component. When OMX_IMAGE_CodingUnused is specified,
+ * eColorFormat is valid
+ * eColorFormat : Decompressed format used by this component
+ */
+typedef struct OMX_IMAGE_PARAM_PORTFORMATTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nIndex;
+ OMX_IMAGE_CODINGTYPE eCompressionFormat;
+ OMX_COLOR_FORMATTYPE eColorFormat;
+} OMX_IMAGE_PARAM_PORTFORMATTYPE;
+
+
+/**
+ * Flash control type
+ *
+ * ENUMS
+ * Torch : Flash forced constantly on
+ */
+typedef enum OMX_IMAGE_FLASHCONTROLTYPE {
+ OMX_IMAGE_FlashControlOn = 0,
+ OMX_IMAGE_FlashControlOff,
+ OMX_IMAGE_FlashControlAuto,
+ OMX_IMAGE_FlashControlRedEyeReduction,
+ OMX_IMAGE_FlashControlFillin,
+ OMX_IMAGE_FlashControlTorch,
+ OMX_IMAGE_FlashControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_IMAGE_FlashControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_IMAGE_FlashControlMax = 0x7FFFFFFF
+} OMX_IMAGE_FLASHCONTROLTYPE;
+
+
+/**
+ * Flash control configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFlashControl : Flash control type
+ */
+typedef struct OMX_IMAGE_PARAM_FLASHCONTROLTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_IMAGE_FLASHCONTROLTYPE eFlashControl;
+} OMX_IMAGE_PARAM_FLASHCONTROLTYPE;
+
+
+/**
+ * Focus control type
+ */
+typedef enum OMX_IMAGE_FOCUSCONTROLTYPE {
+ OMX_IMAGE_FocusControlOn = 0,
+ OMX_IMAGE_FocusControlOff,
+ OMX_IMAGE_FocusControlAuto,
+ OMX_IMAGE_FocusControlAutoLock,
+ OMX_IMAGE_FocusControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_IMAGE_FocusControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_IMAGE_FocusControlMax = 0x7FFFFFFF
+} OMX_IMAGE_FOCUSCONTROLTYPE;
+
+
+/**
+ * Focus control configuration
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFocusControl : Focus control
+ * nFocusSteps : Focus can take on values from 0 mm to infinity.
+ * Interest is only in number of steps over this range.
+ * nFocusStepIndex : Current focus step index
+ */
+typedef struct OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_IMAGE_FOCUSCONTROLTYPE eFocusControl;
+ OMX_U32 nFocusSteps;
+ OMX_U32 nFocusStepIndex;
+} OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE;
+
+
+/**
+ * Q Factor for JPEG compression, which controls the tradeoff between image
+ * quality and size. Q Factor provides a more simple means of controlling
+ * JPEG compression quality, without directly programming Quantization
+ * tables for chroma and luma
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nQFactor : JPEG Q factor value in the range of 1-100. A factor of 1
+ * produces the smallest, worst quality images, and a factor
+ * of 100 produces the largest, best quality images. A
+ * typical default is 75 for small good quality images
+ */
+typedef struct OMX_IMAGE_PARAM_QFACTORTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nQFactor;
+} OMX_IMAGE_PARAM_QFACTORTYPE;
+
+/**
+ * Quantization table type
+ */
+
+typedef enum OMX_IMAGE_QUANTIZATIONTABLETYPE {
+ OMX_IMAGE_QuantizationTableLuma = 0,
+ OMX_IMAGE_QuantizationTableChroma,
+ OMX_IMAGE_QuantizationTableChromaCb,
+ OMX_IMAGE_QuantizationTableChromaCr,
+ OMX_IMAGE_QuantizationTableKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_IMAGE_QuantizationTableVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_IMAGE_QuantizationTableMax = 0x7FFFFFFF
+} OMX_IMAGE_QUANTIZATIONTABLETYPE;
+
+/**
+ * JPEG quantization tables are used to determine DCT compression for
+ * YUV data, as an alternative to specifying Q factor, providing exact
+ * control of compression
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eQuantizationTable : Quantization table type
+ * nQuantizationMatrix[64] : JPEG quantization table of coefficients stored
+ * in increasing columns then by rows of data (i.e.
+ * row 1, ... row 8). Quantization values are in
+ * the range 0-255 and stored in linear order
+ * (i.e. the component will zig-zag the
+ * quantization table data if required internally)
+ */
+typedef struct OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_IMAGE_QUANTIZATIONTABLETYPE eQuantizationTable;
+ OMX_U8 nQuantizationMatrix[64];
+} OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE;
+
+
+/**
+ * Huffman table type, the same Huffman table is applied for chroma and
+ * luma component
+ */
+typedef enum OMX_IMAGE_HUFFMANTABLETYPE {
+ OMX_IMAGE_HuffmanTableAC = 0,
+ OMX_IMAGE_HuffmanTableDC,
+ OMX_IMAGE_HuffmanTableACLuma,
+ OMX_IMAGE_HuffmanTableACChroma,
+ OMX_IMAGE_HuffmanTableDCLuma,
+ OMX_IMAGE_HuffmanTableDCChroma,
+ OMX_IMAGE_HuffmanTableKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_IMAGE_HuffmanTableVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_IMAGE_HuffmanTableMax = 0x7FFFFFFF
+} OMX_IMAGE_HUFFMANTABLETYPE;
+
+/**
+ * JPEG Huffman table
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eHuffmanTable : Huffman table type
+ * nNumberOfHuffmanCodeOfLength[16] : 0-16, number of Huffman codes of each
+ * possible length
+ * nHuffmanTable[256] : 0-255, the size used for AC and DC
+ * HuffmanTable are 16 and 162
+ */
+typedef struct OMX_IMAGE_PARAM_HUFFMANTTABLETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_IMAGE_HUFFMANTABLETYPE eHuffmanTable;
+ OMX_U8 nNumberOfHuffmanCodeOfLength[16];
+ OMX_U8 nHuffmanTable[256];
+}OMX_IMAGE_PARAM_HUFFMANTTABLETYPE;
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/mm-core/inc/OMX_Index.h b/mm-core/inc/OMX_Index.h
new file mode 100755
index 00000000..44d4ea76
--- /dev/null
+++ b/mm-core/inc/OMX_Index.h
@@ -0,0 +1,258 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/** @file OMX_Index.h - OpenMax IL version 1.1.2
+ * The OMX_Index header file contains the definitions for both applications
+ * and components .
+ */
+
+
+#ifndef OMX_Index_h
+#define OMX_Index_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Each OMX header must include all required header files to allow the
+ * header to compile without errors. The includes below are required
+ * for this header file to compile successfully
+ */
+#include <OMX_Types.h>
+
+
+/** The OMX_INDEXTYPE enumeration is used to select a structure when either
+ * getting or setting parameters and/or configuration data. Each entry in
+ * this enumeration maps to an OMX specified structure. When the
+ * OMX_GetParameter, OMX_SetParameter, OMX_GetConfig or OMX_SetConfig methods
+ * are used, the second parameter will always be an entry from this enumeration
+ * and the third entry will be the structure shown in the comments for the entry.
+ * For example, if the application is initializing a cropping function, the
+ * OMX_SetConfig command would have OMX_IndexConfigCommonInputCrop as the second parameter
+ * and would send a pointer to an initialized OMX_RECTTYPE structure as the
+ * third parameter.
+ *
+ * The enumeration entries named with the OMX_Config prefix are sent using
+ * the OMX_SetConfig command and the enumeration entries named with the
+ * OMX_PARAM_ prefix are sent using the OMX_SetParameter command.
+ */
+typedef enum OMX_INDEXTYPE {
+
+ OMX_IndexComponentStartUnused = 0x01000000,
+ OMX_IndexParamPriorityMgmt, /**< reference: OMX_PRIORITYMGMTTYPE */
+ OMX_IndexParamAudioInit, /**< reference: OMX_PORT_PARAM_TYPE */
+ OMX_IndexParamImageInit, /**< reference: OMX_PORT_PARAM_TYPE */
+ OMX_IndexParamVideoInit, /**< reference: OMX_PORT_PARAM_TYPE */
+ OMX_IndexParamOtherInit, /**< reference: OMX_PORT_PARAM_TYPE */
+ OMX_IndexParamNumAvailableStreams, /**< reference: OMX_PARAM_U32TYPE */
+ OMX_IndexParamActiveStream, /**< reference: OMX_PARAM_U32TYPE */
+ OMX_IndexParamSuspensionPolicy, /**< reference: OMX_PARAM_SUSPENSIONPOLICYTYPE */
+ OMX_IndexParamComponentSuspended, /**< reference: OMX_PARAM_SUSPENSIONTYPE */
+ OMX_IndexConfigCapturing, /**< reference: OMX_CONFIG_BOOLEANTYPE */
+ OMX_IndexConfigCaptureMode, /**< reference: OMX_CONFIG_CAPTUREMODETYPE */
+ OMX_IndexAutoPauseAfterCapture, /**< reference: OMX_CONFIG_BOOLEANTYPE */
+ OMX_IndexParamContentURI, /**< reference: OMX_PARAM_CONTENTURITYPE */
+ OMX_IndexParamCustomContentPipe, /**< reference: OMX_PARAM_CONTENTPIPETYPE */
+ OMX_IndexParamDisableResourceConcealment, /**< reference: OMX_RESOURCECONCEALMENTTYPE */
+ OMX_IndexConfigMetadataItemCount, /**< reference: OMX_CONFIG_METADATAITEMCOUNTTYPE */
+ OMX_IndexConfigContainerNodeCount, /**< reference: OMX_CONFIG_CONTAINERNODECOUNTTYPE */
+ OMX_IndexConfigMetadataItem, /**< reference: OMX_CONFIG_METADATAITEMTYPE */
+ OMX_IndexConfigCounterNodeID, /**< reference: OMX_CONFIG_CONTAINERNODEIDTYPE */
+ OMX_IndexParamMetadataFilterType, /**< reference: OMX_PARAM_METADATAFILTERTYPE */
+ OMX_IndexParamMetadataKeyFilter, /**< reference: OMX_PARAM_METADATAFILTERTYPE */
+ OMX_IndexConfigPriorityMgmt, /**< reference: OMX_PRIORITYMGMTTYPE */
+ OMX_IndexParamStandardComponentRole, /**< reference: OMX_PARAM_COMPONENTROLETYPE */
+
+ OMX_IndexPortStartUnused = 0x02000000,
+ OMX_IndexParamPortDefinition, /**< reference: OMX_PARAM_PORTDEFINITIONTYPE */
+ OMX_IndexParamCompBufferSupplier, /**< reference: OMX_PARAM_BUFFERSUPPLIERTYPE */
+ OMX_IndexReservedStartUnused = 0x03000000,
+
+ /* Audio parameters and configurations */
+ OMX_IndexAudioStartUnused = 0x04000000,
+ OMX_IndexParamAudioPortFormat, /**< reference: OMX_AUDIO_PARAM_PORTFORMATTYPE */
+ OMX_IndexParamAudioPcm, /**< reference: OMX_AUDIO_PARAM_PCMMODETYPE */
+ OMX_IndexParamAudioAac, /**< reference: OMX_AUDIO_PARAM_AACPROFILETYPE */
+ OMX_IndexParamAudioRa, /**< reference: OMX_AUDIO_PARAM_RATYPE */
+ OMX_IndexParamAudioMp3, /**< reference: OMX_AUDIO_PARAM_MP3TYPE */
+ OMX_IndexParamAudioAdpcm, /**< reference: OMX_AUDIO_PARAM_ADPCMTYPE */
+ OMX_IndexParamAudioG723, /**< reference: OMX_AUDIO_PARAM_G723TYPE */
+ OMX_IndexParamAudioG729, /**< reference: OMX_AUDIO_PARAM_G729TYPE */
+ OMX_IndexParamAudioAmr, /**< reference: OMX_AUDIO_PARAM_AMRTYPE */
+ OMX_IndexParamAudioWma, /**< reference: OMX_AUDIO_PARAM_WMATYPE */
+ OMX_IndexParamAudioSbc, /**< reference: OMX_AUDIO_PARAM_SBCTYPE */
+ OMX_IndexParamAudioMidi, /**< reference: OMX_AUDIO_PARAM_MIDITYPE */
+ OMX_IndexParamAudioGsm_FR, /**< reference: OMX_AUDIO_PARAM_GSMFRTYPE */
+ OMX_IndexParamAudioMidiLoadUserSound, /**< reference: OMX_AUDIO_PARAM_MIDILOADUSERSOUNDTYPE */
+ OMX_IndexParamAudioG726, /**< reference: OMX_AUDIO_PARAM_G726TYPE */
+ OMX_IndexParamAudioGsm_EFR, /**< reference: OMX_AUDIO_PARAM_GSMEFRTYPE */
+ OMX_IndexParamAudioGsm_HR, /**< reference: OMX_AUDIO_PARAM_GSMHRTYPE */
+ OMX_IndexParamAudioPdc_FR, /**< reference: OMX_AUDIO_PARAM_PDCFRTYPE */
+ OMX_IndexParamAudioPdc_EFR, /**< reference: OMX_AUDIO_PARAM_PDCEFRTYPE */
+ OMX_IndexParamAudioPdc_HR, /**< reference: OMX_AUDIO_PARAM_PDCHRTYPE */
+ OMX_IndexParamAudioTdma_FR, /**< reference: OMX_AUDIO_PARAM_TDMAFRTYPE */
+ OMX_IndexParamAudioTdma_EFR, /**< reference: OMX_AUDIO_PARAM_TDMAEFRTYPE */
+ OMX_IndexParamAudioQcelp8, /**< reference: OMX_AUDIO_PARAM_QCELP8TYPE */
+ OMX_IndexParamAudioQcelp13, /**< reference: OMX_AUDIO_PARAM_QCELP13TYPE */
+ OMX_IndexParamAudioEvrc, /**< reference: OMX_AUDIO_PARAM_EVRCTYPE */
+ OMX_IndexParamAudioSmv, /**< reference: OMX_AUDIO_PARAM_SMVTYPE */
+ OMX_IndexParamAudioVorbis, /**< reference: OMX_AUDIO_PARAM_VORBISTYPE */
+
+ OMX_IndexConfigAudioMidiImmediateEvent, /**< reference: OMX_AUDIO_CONFIG_MIDIIMMEDIATEEVENTTYPE */
+ OMX_IndexConfigAudioMidiControl, /**< reference: OMX_AUDIO_CONFIG_MIDICONTROLTYPE */
+ OMX_IndexConfigAudioMidiSoundBankProgram, /**< reference: OMX_AUDIO_CONFIG_MIDISOUNDBANKPROGRAMTYPE */
+ OMX_IndexConfigAudioMidiStatus, /**< reference: OMX_AUDIO_CONFIG_MIDISTATUSTYPE */
+ OMX_IndexConfigAudioMidiMetaEvent, /**< reference: OMX_AUDIO_CONFIG_MIDIMETAEVENTTYPE */
+ OMX_IndexConfigAudioMidiMetaEventData, /**< reference: OMX_AUDIO_CONFIG_MIDIMETAEVENTDATATYPE */
+ OMX_IndexConfigAudioVolume, /**< reference: OMX_AUDIO_CONFIG_VOLUMETYPE */
+ OMX_IndexConfigAudioBalance, /**< reference: OMX_AUDIO_CONFIG_BALANCETYPE */
+ OMX_IndexConfigAudioChannelMute, /**< reference: OMX_AUDIO_CONFIG_CHANNELMUTETYPE */
+ OMX_IndexConfigAudioMute, /**< reference: OMX_AUDIO_CONFIG_MUTETYPE */
+ OMX_IndexConfigAudioLoudness, /**< reference: OMX_AUDIO_CONFIG_LOUDNESSTYPE */
+ OMX_IndexConfigAudioEchoCancelation, /**< reference: OMX_AUDIO_CONFIG_ECHOCANCELATIONTYPE */
+ OMX_IndexConfigAudioNoiseReduction, /**< reference: OMX_AUDIO_CONFIG_NOISEREDUCTIONTYPE */
+ OMX_IndexConfigAudioBass, /**< reference: OMX_AUDIO_CONFIG_BASSTYPE */
+ OMX_IndexConfigAudioTreble, /**< reference: OMX_AUDIO_CONFIG_TREBLETYPE */
+ OMX_IndexConfigAudioStereoWidening, /**< reference: OMX_AUDIO_CONFIG_STEREOWIDENINGTYPE */
+ OMX_IndexConfigAudioChorus, /**< reference: OMX_AUDIO_CONFIG_CHORUSTYPE */
+ OMX_IndexConfigAudioEqualizer, /**< reference: OMX_AUDIO_CONFIG_EQUALIZERTYPE */
+ OMX_IndexConfigAudioReverberation, /**< reference: OMX_AUDIO_CONFIG_REVERBERATIONTYPE */
+ OMX_IndexConfigAudioChannelVolume, /**< reference: OMX_AUDIO_CONFIG_CHANNELVOLUMETYPE */
+
+ /* Image specific parameters and configurations */
+ OMX_IndexImageStartUnused = 0x05000000,
+ OMX_IndexParamImagePortFormat, /**< reference: OMX_IMAGE_PARAM_PORTFORMATTYPE */
+ OMX_IndexParamFlashControl, /**< reference: OMX_IMAGE_PARAM_FLASHCONTROLTYPE */
+ OMX_IndexConfigFocusControl, /**< reference: OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE */
+ OMX_IndexParamQFactor, /**< reference: OMX_IMAGE_PARAM_QFACTORTYPE */
+ OMX_IndexParamQuantizationTable, /**< reference: OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE */
+ OMX_IndexParamHuffmanTable, /**< reference: OMX_IMAGE_PARAM_HUFFMANTTABLETYPE */
+ OMX_IndexConfigFlashControl, /**< reference: OMX_IMAGE_PARAM_FLASHCONTROLTYPE */
+
+ /* Video specific parameters and configurations */
+ OMX_IndexVideoStartUnused = 0x06000000,
+ OMX_IndexParamVideoPortFormat, /**< reference: OMX_VIDEO_PARAM_PORTFORMATTYPE */
+ OMX_IndexParamVideoQuantization, /**< reference: OMX_VIDEO_PARAM_QUANTIZATIONTYPE */
+ OMX_IndexParamVideoFastUpdate, /**< reference: OMX_VIDEO_PARAM_VIDEOFASTUPDATETYPE */
+ OMX_IndexParamVideoBitrate, /**< reference: OMX_VIDEO_PARAM_BITRATETYPE */
+ OMX_IndexParamVideoMotionVector, /**< reference: OMX_VIDEO_PARAM_MOTIONVECTORTYPE */
+ OMX_IndexParamVideoIntraRefresh, /**< reference: OMX_VIDEO_PARAM_INTRAREFRESHTYPE */
+ OMX_IndexParamVideoErrorCorrection, /**< reference: OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE */
+ OMX_IndexParamVideoVBSMC, /**< reference: OMX_VIDEO_PARAM_VBSMCTYPE */
+ OMX_IndexParamVideoMpeg2, /**< reference: OMX_VIDEO_PARAM_MPEG2TYPE */
+ OMX_IndexParamVideoMpeg4, /**< reference: OMX_VIDEO_PARAM_MPEG4TYPE */
+ OMX_IndexParamVideoWmv, /**< reference: OMX_VIDEO_PARAM_WMVTYPE */
+ OMX_IndexParamVideoRv, /**< reference: OMX_VIDEO_PARAM_RVTYPE */
+ OMX_IndexParamVideoAvc, /**< reference: OMX_VIDEO_PARAM_AVCTYPE */
+ OMX_IndexParamVideoH263, /**< reference: OMX_VIDEO_PARAM_H263TYPE */
+ OMX_IndexParamVideoProfileLevelQuerySupported, /**< reference: OMX_VIDEO_PARAM_PROFILELEVELTYPE */
+ OMX_IndexParamVideoProfileLevelCurrent, /**< reference: OMX_VIDEO_PARAM_PROFILELEVELTYPE */
+ OMX_IndexConfigVideoBitrate, /**< reference: OMX_VIDEO_CONFIG_BITRATETYPE */
+ OMX_IndexConfigVideoFramerate, /**< reference: OMX_CONFIG_FRAMERATETYPE */
+ OMX_IndexConfigVideoIntraVOPRefresh, /**< reference: OMX_CONFIG_INTRAREFRESHVOPTYPE */
+ OMX_IndexConfigVideoIntraMBRefresh, /**< reference: OMX_CONFIG_MACROBLOCKERRORMAPTYPE */
+ OMX_IndexConfigVideoMBErrorReporting, /**< reference: OMX_CONFIG_MBERRORREPORTINGTYPE */
+ OMX_IndexParamVideoMacroblocksPerFrame, /**< reference: OMX_PARAM_MACROBLOCKSTYPE */
+ OMX_IndexConfigVideoMacroBlockErrorMap, /**< reference: OMX_CONFIG_MACROBLOCKERRORMAPTYPE */
+ OMX_IndexParamVideoSliceFMO, /**< reference: OMX_VIDEO_PARAM_AVCSLICEFMO */
+ OMX_IndexConfigVideoAVCIntraPeriod, /**< reference: OMX_VIDEO_CONFIG_AVCINTRAPERIOD */
+ OMX_IndexConfigVideoNalSize, /**< reference: OMX_VIDEO_CONFIG_NALSIZE */
+
+ /* Image & Video common Configurations */
+ OMX_IndexCommonStartUnused = 0x07000000,
+ OMX_IndexParamCommonDeblocking, /**< reference: OMX_PARAM_DEBLOCKINGTYPE */
+ OMX_IndexParamCommonSensorMode, /**< reference: OMX_PARAM_SENSORMODETYPE */
+ OMX_IndexParamCommonInterleave, /**< reference: OMX_PARAM_INTERLEAVETYPE */
+ OMX_IndexConfigCommonColorFormatConversion, /**< reference: OMX_CONFIG_COLORCONVERSIONTYPE */
+ OMX_IndexConfigCommonScale, /**< reference: OMX_CONFIG_SCALEFACTORTYPE */
+ OMX_IndexConfigCommonImageFilter, /**< reference: OMX_CONFIG_IMAGEFILTERTYPE */
+ OMX_IndexConfigCommonColorEnhancement, /**< reference: OMX_CONFIG_COLORENHANCEMENTTYPE */
+ OMX_IndexConfigCommonColorKey, /**< reference: OMX_CONFIG_COLORKEYTYPE */
+ OMX_IndexConfigCommonColorBlend, /**< reference: OMX_CONFIG_COLORBLENDTYPE */
+ OMX_IndexConfigCommonFrameStabilisation,/**< reference: OMX_CONFIG_FRAMESTABTYPE */
+ OMX_IndexConfigCommonRotate, /**< reference: OMX_CONFIG_ROTATIONTYPE */
+ OMX_IndexConfigCommonMirror, /**< reference: OMX_CONFIG_MIRRORTYPE */
+ OMX_IndexConfigCommonOutputPosition, /**< reference: OMX_CONFIG_POINTTYPE */
+ OMX_IndexConfigCommonInputCrop, /**< reference: OMX_CONFIG_RECTTYPE */
+ OMX_IndexConfigCommonOutputCrop, /**< reference: OMX_CONFIG_RECTTYPE */
+ OMX_IndexConfigCommonDigitalZoom, /**< reference: OMX_CONFIG_SCALEFACTORTYPE */
+ OMX_IndexConfigCommonOpticalZoom, /**< reference: OMX_CONFIG_SCALEFACTORTYPE*/
+ OMX_IndexConfigCommonWhiteBalance, /**< reference: OMX_CONFIG_WHITEBALCONTROLTYPE */
+ OMX_IndexConfigCommonExposure, /**< reference: OMX_CONFIG_EXPOSURECONTROLTYPE */
+ OMX_IndexConfigCommonContrast, /**< reference: OMX_CONFIG_CONTRASTTYPE */
+ OMX_IndexConfigCommonBrightness, /**< reference: OMX_CONFIG_BRIGHTNESSTYPE */
+ OMX_IndexConfigCommonBacklight, /**< reference: OMX_CONFIG_BACKLIGHTTYPE */
+ OMX_IndexConfigCommonGamma, /**< reference: OMX_CONFIG_GAMMATYPE */
+ OMX_IndexConfigCommonSaturation, /**< reference: OMX_CONFIG_SATURATIONTYPE */
+ OMX_IndexConfigCommonLightness, /**< reference: OMX_CONFIG_LIGHTNESSTYPE */
+ OMX_IndexConfigCommonExclusionRect, /**< reference: OMX_CONFIG_RECTTYPE */
+ OMX_IndexConfigCommonDithering, /**< reference: OMX_CONFIG_DITHERTYPE */
+ OMX_IndexConfigCommonPlaneBlend, /**< reference: OMX_CONFIG_PLANEBLENDTYPE */
+ OMX_IndexConfigCommonExposureValue, /**< reference: OMX_CONFIG_EXPOSUREVALUETYPE */
+ OMX_IndexConfigCommonOutputSize, /**< reference: OMX_FRAMESIZETYPE */
+ OMX_IndexParamCommonExtraQuantData, /**< reference: OMX_OTHER_EXTRADATATYPE */
+ OMX_IndexConfigCommonFocusRegion, /**< reference: OMX_CONFIG_FOCUSREGIONTYPE */
+ OMX_IndexConfigCommonFocusStatus, /**< reference: OMX_PARAM_FOCUSSTATUSTYPE */
+ OMX_IndexConfigCommonTransitionEffect, /**< reference: OMX_CONFIG_TRANSITIONEFFECTTYPE */
+
+ /* Reserved Configuration range */
+ OMX_IndexOtherStartUnused = 0x08000000,
+ OMX_IndexParamOtherPortFormat, /**< reference: OMX_OTHER_PARAM_PORTFORMATTYPE */
+ OMX_IndexConfigOtherPower, /**< reference: OMX_OTHER_CONFIG_POWERTYPE */
+ OMX_IndexConfigOtherStats, /**< reference: OMX_OTHER_CONFIG_STATSTYPE */
+
+
+ /* Reserved Time range */
+ OMX_IndexTimeStartUnused = 0x09000000,
+ OMX_IndexConfigTimeScale, /**< reference: OMX_TIME_CONFIG_SCALETYPE */
+ OMX_IndexConfigTimeClockState, /**< reference: OMX_TIME_CONFIG_CLOCKSTATETYPE */
+ OMX_IndexConfigTimeActiveRefClock, /**< reference: OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE */
+ OMX_IndexConfigTimeCurrentMediaTime, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (read only) */
+ OMX_IndexConfigTimeCurrentWallTime, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (read only) */
+ OMX_IndexConfigTimeCurrentAudioReference, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (write only) */
+ OMX_IndexConfigTimeCurrentVideoReference, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (write only) */
+ OMX_IndexConfigTimeMediaTimeRequest, /**< reference: OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE (write only) */
+ OMX_IndexConfigTimeClientStartTime, /**<reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (write only) */
+ OMX_IndexConfigTimePosition, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE */
+ OMX_IndexConfigTimeSeekMode, /**< reference: OMX_TIME_CONFIG_SEEKMODETYPE */
+
+
+ OMX_IndexKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ /* Vendor specific area */
+ OMX_IndexVendorStartUnused = 0x7F000000,
+ /* Vendor specific structures should be in the range of 0x7F000000
+ to 0x7FFFFFFE. This range is not broken out by vendor, so
+ private indexes are not guaranteed unique and therefore should
+ only be sent to the appropriate component. */
+
+ OMX_IndexMax = 0x7FFFFFFF
+
+} OMX_INDEXTYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/mm-core/inc/OMX_IndexExt.h b/mm-core/inc/OMX_IndexExt.h
new file mode 100755
index 00000000..56235e59
--- /dev/null
+++ b/mm-core/inc/OMX_IndexExt.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2010 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/** @file OMX_IndexExt.h - OpenMax IL version 1.1.2
+ * The OMX_IndexExt header file contains extensions to the definitions
+ * for both applications and components .
+ */
+
+#ifndef OMX_IndexExt_h
+#define OMX_IndexExt_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Each OMX header shall include all required header files to allow the
+ * header to compile without errors. The includes below are required
+ * for this header file to compile successfully
+ */
+#include <OMX_Index.h>
+
+
+/** Khronos standard extension indices.
+
+This enum lists the current Khronos extension indices to OpenMAX IL.
+*/
+typedef enum OMX_INDEXEXTTYPE {
+
+ /* Component parameters and configurations */
+ OMX_IndexExtComponentStartUnused = OMX_IndexKhronosExtensions + 0x00100000,
+ OMX_IndexConfigCallbackRequest, /**< reference: OMX_CONFIG_CALLBACKREQUESTTYPE */
+
+ /* Port parameters and configurations */
+ OMX_IndexExtPortStartUnused = OMX_IndexKhronosExtensions + 0x00200000,
+
+ /* Audio parameters and configurations */
+ OMX_IndexExtAudioStartUnused = OMX_IndexKhronosExtensions + 0x00400000,
+
+ /* Image parameters and configurations */
+ OMX_IndexExtImageStartUnused = OMX_IndexKhronosExtensions + 0x00500000,
+
+ /* Video parameters and configurations */
+ OMX_IndexExtVideoStartUnused = OMX_IndexKhronosExtensions + 0x00600000,
+ OMX_IndexKhronosExtParamNALStreamFormatSupported, /**< reference: OMX_NALSTREAMFORMATTYPE */
+ OMX_IndexKhronosExtParamNALStreamFormat, /**< reference: OMX_NALSTREAMFORMATTYPE */
+ OMX_IndexKhronosExtParamNALStreamFormatSelect, /**< reference: OMX_NALSTREAMFORMATTYPE */
+
+ /* Image & Video common configurations */
+ OMX_IndexExtCommonStartUnused = OMX_IndexKhronosExtensions + 0x00700000,
+
+ /* Other configurations */
+ OMX_IndexExtOtherStartUnused = OMX_IndexKhronosExtensions + 0x00800000,
+
+ /* Time configurations */
+ OMX_IndexExtTimeStartUnused = OMX_IndexKhronosExtensions + 0x00900000,
+
+ OMX_IndexExtMax = 0x7FFFFFFF
+} OMX_INDEXEXTTYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* OMX_IndexExt_h */
+/* File EOF */
diff --git a/mm-core/inc/OMX_Other.h b/mm-core/inc/OMX_Other.h
new file mode 100755
index 00000000..caf7f384
--- /dev/null
+++ b/mm-core/inc/OMX_Other.h
@@ -0,0 +1,337 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/** @file OMX_Other.h - OpenMax IL version 1.1.2
+ * The structures needed by Other components to exchange
+ * parameters and configuration data with the components.
+ */
+
+#ifndef OMX_Other_h
+#define OMX_Other_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Each OMX header must include all required header files to allow the
+ * header to compile without errors. The includes below are required
+ * for this header file to compile successfully
+ */
+
+#include <OMX_Core.h>
+
+
+/**
+ * Enumeration of possible data types which match to multiple domains or no
+ * domain at all. For types which are vendor specific, a value above
+ * OMX_OTHER_VENDORTSTART should be used.
+ */
+typedef enum OMX_OTHER_FORMATTYPE {
+ OMX_OTHER_FormatTime = 0, /**< Transmission of various timestamps, elapsed time,
+ time deltas, etc */
+ OMX_OTHER_FormatPower, /**< Perhaps used for enabling/disabling power
+ management, setting clocks? */
+ OMX_OTHER_FormatStats, /**< Could be things such as frame rate, frames
+ dropped, etc */
+ OMX_OTHER_FormatBinary, /**< Arbitrary binary data */
+ OMX_OTHER_FormatVendorReserved = 1000, /**< Starting value for vendor specific
+ formats */
+
+ OMX_OTHER_FormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_OTHER_FormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_OTHER_FormatMax = 0x7FFFFFFF
+} OMX_OTHER_FORMATTYPE;
+
+/**
+ * Enumeration of seek modes.
+ */
+typedef enum OMX_TIME_SEEKMODETYPE {
+ OMX_TIME_SeekModeFast = 0, /**< Prefer seeking to an approximation
+ * of the requested seek position over
+ * the actual seek position if it
+ * results in a faster seek. */
+ OMX_TIME_SeekModeAccurate, /**< Prefer seeking to the actual seek
+ * position over an approximation
+ * of the requested seek position even
+ * if it results in a slower seek. */
+ OMX_TIME_SeekModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_TIME_SeekModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_TIME_SeekModeMax = 0x7FFFFFFF
+} OMX_TIME_SEEKMODETYPE;
+
+/* Structure representing the seekmode of the component */
+typedef struct OMX_TIME_CONFIG_SEEKMODETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_TIME_SEEKMODETYPE eType; /**< The seek mode */
+} OMX_TIME_CONFIG_SEEKMODETYPE;
+
+/** Structure representing a time stamp used with the following configs
+ * on the Clock Component (CC):
+ *
+ * OMX_IndexConfigTimeCurrentWallTime: query of the CC’s current wall
+ * time
+ * OMX_IndexConfigTimeCurrentMediaTime: query of the CC’s current media
+ * time
+ * OMX_IndexConfigTimeCurrentAudioReference and
+ * OMX_IndexConfigTimeCurrentVideoReference: audio/video reference
+ * clock sending SC its reference time
+ * OMX_IndexConfigTimeClientStartTime: a Clock Component client sends
+ * this structure to the Clock Component via a SetConfig on its
+ * client port when it receives a buffer with
+ * OMX_BUFFERFLAG_STARTTIME set. It must use the timestamp
+ * specified by that buffer for nStartTimestamp.
+ *
+ * It’s also used with the following config on components in general:
+ *
+ * OMX_IndexConfigTimePosition: IL client querying component position
+ * (GetConfig) or commanding a component to seek to the given location
+ * (SetConfig)
+ */
+typedef struct OMX_TIME_CONFIG_TIMESTAMPTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version
+ * information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_TICKS nTimestamp; /**< timestamp .*/
+} OMX_TIME_CONFIG_TIMESTAMPTYPE;
+
+/** Enumeration of possible reference clocks to the media time. */
+typedef enum OMX_TIME_UPDATETYPE {
+ OMX_TIME_UpdateRequestFulfillment, /**< Update is the fulfillment of a media time request. */
+ OMX_TIME_UpdateScaleChanged, /**< Update was generated because the scale chagned. */
+ OMX_TIME_UpdateClockStateChanged, /**< Update was generated because the clock state changed. */
+ OMX_TIME_UpdateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_TIME_UpdateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_TIME_UpdateMax = 0x7FFFFFFF
+} OMX_TIME_UPDATETYPE;
+
+/** Enumeration of possible reference clocks to the media time. */
+typedef enum OMX_TIME_REFCLOCKTYPE {
+ OMX_TIME_RefClockNone, /**< Use no references. */
+ OMX_TIME_RefClockAudio, /**< Use references sent through OMX_IndexConfigTimeCurrentAudioReference */
+ OMX_TIME_RefClockVideo, /**< Use references sent through OMX_IndexConfigTimeCurrentVideoReference */
+ OMX_TIME_RefClockKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_TIME_RefClockVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_TIME_RefClockMax = 0x7FFFFFFF
+} OMX_TIME_REFCLOCKTYPE;
+
+/** Enumeration of clock states. */
+typedef enum OMX_TIME_CLOCKSTATE {
+ OMX_TIME_ClockStateRunning, /**< Clock running. */
+ OMX_TIME_ClockStateWaitingForStartTime, /**< Clock waiting until the
+ * prescribed clients emit their
+ * start time. */
+ OMX_TIME_ClockStateStopped, /**< Clock stopped. */
+ OMX_TIME_ClockStateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_TIME_ClockStateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_TIME_ClockStateMax = 0x7FFFFFFF
+} OMX_TIME_CLOCKSTATE;
+
+/** Structure representing a media time request to the clock component.
+ *
+ * A client component sends this structure to the Clock Component via a SetConfig
+ * on its client port to specify a media timestamp the Clock Component
+ * should emit. The Clock Component should fulfill the request by sending a
+ * OMX_TIME_MEDIATIMETYPE when its media clock matches the requested
+ * timestamp.
+ *
+ * The client may require a media time request be fulfilled slightly
+ * earlier than the media time specified. In this case the client specifies
+ * an offset which is equal to the difference between wall time corresponding
+ * to the requested media time and the wall time when it will be
+ * fulfilled.
+ *
+ * A client component may uses these requests and the OMX_TIME_MEDIATIMETYPE to
+ * time events according to timestamps. If a client must perform an operation O at
+ * a time T (e.g. deliver a video frame at its corresponding timestamp), it makes a
+ * media time request at T (perhaps specifying an offset to ensure the request fulfillment
+ * is a little early). When the clock component passes the resulting OMX_TIME_MEDIATIMETYPE
+ * structure back to the client component, the client may perform operation O (perhaps having
+ * to wait a slight amount more time itself as specified by the return values).
+ */
+
+typedef struct OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ OMX_PTR pClientPrivate; /**< Client private data to disabiguate this media time
+ * from others (e.g. the number of the frame to deliver).
+ * Duplicated in the media time structure that fulfills
+ * this request. A value of zero is reserved for time scale
+ * updates. */
+ OMX_TICKS nMediaTimestamp; /**< Media timestamp requested.*/
+ OMX_TICKS nOffset; /**< Amount of wall clock time by which this
+ * request should be fulfilled early */
+} OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE;
+
+/**< Structure sent from the clock component client either when fulfilling
+ * a media time request or when the time scale has changed.
+ *
+ * In the former case the Clock Component fills this structure and times its emission
+ * to a client component (via the client port) according to the corresponding media
+ * time request sent by the client. The Clock Component should time the emission to occur
+ * when the requested timestamp matches the Clock Component's media time but also the
+ * prescribed offset early.
+ *
+ * Upon scale changes the clock component clears the nClientPrivate data, sends the current
+ * media time and sets the nScale to the new scale via the client port. It emits a
+ * OMX_TIME_MEDIATIMETYPE to all clients independent of any requests. This allows clients to
+ * alter processing to accomodate scaling. For instance a video component might skip inter-frames
+ * in the case of extreme fastforward. Likewise an audio component might add or remove samples
+ * from an audio frame to scale audio data.
+ *
+ * It is expected that some clock components may not be able to fulfill requests
+ * at exactly the prescribed time. This is acceptable so long as the request is
+ * fulfilled at least as early as described and not later. This structure provides
+ * fields the client may use to wait for the remaining time.
+ *
+ * The client may use either the nOffset or nWallTimeAtMedia fields to determine the
+ * wall time until the nMediaTimestamp actually occurs. In the latter case the
+ * client can get a more accurate value for offset by getting the current wall
+ * from the cloc component and subtracting it from nWallTimeAtMedia.
+ */
+
+typedef struct OMX_TIME_MEDIATIMETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nClientPrivate; /**< Client private data to disabiguate this media time
+ * from others. Copied from the media time request.
+ * A value of zero is reserved for time scale updates. */
+ OMX_TIME_UPDATETYPE eUpdateType; /**< Reason for the update */
+ OMX_TICKS nMediaTimestamp; /**< Media time requested. If no media time was
+ * requested then this is the current media time. */
+ OMX_TICKS nOffset; /**< Amount of wall clock time by which this
+ * request was actually fulfilled early */
+
+ OMX_TICKS nWallTimeAtMediaTime; /**< Wall time corresponding to nMediaTimeStamp.
+ * A client may compare this value to current
+ * media time obtained from the Clock Component to determine
+ * the wall time until the media timestamp is really
+ * current. */
+ OMX_S32 xScale; /**< Current media time scale in Q16 format. */
+ OMX_TIME_CLOCKSTATE eState; /* Seeking Change. Added 7/12.*/
+ /**< State of the media time. */
+} OMX_TIME_MEDIATIMETYPE;
+
+/** Structure representing the current media time scale factor. Applicable only to clock
+ * component, other components see scale changes via OMX_TIME_MEDIATIMETYPE buffers sent via
+ * the clock component client ports. Upon recieving this config the clock component changes
+ * the rate by which the media time increases or decreases effectively implementing trick modes.
+ */
+typedef struct OMX_TIME_CONFIG_SCALETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_S32 xScale; /**< This is a value in Q16 format which is used for
+ * scaling the media time */
+} OMX_TIME_CONFIG_SCALETYPE;
+
+/** Bits used to identify a clock port. Used in OMX_TIME_CONFIG_CLOCKSTATETYPE’s nWaitMask field */
+#define OMX_CLOCKPORT0 0x00000001
+#define OMX_CLOCKPORT1 0x00000002
+#define OMX_CLOCKPORT2 0x00000004
+#define OMX_CLOCKPORT3 0x00000008
+#define OMX_CLOCKPORT4 0x00000010
+#define OMX_CLOCKPORT5 0x00000020
+#define OMX_CLOCKPORT6 0x00000040
+#define OMX_CLOCKPORT7 0x00000080
+
+/** Structure representing the current mode of the media clock.
+ * IL Client uses this config to change or query the mode of the
+ * media clock of the clock component. Applicable only to clock
+ * component.
+ *
+ * On a SetConfig if eState is OMX_TIME_ClockStateRunning media time
+ * starts immediately at the prescribed start time. If
+ * OMX_TIME_ClockStateWaitingForStartTime the Clock Component ignores
+ * the given nStartTime and waits for all clients specified in the
+ * nWaitMask to send starttimes (via
+ * OMX_IndexConfigTimeClientStartTime). The Clock Component then starts
+ * the media clock using the earliest start time supplied. */
+typedef struct OMX_TIME_CONFIG_CLOCKSTATETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version
+ * information */
+ OMX_TIME_CLOCKSTATE eState; /**< State of the media time. */
+ OMX_TICKS nStartTime; /**< Start time of the media time. */
+ OMX_TICKS nOffset; /**< Time to offset the media time by
+ * (e.g. preroll). Media time will be
+ * reported to be nOffset ticks earlier.
+ */
+ OMX_U32 nWaitMask; /**< Mask of OMX_CLOCKPORT values. */
+} OMX_TIME_CONFIG_CLOCKSTATETYPE;
+
+/** Structure representing the reference clock currently being used to
+ * compute media time. IL client uses this config to change or query the
+ * clock component's active reference clock */
+typedef struct OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_TIME_REFCLOCKTYPE eClock; /**< Reference clock used to compute media time */
+} OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE;
+
+/** Descriptor for setting specifics of power type.
+ * Note: this structure is listed for backwards compatibility. */
+typedef struct OMX_OTHER_CONFIG_POWERTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnablePM; /**< Flag to enable Power Management */
+} OMX_OTHER_CONFIG_POWERTYPE;
+
+
+/** Descriptor for setting specifics of stats type.
+ * Note: this structure is listed for backwards compatibility. */
+typedef struct OMX_OTHER_CONFIG_STATSTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ /* what goes here */
+} OMX_OTHER_CONFIG_STATSTYPE;
+
+
+/**
+ * The PortDefinition structure is used to define all of the parameters
+ * necessary for the compliant component to setup an input or an output other
+ * path.
+ */
+typedef struct OMX_OTHER_PORTDEFINITIONTYPE {
+ OMX_OTHER_FORMATTYPE eFormat; /**< Type of data expected for this channel */
+} OMX_OTHER_PORTDEFINITIONTYPE;
+
+/** Port format parameter. This structure is used to enumerate
+ * the various data input/output format supported by the port.
+ */
+typedef struct OMX_OTHER_PARAM_PORTFORMATTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Indicates which port to set */
+ OMX_U32 nIndex; /**< Indicates the enumeration index for the format from 0x0 to N-1 */
+ OMX_OTHER_FORMATTYPE eFormat; /**< Type of data expected for this channel */
+} OMX_OTHER_PARAM_PORTFORMATTYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h
new file mode 100755
index 00000000..665aac54
--- /dev/null
+++ b/mm-core/inc/OMX_QCOMExtns.h
@@ -0,0 +1,873 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef __OMX_QCOM_EXTENSIONS_H__
+#define __OMX_QCOM_EXTENSIONS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*============================================================================
+*//** @file OMX_QCOMExtns.h
+ This header contains constants and type definitions that specify the
+ extensions added to the OpenMAX Vendor specific APIs.
+
+*//*========================================================================*/
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Include Files
+///////////////////////////////////////////////////////////////////////////////
+#include "OMX_Core.h"
+#include "OMX_Video.h"
+
+/**
+ * This extension is used to register mapping of a virtual
+ * address to a physical address. This extension is a parameter
+ * which can be set using the OMX_SetParameter macro. The data
+ * pointer corresponding to this extension is
+ * OMX_QCOM_MemMapEntry. This parameter is a 'write only'
+ * parameter (Current value cannot be queried using
+ * OMX_GetParameter macro).
+ */
+#define OMX_QCOM_EXTN_REGISTER_MMAP "OMX.QCOM.index.param.register_mmap"
+
+/**
+ * This structure describes the data pointer corresponding to
+ * the OMX_QCOM_MMAP_REGISTER_EXTN extension. This parameter
+ * must be set only 'after' populating a port with a buffer
+ * using OMX_UseBuffer, wherein the data pointer of the buffer
+ * corresponds to the virtual address as specified in this
+ * structure.
+ */
+struct OMX_QCOM_PARAM_MEMMAPENTRYTYPE
+{
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< Port number the structure applies to */
+
+ /**
+ * The virtual address of memory block
+ */
+ OMX_U64 nVirtualAddress;
+
+ /**
+ * The physical address corresponding to the virtual address. The physical
+ * address is contiguous for the entire valid range of the virtual
+ * address.
+ */
+ OMX_U64 nPhysicalAddress;
+};
+
+#define QOMX_VIDEO_IntraRefreshRandom (OMX_VIDEO_IntraRefreshVendorStartUnused + 0)
+
+#define QOMX_VIDEO_BUFFERFLAG_BFRAME 0x00100000
+
+#define QOMX_VIDEO_BUFFERFLAG_EOSEQ 0x00200000
+
+#define OMX_QCOM_PORTDEFN_EXTN "OMX.QCOM.index.param.portdefn"
+/* Allowed APIs on the above Index: OMX_GetParameter() and OMX_SetParameter() */
+
+typedef enum OMX_QCOMMemoryRegion
+{
+ OMX_QCOM_MemRegionInvalid,
+ OMX_QCOM_MemRegionEBI1,
+ OMX_QCOM_MemRegionSMI,
+ OMX_QCOM_MemRegionMax = 0X7FFFFFFF
+} OMX_QCOMMemoryRegion;
+
+typedef enum OMX_QCOMCacheAttr
+{
+ OMX_QCOM_CacheAttrNone,
+ OMX_QCOM_CacheAttrWriteBack,
+ OMX_QCOM_CacheAttrWriteThrough,
+ OMX_QCOM_CacheAttrMAX = 0X7FFFFFFF
+} OMX_QCOMCacheAttr;
+
+typedef struct OMX_QCOMRectangle
+{
+ OMX_S32 x;
+ OMX_S32 y;
+ OMX_S32 dx;
+ OMX_S32 dy;
+} OMX_QCOMRectangle;
+
+/** OMX_QCOMFramePackingFormat
+ * Input or output buffer format
+ */
+typedef enum OMX_QCOMFramePackingFormat
+{
+ /* 0 - unspecified
+ */
+ OMX_QCOM_FramePacking_Unspecified,
+
+ /* 1 - Partial frames may be present OMX IL 1.1.1 Figure 2-10:
+ * Case 1??Each Buffer Filled In Whole or In Part
+ */
+ OMX_QCOM_FramePacking_Arbitrary,
+
+ /* 2 - Multiple complete frames per buffer (integer number)
+ * OMX IL 1.1.1 Figure 2-11: Case 2—Each Buffer Filled with
+ * Only Complete Frames of Data
+ */
+ OMX_QCOM_FramePacking_CompleteFrames,
+
+ /* 3 - Only one complete frame per buffer, no partial frame
+ * OMX IL 1.1.1 Figure 2-12: Case 3—Each Buffer Filled with
+ * Only One Frame of Compressed Data. Usually at least one
+ * complete unit of data will be delivered in a buffer for
+ * uncompressed data formats.
+ */
+ OMX_QCOM_FramePacking_OnlyOneCompleteFrame,
+
+ /* 4 - Only one complete subframe per buffer, no partial subframe
+ * Example: In H264, one complete NAL per buffer, where one frame
+ * can contatin multiple NAL
+ */
+ OMX_QCOM_FramePacking_OnlyOneCompleteSubFrame,
+
+ OMX_QCOM_FramePacking_MAX = 0X7FFFFFFF
+} OMX_QCOMFramePackingFormat;
+
+typedef struct OMX_QCOM_PARAM_PORTDEFINITIONTYPE {
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;/** OMX specification version information */
+ OMX_U32 nPortIndex; /** Portindex which is extended by this structure */
+
+ /** Platform specific memory region EBI1, SMI, etc.,*/
+ OMX_QCOMMemoryRegion nMemRegion;
+
+ OMX_QCOMCacheAttr nCacheAttr; /** Cache attributes */
+
+ /** Input or output buffer format */
+ OMX_U32 nFramePackingFormat;
+
+} OMX_QCOM_PARAM_PORTDEFINITIONTYPE;
+
+#define OMX_QCOM_PLATFORMPVT_EXTN "OMX.QCOM.index.param.platformprivate"
+/** Allowed APIs on the above Index: OMX_SetParameter() */
+
+typedef enum OMX_QCOM_PLATFORM_PRIVATE_ENTRY_TYPE
+{
+ /** Enum for PMEM information */
+ OMX_QCOM_PLATFORM_PRIVATE_PMEM = 0x1
+} OMX_QCOM_PLATFORM_PRIVATE_ENTRY_TYPE;
+
+/** IL client will set the following structure. A failure
+ * code will be returned if component does not support the
+ * value provided for 'type'.
+ */
+struct OMX_QCOM_PLATFORMPRIVATE_EXTN
+{
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /** OMX spec version information */
+ OMX_U32 nPortIndex; /** Port number on which usebuffer extn is applied */
+
+ /** Type of extensions should match an entry from
+ OMX_QCOM_PLATFORM_PRIVATE_ENTRY_TYPE
+ */
+ OMX_QCOM_PLATFORM_PRIVATE_ENTRY_TYPE type;
+};
+
+typedef struct OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO
+{
+ /** pmem file descriptor */
+ OMX_U32 pmem_fd;
+ /** Offset from pmem device base address */
+ OMX_U32 offset;
+}OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO;
+
+typedef struct OMX_QCOM_PLATFORM_PRIVATE_ENTRY
+{
+ /** Entry type */
+ OMX_QCOM_PLATFORM_PRIVATE_ENTRY_TYPE type;
+
+ /** Pointer to platform specific entry */
+ void* entry;
+}OMX_QCOM_PLATFORM_PRIVATE_ENTRY;
+
+typedef struct OMX_QCOM_PLATFORM_PRIVATE_LIST
+{
+ /** Number of entries */
+ OMX_U32 nEntries;
+
+ /** Pointer to array of platform specific entries *
+ * Contiguous block of OMX_QCOM_PLATFORM_PRIVATE_ENTRY element
+ */
+ OMX_QCOM_PLATFORM_PRIVATE_ENTRY* entryList;
+}OMX_QCOM_PLATFORM_PRIVATE_LIST;
+
+#define OMX_QCOM_FRAME_PACKING_FORMAT "OMX.QCOM.index.param.framepackfmt"
+/* Allowed API call: OMX_GetParameter() */
+/* IL client can use this index to rerieve the list of frame formats *
+ * supported by the component */
+
+typedef struct OMX_QCOM_FRAME_PACKINGFORMAT_TYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nIndex;
+ OMX_QCOMFramePackingFormat eframePackingFormat;
+} OMX_QCOM_FRAME_PACKINGFORMAT_TYPE;
+
+
+/**
+ * Following is the enum for color formats supported on Qualcomm
+ * MSMs YVU420SemiPlanar color format is not defined in OpenMAX
+ * 1.1.1 and prior versions of OpenMAX specification.
+ */
+
+enum OMX_QCOM_COLOR_FORMATTYPE
+{
+
+/** YVU420SemiPlanar: YVU planar format, organized with a first
+ * plane containing Y pixels, and a second plane containing
+ * interleaved V and U pixels. V and U pixels are sub-sampled
+ * by a factor of two both horizontally and vertically.
+ */
+ OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00,
+ QOMX_COLOR_FormatYVU420PackedSemiPlanar32m4ka,
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar16m2ka,
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka,
+ QOMX_COLOR_FormatAndroidOpaque = (OMX_COLOR_FORMATTYPE) OMX_COLOR_FormatVendorStartUnused + 0x789,
+};
+
+enum OMX_QCOM_VIDEO_CODINGTYPE
+{
+/** Codecs support by qualcomm which are not listed in OMX 1.1.x
+ * spec
+ * */
+ OMX_QCOM_VIDEO_CodingVC1 = 0x7FA30C00 ,
+ OMX_QCOM_VIDEO_CodingWMV9 = 0x7FA30C01,
+ QOMX_VIDEO_CodingDivx = 0x7FA30C02, /**< Value when coding is Divx */
+ QOMX_VIDEO_CodingSpark = 0x7FA30C03, /**< Value when coding is Sorenson Spark */
+ QOMX_VIDEO_CodingVp = 0x7FA30C04,
+ QOMX_VIDEO_CodingVp8 = 0x7FA30C05
+};
+
+enum OMX_QCOM_EXTN_INDEXTYPE
+{
+ /** Qcom proprietary extension index list */
+
+ /* "OMX.QCOM.index.param.register_mmap" */
+ OMX_QcomIndexRegmmap = 0x7F000000,
+
+ /* "OMX.QCOM.index.param.platformprivate" */
+ OMX_QcomIndexPlatformPvt = 0x7F000001,
+
+ /* "OMX.QCOM.index.param.portdefn" */
+ OMX_QcomIndexPortDefn = 0x7F000002,
+
+ /* "OMX.QCOM.index.param.framepackingformat" */
+ OMX_QcomIndexPortFramePackFmt = 0x7F000003,
+
+ /*"OMX.QCOM.index.param.Interlaced */
+ OMX_QcomIndexParamInterlaced = 0x7F000004,
+
+ /*"OMX.QCOM.index.config.interlaceformat */
+ OMX_QcomIndexConfigInterlaced = 0x7F000005,
+
+ /*"OMX.QCOM.index.param.syntaxhdr" */
+ QOMX_IndexParamVideoSyntaxHdr = 0x7F000006,
+
+ /*"OMX.QCOM.index.config.intraperiod" */
+ QOMX_IndexConfigVideoIntraperiod = 0x7F000007,
+
+ /*"OMX.QCOM.index.config.randomIntrarefresh" */
+ QOMX_IndexConfigVideoIntraRefresh = 0x7F000008,
+
+ /*"OMX.QCOM.index.config.video.TemporalSpatialTradeOff" */
+ QOMX_IndexConfigVideoTemporalSpatialTradeOff = 0x7F000009,
+
+ /*"OMX.QCOM.index.param.video.EncoderMode" */
+ QOMX_IndexParamVideoEncoderMode = 0x7F00000A,
+
+ /*"OMX.QCOM.index.param.Divxtype */
+ OMX_QcomIndexParamVideoDivx = 0x7F00000B,
+
+ /*"OMX.QCOM.index.param.Sparktype */
+ OMX_QcomIndexParamVideoSpark = 0x7F00000C,
+
+ /*"OMX.QCOM.index.param.Vptype */
+ OMX_QcomIndexParamVideoVp = 0x7F00000D,
+
+ OMX_QcomIndexQueryNumberOfVideoDecInstance = 0x7F00000E,
+
+ OMX_QcomIndexParamVideoSyncFrameDecodingMode = 0x7F00000F,
+
+ OMX_QcomIndexParamVideoDecoderPictureOrder = 0x7F000010,
+
+ OMX_QcomIndexConfigVideoFramePackingArrangement = 0x7F000011,
+
+ OMX_QcomIndexParamConcealMBMapExtraData = 0x7F000012,
+
+ OMX_QcomIndexParamFrameInfoExtraData = 0x7F000013,
+
+ OMX_QcomIndexParamInterlaceExtraData = 0x7F000014,
+
+ OMX_QcomIndexParamH264TimeInfo = 0x7F000015,
+
+ OMX_QcomIndexParamIndexExtraDataType = 0x7F000016,
+
+ OMX_GoogleAndroidIndexEnableAndroidNativeBuffers = 0x7F000017,
+
+ OMX_GoogleAndroidIndexUseAndroidNativeBuffer = 0x7F000018,
+
+ OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage = 0x7F000019,
+
+ /*"OMX.QCOM.index.config.video.QPRange" */
+ OMX_QcomIndexConfigVideoQPRange = 0x7F00001A,
+
+ /*"OMX.QCOM.index.param.EnableTimeStampReoder"*/
+ OMX_QcomIndexParamEnableTimeStampReorder = 0x7F00001B,
+
+ /*"OMX.google.android.index.storeMetaDataInBuffers"*/
+ OMX_QcomIndexParamVideoEncodeMetaBufferMode = 0x7F00001C,
+
+ /*"OMX.google.android.index.useAndroidNativeBuffer2"*/
+ OMX_GoogleAndroidIndexUseAndroidNativeBuffer2 = 0x7F00001D,
+
+ /*"OMX.QCOM.index.param.VideoMaxAllowedBitrateCheck"*/
+ OMX_QcomIndexParamVideoMaxAllowedBitrateCheck = 0x7F00001E,
+
+ OMX_QcomIndexEnableSliceDeliveryMode = 0x7F00001F,
+};
+
+/**
+ * Extension index parameter. This structure is used to enable
+ * vendor specific extension on input/output port and
+ * to pass the required flags and data, if any.
+ * The format of flags and data being passed is known to
+ * the client and component apriori.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of Structure plus pData size
+ * nVersion : OMX specification version information
+ * nPortIndex : Indicates which port to set
+ * bEnable : Extension index enable (1) or disable (0)
+ * nFlags : Extension index flags, if any
+ * nDataSize : Size of the extension index data to follow
+ * pData : Extension index data, if present.
+ */
+typedef struct QOMX_EXTNINDEX_PARAMTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bEnable;
+ OMX_U32 nFlags;
+ OMX_U32 nDataSize;
+ OMX_PTR pData;
+} QOMX_EXTNINDEX_PARAMTYPE;
+
+/**
+ * Enumeration used to define the video encoder modes
+ *
+ * ENUMS:
+ * EncoderModeDefault : Default video recording mode.
+ * All encoder settings made through
+ * OMX_SetParameter/OMX_SetConfig are applied. No
+ * parameter is overridden.
+ * EncoderModeMMS : Video recording mode for MMS (Multimedia Messaging
+ * Service). This mode is similar to EncoderModeDefault
+ * except that here the Rate control mode is overridden
+ * internally and set as a variant of variable bitrate with
+ * variable frame rate. After this mode is set if the IL
+ * client tries to set OMX_VIDEO_CONTROLRATETYPE via
+ * OMX_IndexParamVideoBitrate that would be rejected. For
+ * this, client should set mode back to EncoderModeDefault
+ * first and then change OMX_VIDEO_CONTROLRATETYPE.
+ */
+typedef enum QOMX_VIDEO_ENCODERMODETYPE
+{
+ QOMX_VIDEO_EncoderModeDefault = 0x00,
+ QOMX_VIDEO_EncoderModeMMS = 0x01,
+ QOMX_VIDEO_EncoderModeMax = 0x7FFFFFFF
+} QOMX_VIDEO_ENCODERMODETYPE;
+
+/**
+ * This structure is used to set the video encoder mode.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * nMode : defines the video encoder mode
+ */
+typedef struct QOMX_VIDEO_PARAM_ENCODERMODETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_ENCODERMODETYPE nMode;
+} QOMX_VIDEO_PARAM_ENCODERMODETYPE;
+
+/**
+ * This structure describes the parameters corresponding to the
+ * QOMX_VIDEO_SYNTAXHDRTYPE extension. This parameter can be queried
+ * during the loaded state.
+ */
+
+typedef struct QOMX_VIDEO_SYNTAXHDRTYPE
+{
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;/** OMX specification version information */
+ OMX_U32 nPortIndex; /** Portindex which is extended by this structure */
+ OMX_U32 nBytes; /** The number of bytes filled in to the buffer */
+ OMX_U8 data[1]; /** Buffer to store the header information */
+} QOMX_VIDEO_SYNTAXHDRTYPE;
+
+/**
+ * This structure describes the parameters corresponding to the
+ * QOMX_VIDEO_TEMPORALSPATIALTYPE extension. This parameter can be set
+ * dynamically during any state except the state invalid. This is primarily
+ * used for setting MaxQP from the application. This is set on the out port.
+ */
+
+typedef struct QOMX_VIDEO_TEMPORALSPATIALTYPE
+{
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;/** OMX specification version information */
+ OMX_U32 nPortIndex; /** Portindex which is extended by this structure */
+ OMX_U32 nTSFactor; /** Temoral spatial tradeoff factor value in 0-100 */
+} QOMX_VIDEO_TEMPORALSPATIALTYPE;
+
+/**
+ * This structure describes the parameters corresponding to the
+ * OMX_QCOM_VIDEO_CONFIG_INTRAPERIODTYPE extension. This parameter can be set
+ * dynamically during any state except the state invalid. This is set on the out port.
+ */
+
+typedef struct QOMX_VIDEO_INTRAPERIODTYPE
+{
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;/** OMX specification version information */
+ OMX_U32 nPortIndex; /** Portindex which is extended by this structure */
+ OMX_U32 nIDRPeriod; /** This specifies coding a frame as IDR after every nPFrames
+ of intra frames. If this parameter is set to 0, only the
+ first frame of the encode session is an IDR frame. This
+ field is ignored for non-AVC codecs and is used only for
+ codecs that support IDR Period */
+ OMX_U32 nPFrames; /** The number of "P" frames between two "I" frames */
+ OMX_U32 nBFrames; /** The number of "B" frames between two "I" frames */
+} QOMX_VIDEO_INTRAPERIODTYPE;
+
+/**
+ * This structure describes the parameters corresponding to the
+ * OMX_QCOM_VIDEO_CONFIG_ULBUFFEROCCUPANCYTYPE extension. This parameter can be set
+ * dynamically during any state except the state invalid. This is used for the buffer negotiation
+ * with other clients. This is set on the out port.
+ */
+typedef struct OMX_QCOM_VIDEO_CONFIG_ULBUFFEROCCUPANCYTYPE
+{
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /** OMX specification version information */
+ OMX_U32 nPortIndex; /** Portindex which is extended by this structure */
+ OMX_U32 nBufferOccupancy; /** The number of bytes to be set for the buffer occupancy */
+} OMX_QCOM_VIDEO_CONFIG_ULBUFFEROCCUPANCYTYPE;
+
+/**
+ * This structure describes the parameters corresponding to the
+ * OMX_QCOM_VIDEO_CONFIG_RANDOMINTRAREFRESHTYPE extension. This parameter can be set
+ * dynamically during any state except the state invalid. This is primarily used for the dynamic/random
+ * intrarefresh. This is set on the out port.
+ */
+typedef struct OMX_QCOM_VIDEO_CONFIG_RANDOMINTRAREFRESHTYPE
+{
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;/** OMX specification version information */
+ OMX_U32 nPortIndex; /** Portindex which is extended by this structure */
+ OMX_U32 nRirMBs; /** The number of MBs to be set for intrarefresh */
+} OMX_QCOM_VIDEO_CONFIG_RANDOMINTRAREFRESHTYPE;
+
+
+/**
+ * This structure describes the parameters corresponding to the
+ * OMX_QCOM_VIDEO_CONFIG_QPRANGE extension. This parameter can be set
+ * dynamically during any state except the state invalid. This is primarily
+ * used for the min/max QP to be set from the application. This
+ * is set on the out port.
+ */
+typedef struct OMX_QCOM_VIDEO_CONFIG_QPRANGE
+{
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;/** OMX specification version information */
+ OMX_U32 nPortIndex; /** Portindex which is extended by this structure */
+ OMX_U32 nMinQP; /** The number for minimum quantization parameter */
+ OMX_U32 nMaxQP; /** The number for maximum quantization parameter */
+} OMX_QCOM_VIDEO_CONFIG_QPRANGE;
+
+
+typedef struct OMX_VENDOR_EXTRADATATYPE {
+ OMX_U32 nPortIndex;
+ OMX_U32 nDataSize;
+ OMX_U8 *pData; // cdata (codec_data/extradata)
+} OMX_VENDOR_EXTRADATATYPE;
+
+typedef enum OMX_INDEXVENDORTYPE {
+ OMX_IndexVendorFileReadInputFilename = 0xFF000001,
+ OMX_IndexVendorParser3gpInputFilename = 0xFF000002,
+ OMX_IndexVendorVideoExtraData = 0xFF000003,
+ OMX_IndexVendorAudioExtraData = 0xFF000004
+} OMX_INDEXVENDORTYPE;
+
+typedef enum OMX_QCOM_VC1RESOLUTIONTYPE
+{
+ OMX_QCOM_VC1_PICTURE_RES_1x1,
+ OMX_QCOM_VC1_PICTURE_RES_2x1,
+ OMX_QCOM_VC1_PICTURE_RES_1x2,
+ OMX_QCOM_VC1_PICTURE_RES_2x2
+} OMX_QCOM_VC1RESOLUTIONTYPE;
+
+typedef enum OMX_QCOM_INTERLACETYPE
+{
+ OMX_QCOM_InterlaceFrameProgressive,
+ OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst,
+ OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst,
+ OMX_QCOM_InterlaceFrameTopFieldFirst,
+ OMX_QCOM_InterlaceFrameBottomFieldFirst,
+ OMX_QCOM_InterlaceFieldTop,
+ OMX_QCOM_InterlaceFieldBottom
+}OMX_QCOM_INTERLACETYPE;
+
+typedef struct OMX_QCOM_PARAM_VIDEO_INTERLACETYPE
+{
+ OMX_U32 nSize; /** Size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;/** OMX specification version information */
+ OMX_U32 nPortIndex; /** Portindex which is extended by this structure */
+ OMX_BOOL bInterlace; /** Interlace content **/
+}OMX_QCOM_PARAM_VIDEO_INTERLACETYPE;
+
+typedef struct OMX_QCOM_CONFIG_INTERLACETYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nIndex;
+ OMX_QCOM_INTERLACETYPE eInterlaceType;
+}OMX_QCOM_CONFIG_INTERLACETYPE;
+
+#define MAX_PAN_SCAN_WINDOWS 4
+
+typedef struct OMX_QCOM_PANSCAN
+{
+ OMX_U32 numWindows;
+ OMX_QCOMRectangle window[MAX_PAN_SCAN_WINDOWS];
+} OMX_QCOM_PANSCAN;
+
+typedef struct OMX_QCOM_ASPECT_RATIO
+{
+ OMX_U32 aspectRatioX;
+ OMX_U32 aspectRatioY;
+} OMX_QCOM_ASPECT_RATIO;
+
+typedef struct OMX_QCOM_FRAME_PACK_ARRANGEMENT
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 id;
+ OMX_U32 cancel_flag;
+ OMX_U32 type;
+ OMX_U32 quincunx_sampling_flag;
+ OMX_U32 content_interpretation_type;
+ OMX_U32 spatial_flipping_flag;
+ OMX_U32 frame0_flipped_flag;
+ OMX_U32 field_views_flag;
+ OMX_U32 current_frame_is_frame0_flag;
+ OMX_U32 frame0_self_contained_flag;
+ OMX_U32 frame1_self_contained_flag;
+ OMX_U32 frame0_grid_position_x;
+ OMX_U32 frame0_grid_position_y;
+ OMX_U32 frame1_grid_position_x;
+ OMX_U32 frame1_grid_position_y;
+ OMX_U32 reserved_byte;
+ OMX_U32 repetition_period;
+ OMX_U32 extension_flag;
+} OMX_QCOM_FRAME_PACK_ARRANGEMENT;
+
+typedef struct OMX_QCOM_EXTRADATA_FRAMEINFO
+{
+ // common frame meta data. interlace related info removed
+ OMX_VIDEO_PICTURETYPE ePicType;
+ OMX_QCOM_INTERLACETYPE interlaceType;
+ OMX_QCOM_PANSCAN panScan;
+ OMX_QCOM_ASPECT_RATIO aspectRatio;
+ OMX_U32 nConcealedMacroblocks;
+ OMX_U32 nFrameRate;
+} OMX_QCOM_EXTRADATA_FRAMEINFO;
+
+typedef struct OMX_QCOM_EXTRADATA_FRAMEDIMENSION
+{
+ /** Frame Dimensions added to each YUV buffer */
+ OMX_U32 nDecWidth; /** Width rounded to multiple of 16 */
+ OMX_U32 nDecHeight; /** Height rounded to multiple of 16 */
+ OMX_U32 nActualWidth; /** Actual Frame Width */
+ OMX_U32 nActualHeight; /** Actual Frame Height */
+
+}OMX_QCOM_EXTRADATA_FRAMEDIMENSION;
+
+typedef struct OMX_QCOM_H264EXTRADATA
+{
+ OMX_U64 seiTimeStamp;
+} OMX_QCOM_H264EXTRADATA;
+
+typedef struct OMX_QCOM_VC1EXTRADATA
+{
+ OMX_U32 nVC1RangeY;
+ OMX_U32 nVC1RangeUV;
+ OMX_QCOM_VC1RESOLUTIONTYPE eVC1PicResolution;
+} OMX_QCOM_VC1EXTRADATA;
+
+typedef union OMX_QCOM_EXTRADATA_CODEC_DATA
+{
+ OMX_QCOM_H264EXTRADATA h264ExtraData;
+ OMX_QCOM_VC1EXTRADATA vc1ExtraData;
+} OMX_QCOM_EXTRADATA_CODEC_DATA;
+
+typedef enum OMX_QCOM_EXTRADATATYPE
+{
+ OMX_ExtraDataFrameInfo = 0x7F000001,
+ OMX_ExtraDataH264 = 0x7F000002,
+ OMX_ExtraDataVC1 = 0x7F000003,
+ OMX_ExtraDataFrameDimension = 0x7F000004,
+ OMX_ExtraDataVideoEncoderSliceInfo = 0x7F000005,
+ OMX_ExtraDataConcealMB = 0x7F000006,
+ OMX_ExtraDataInterlaceFormat = 0x7F000007,
+ OMX_ExtraDataPortDef = 0x7F000008
+} OMX_QCOM_EXTRADATATYPE;
+
+typedef struct OMX_STREAMINTERLACEFORMATTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bInterlaceFormat;
+ OMX_U32 nInterlaceFormats;
+} OMX_STREAMINTERLACEFORMAT;
+
+typedef enum OMX_INTERLACETYPE
+{
+ OMX_InterlaceFrameProgressive,
+ OMX_InterlaceInterleaveFrameTopFieldFirst,
+ OMX_InterlaceInterleaveFrameBottomFieldFirst,
+ OMX_InterlaceFrameTopFieldFirst,
+ OMX_InterlaceFrameBottomFieldFirst
+}OMX_INTERLACEs;
+
+
+#define OMX_EXTRADATA_HEADER_SIZE 20
+
+/**
+ * DivX Versions
+ */
+typedef enum QOMX_VIDEO_DIVXFORMATTYPE {
+ QOMX_VIDEO_DIVXFormatUnused = 0x01, /**< Format unused or unknown */
+ QOMX_VIDEO_DIVXFormat311 = 0x02, /**< DivX 3.11 */
+ QOMX_VIDEO_DIVXFormat4 = 0x04, /**< DivX 4 */
+ QOMX_VIDEO_DIVXFormat5 = 0x08, /**< DivX 5 */
+ QOMX_VIDEO_DIVXFormat6 = 0x10, /**< DivX 6 */
+ QOMX_VIDEO_DIVXFormatKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_DIVXFormatVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_DIVXFormatMax = 0x7FFFFFFF
+} QOMX_VIDEO_DIVXFORMATTYPE;
+
+/**
+ * DivX profile types, each profile indicates support for
+ * various performance bounds.
+ */
+typedef enum QOMX_VIDEO_DIVXPROFILETYPE {
+ QOMX_VIDEO_DivXProfileqMobile = 0x01, /**< qMobile Profile */
+ QOMX_VIDEO_DivXProfileMobile = 0x02, /**< Mobile Profile */
+ QOMX_VIDEO_DivXProfileMT = 0x04, /**< Mobile Theatre Profile */
+ QOMX_VIDEO_DivXProfileHT = 0x08, /**< Home Theatre Profile */
+ QOMX_VIDEO_DivXProfileHD = 0x10, /**< High Definition Profile */
+ QOMX_VIDEO_DIVXProfileKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_DIVXProfileVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_DIVXProfileMax = 0x7FFFFFFF
+} QOMX_VIDEO_DIVXPROFILETYPE;
+
+/**
+ * DivX Video Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFormat : Version of DivX stream / data
+ * eProfile : Profile of DivX stream / data
+ */
+typedef struct QOMX_VIDEO_PARAM_DIVXTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_DIVXFORMATTYPE eFormat;
+ QOMX_VIDEO_DIVXPROFILETYPE eProfile;
+} QOMX_VIDEO_PARAM_DIVXTYPE;
+
+
+
+/**
+ * VP Versions
+ */
+typedef enum QOMX_VIDEO_VPFORMATTYPE {
+ QOMX_VIDEO_VPFormatUnused = 0x01, /**< Format unused or unknown */
+ QOMX_VIDEO_VPFormat6 = 0x02, /**< VP6 Video Format */
+ QOMX_VIDEO_VPFormat7 = 0x04, /**< VP7 Video Format */
+ QOMX_VIDEO_VPFormat8 = 0x08, /**< VP8 Video Format */
+ QOMX_VIDEO_VPFormatKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_VPFormatVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_VPFormatMax = 0x7FFFFFFF
+} QOMX_VIDEO_VPFORMATTYPE;
+
+/**
+ * VP profile types, each profile indicates support for various
+ * encoding tools.
+ */
+typedef enum QOMX_VIDEO_VPPROFILETYPE {
+ QOMX_VIDEO_VPProfileSimple = 0x01, /**< Simple Profile, applies to VP6 only */
+ QOMX_VIDEO_VPProfileAdvanced = 0x02, /**< Advanced Profile, applies to VP6 only */
+ QOMX_VIDEO_VPProfileVersion0 = 0x04, /**< Version 0, applies to VP7 and VP8 */
+ QOMX_VIDEO_VPProfileVersion1 = 0x08, /**< Version 1, applies to VP7 and VP8 */
+ QOMX_VIDEO_VPProfileVersion2 = 0x10, /**< Version 2, applies to VP8 only */
+ QOMX_VIDEO_VPProfileVersion3 = 0x20, /**< Version 3, applies to VP8 only */
+ QOMX_VIDEO_VPProfileKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_VPProfileVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_VPProfileMax = 0x7FFFFFFF
+} QOMX_VIDEO_VPPROFILETYPE;
+
+/**
+ * VP Video Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFormat : Format of VP stream / data
+ * eProfile : Profile or Version of VP stream / data
+ */
+typedef struct QOMX_VIDEO_PARAM_VPTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_VPFORMATTYPE eFormat;
+ QOMX_VIDEO_VPPROFILETYPE eProfile;
+} QOMX_VIDEO_PARAM_VPTYPE;
+
+/**
+ * Spark Versions
+ */
+typedef enum QOMX_VIDEO_SPARKFORMATTYPE {
+ QOMX_VIDEO_SparkFormatUnused = 0x01, /**< Format unused or unknown */
+ QOMX_VIDEO_SparkFormat0 = 0x02, /**< Video Format Version 0 */
+ QOMX_VIDEO_SparkFormat1 = 0x04, /**< Video Format Version 1 */
+ QOMX_VIDEO_SparkFormatKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_SparkFormatVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_SparkFormatMax = 0x7FFFFFFF
+} QOMX_VIDEO_SPARKFORMATTYPE;
+
+/**
+ * Spark Video Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFormat : Version of Spark stream / data
+ */
+typedef struct QOMX_VIDEO_PARAM_SPARKTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_SPARKFORMATTYPE eFormat;
+} QOMX_VIDEO_PARAM_SPARKTYPE;
+
+
+typedef struct QOMX_VIDEO_QUERY_DECODER_INSTANCES {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nNumOfInstances;
+} QOMX_VIDEO_QUERY_DECODER_INSTANCES;
+
+typedef struct QOMX_ENABLETYPE {
+ OMX_BOOL bEnable;
+} QOMX_ENABLETYPE;
+
+typedef enum QOMX_VIDEO_EVENTS {
+ OMX_EventIndexsettingChanged = OMX_EventVendorStartUnused
+} QOMX_VIDEO_EVENTS;
+
+typedef enum QOMX_VIDEO_PICTURE_ORDER {
+ QOMX_VIDEO_DISPLAY_ORDER = 0x1,
+ QOMX_VIDEO_DECODE_ORDER = 0x2
+} QOMX_VIDEO_PICTURE_ORDER;
+
+typedef struct QOMX_VIDEO_DECODER_PICTURE_ORDER {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_PICTURE_ORDER eOutputPictureOrder;
+} QOMX_VIDEO_DECODER_PICTURE_ORDER;
+
+typedef struct QOMX_INDEXEXTRADATATYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bEnabled;
+ OMX_INDEXTYPE nIndex;
+} QOMX_INDEXEXTRADATATYPE;
+
+typedef struct QOMX_INDEXTIMESTAMPREORDER {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bEnable;
+} QOMX_INDEXTIMESTAMPREORDER;
+
+#define OMX_QCOM_INDEX_PARAM_VIDEO_SYNCFRAMEDECODINGMODE "OMX.QCOM.index.param.video.SyncFrameDecodingMode"
+#define OMX_QCOM_INDEX_PARAM_INDEXEXTRADATA "OMX.QCOM.index.param.IndexExtraData"
+#define OMX_QCOM_INDEX_PARAM_VIDEO_SLICEDELIVERYMODE "OMX.QCOM.index.param.SliceDeliveryMode"
+
+typedef enum {
+ QOMX_VIDEO_FRAME_PACKING_CHECKERBOARD = 0,
+ QOMX_VIDEO_FRAME_PACKING_COLUMN_INTERLEAVE = 1,
+ QOMX_VIDEO_FRAME_PACKING_ROW_INTERLEAVE = 2,
+ QOMX_VIDEO_FRAME_PACKING_SIDE_BY_SIDE = 3,
+ QOMX_VIDEO_FRAME_PACKING_TOP_BOTTOM = 4,
+ QOMX_VIDEO_FRAME_PACKING_TEMPORAL = 5,
+} QOMX_VIDEO_FRAME_PACKING_ARRANGEMENT;
+
+typedef enum {
+ QOMX_VIDEO_CONTENT_UNSPECIFIED = 0,
+ QOMX_VIDEO_CONTENT_LR_VIEW = 1,
+ QOMX_VIDEO_CONTENT_RL_VIEW = 2,
+} QOMX_VIDEO_CONTENT_INTERPRETATION;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __OMX_QCOM_EXTENSIONS_H__ */
diff --git a/mm-core/inc/OMX_Types.h b/mm-core/inc/OMX_Types.h
new file mode 100755
index 00000000..9b02a3eb
--- /dev/null
+++ b/mm-core/inc/OMX_Types.h
@@ -0,0 +1,347 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/** OMX_Types.h - OpenMax IL version 1.1.2
+ * The OMX_Types header file contains the primitive type definitions used by
+ * the core, the application and the component. This file may need to be
+ * modified to be used on systems that do not have "char" set to 8 bits,
+ * "short" set to 16 bits and "long" set to 32 bits.
+ */
+
+#ifndef OMX_Types_h
+#define OMX_Types_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** The OMX_API and OMX_APIENTRY are platform specific definitions used
+ * to declare OMX function prototypes. They are modified to meet the
+ * requirements for a particular platform */
+#ifdef __SYMBIAN32__
+# ifdef __OMX_EXPORTS
+# define OMX_API __declspec(dllexport)
+# else
+# ifdef _WIN32
+# define OMX_API __declspec(dllexport)
+# else
+# define OMX_API __declspec(dllimport)
+# endif
+# endif
+#else
+# ifdef _WIN32
+# ifdef __OMX_EXPORTS
+# define OMX_API __declspec(dllexport)
+# else
+# define OMX_API __declspec(dllimport)
+# endif
+# else
+# ifdef __OMX_EXPORTS
+# define OMX_API
+# else
+# define OMX_API extern
+# endif
+# endif
+#endif
+
+#ifndef OMX_APIENTRY
+#define OMX_APIENTRY
+#endif
+
+/** OMX_IN is used to identify inputs to an OMX function. This designation
+ will also be used in the case of a pointer that points to a parameter
+ that is used as an output. */
+#ifndef OMX_IN
+#define OMX_IN
+#endif
+
+/** OMX_OUT is used to identify outputs from an OMX function. This
+ designation will also be used in the case of a pointer that points
+ to a parameter that is used as an input. */
+#ifndef OMX_OUT
+#define OMX_OUT
+#endif
+
+
+/** OMX_INOUT is used to identify parameters that may be either inputs or
+ outputs from an OMX function at the same time. This designation will
+ also be used in the case of a pointer that points to a parameter that
+ is used both as an input and an output. */
+#ifndef OMX_INOUT
+#define OMX_INOUT
+#endif
+
+/** OMX_ALL is used to as a wildcard to select all entities of the same type
+ * when specifying the index, or referring to a object by an index. (i.e.
+ * use OMX_ALL to indicate all N channels). When used as a port index
+ * for a config or parameter this OMX_ALL denotes that the config or
+ * parameter applies to the entire component not just one port. */
+#define OMX_ALL 0xFFFFFFFF
+
+/** In the following we define groups that help building doxygen documentation */
+
+/** @defgroup core OpenMAX IL core
+ * Functions and structure related to the OMX IL core
+ */
+
+ /** @defgroup comp OpenMAX IL component
+ * Functions and structure related to the OMX IL component
+ */
+
+/** @defgroup rpm Resource and Policy Management
+ * Structures for resource and policy management of components
+ */
+
+/** @defgroup buf Buffer Management
+ * Buffer handling functions and structures
+ */
+
+/** @defgroup tun Tunneling
+ * @ingroup core comp
+ * Structures and functions to manage tunnels among component ports
+ */
+
+/** @defgroup cp Content Pipes
+ * @ingroup core
+ */
+
+ /** @defgroup metadata Metadata handling
+ *
+ */
+
+/** OMX_U8 is an 8 bit unsigned quantity that is byte aligned */
+typedef unsigned char OMX_U8;
+
+/** OMX_S8 is an 8 bit signed quantity that is byte aligned */
+typedef signed char OMX_S8;
+
+/** OMX_U16 is a 16 bit unsigned quantity that is 16 bit word aligned */
+typedef unsigned short OMX_U16;
+
+/** OMX_S16 is a 16 bit signed quantity that is 16 bit word aligned */
+typedef signed short OMX_S16;
+
+/** OMX_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */
+typedef unsigned long OMX_U32;
+
+/** OMX_S32 is a 32 bit signed quantity that is 32 bit word aligned */
+typedef signed long OMX_S32;
+
+
+/* Users with compilers that cannot accept the "long long" designation should
+ define the OMX_SKIP64BIT macro. It should be noted that this may cause
+ some components to fail to compile if the component was written to require
+ 64 bit integral types. However, these components would NOT compile anyway
+ since the compiler does not support the way the component was written.
+*/
+#ifndef OMX_SKIP64BIT
+#ifdef __SYMBIAN32__
+/** OMX_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
+typedef unsigned long long OMX_U64;
+
+/** OMX_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed long long OMX_S64;
+
+#elif defined(WIN32)
+
+/** OMX_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
+typedef unsigned __int64 OMX_U64;
+
+/** OMX_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed __int64 OMX_S64;
+
+#else /* WIN32 */
+
+/** OMX_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
+typedef unsigned long long OMX_U64;
+
+/** OMX_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed long long OMX_S64;
+
+#endif /* WIN32 */
+#endif
+
+
+/** The OMX_BOOL type is intended to be used to represent a true or a false
+ value when passing parameters to and from the OMX core and components. The
+ OMX_BOOL is a 32 bit quantity and is aligned on a 32 bit word boundary.
+ */
+typedef enum OMX_BOOL {
+ OMX_FALSE = 0,
+ OMX_TRUE = !OMX_FALSE,
+ OMX_BOOL_MAX = 0x7FFFFFFF
+} OMX_BOOL;
+
+/** The OMX_PTR type is intended to be used to pass pointers between the OMX
+ applications and the OMX Core and components. This is a 32 bit pointer and
+ is aligned on a 32 bit boundary.
+ */
+typedef void* OMX_PTR;
+
+/** The OMX_STRING type is intended to be used to pass "C" type strings between
+ the application and the core and component. The OMX_STRING type is a 32
+ bit pointer to a zero terminated string. The pointer is word aligned and
+ the string is byte aligned.
+ */
+typedef char* OMX_STRING;
+
+/** The OMX_BYTE type is intended to be used to pass arrays of bytes such as
+ buffers between the application and the component and core. The OMX_BYTE
+ type is a 32 bit pointer to a zero terminated string. The pointer is word
+ aligned and the string is byte aligned.
+ */
+typedef unsigned char* OMX_BYTE;
+
+/** OMX_UUIDTYPE is a very long unique identifier to uniquely identify
+ at runtime. This identifier should be generated by a component in a way
+ that guarantees that every instance of the identifier running on the system
+ is unique. */
+typedef unsigned char OMX_UUIDTYPE[128];
+
+/** The OMX_DIRTYPE enumeration is used to indicate if a port is an input or
+ an output port. This enumeration is common across all component types.
+ */
+typedef enum OMX_DIRTYPE
+{
+ OMX_DirInput, /**< Port is an input port */
+ OMX_DirOutput, /**< Port is an output port */
+ OMX_DirMax = 0x7FFFFFFF
+} OMX_DIRTYPE;
+
+/** The OMX_ENDIANTYPE enumeration is used to indicate the bit ordering
+ for numerical data (i.e. big endian, or little endian).
+ */
+typedef enum OMX_ENDIANTYPE
+{
+ OMX_EndianBig, /**< big endian */
+ OMX_EndianLittle, /**< little endian */
+ OMX_EndianMax = 0x7FFFFFFF
+} OMX_ENDIANTYPE;
+
+
+/** The OMX_NUMERICALDATATYPE enumeration is used to indicate if data
+ is signed or unsigned
+ */
+typedef enum OMX_NUMERICALDATATYPE
+{
+ OMX_NumericalDataSigned, /**< signed data */
+ OMX_NumericalDataUnsigned, /**< unsigned data */
+ OMX_NumercialDataMax = 0x7FFFFFFF
+} OMX_NUMERICALDATATYPE;
+
+
+/** Unsigned bounded value type */
+typedef struct OMX_BU32 {
+ OMX_U32 nValue; /**< actual value */
+ OMX_U32 nMin; /**< minimum for value (i.e. nValue >= nMin) */
+ OMX_U32 nMax; /**< maximum for value (i.e. nValue <= nMax) */
+} OMX_BU32;
+
+
+/** Signed bounded value type */
+typedef struct OMX_BS32 {
+ OMX_S32 nValue; /**< actual value */
+ OMX_S32 nMin; /**< minimum for value (i.e. nValue >= nMin) */
+ OMX_S32 nMax; /**< maximum for value (i.e. nValue <= nMax) */
+} OMX_BS32;
+
+
+/** Structure representing some time or duration in microseconds. This structure
+ * must be interpreted as a signed 64 bit value. The quantity is signed to accommodate
+ * negative deltas and preroll scenarios. The quantity is represented in microseconds
+ * to accomodate high resolution timestamps (e.g. DVD presentation timestamps based
+ * on a 90kHz clock) and to allow more accurate and synchronized delivery (e.g.
+ * individual audio samples delivered at 192 kHz). The quantity is 64 bit to
+ * accommodate a large dynamic range (signed 32 bit values would allow only for plus
+ * or minus 35 minutes).
+ *
+ * Implementations with limited precision may convert the signed 64 bit value to
+ * a signed 32 bit value internally but risk loss of precision.
+ */
+#ifndef OMX_SKIP64BIT
+typedef OMX_S64 OMX_TICKS;
+#else
+typedef struct OMX_TICKS
+{
+ OMX_U32 nLowPart; /** low bits of the signed 64 bit tick value */
+ OMX_U32 nHighPart; /** high bits of the signed 64 bit tick value */
+} OMX_TICKS;
+#endif
+#define OMX_TICKS_PER_SECOND 1000000
+
+/** Define the public interface for the OMX Handle. The core will not use
+ this value internally, but the application should only use this value.
+ */
+typedef void* OMX_HANDLETYPE;
+
+typedef struct OMX_MARKTYPE
+{
+ OMX_HANDLETYPE hMarkTargetComponent; /**< The component that will
+ generate a mark event upon
+ processing the mark. */
+ OMX_PTR pMarkData; /**< Application specific data associated with
+ the mark sent on a mark event to disambiguate
+ this mark from others. */
+} OMX_MARKTYPE;
+
+
+/** OMX_NATIVE_DEVICETYPE is used to map a OMX video port to the
+ * platform & operating specific object used to reference the display
+ * or can be used by a audio port for native audio rendering */
+typedef void* OMX_NATIVE_DEVICETYPE;
+
+/** OMX_NATIVE_WINDOWTYPE is used to map a OMX video port to the
+ * platform & operating specific object used to reference the window */
+typedef void* OMX_NATIVE_WINDOWTYPE;
+
+/** The OMX_VERSIONTYPE union is used to specify the version for
+ a structure or component. For a component, the version is entirely
+ specified by the component vendor. Components doing the same function
+ from different vendors may or may not have the same version. For
+ structures, the version shall be set by the entity that allocates the
+ structure. For structures specified in the OMX 1.1 specification, the
+ value of the version shall be set to 1.1.0.0 in all cases. Access to the
+ OMX_VERSIONTYPE can be by a single 32 bit access (e.g. by nVersion) or
+ by accessing one of the structure elements to, for example, check only
+ the Major revision.
+ */
+typedef union OMX_VERSIONTYPE
+{
+ struct
+ {
+ OMX_U8 nVersionMajor; /**< Major version accessor element */
+ OMX_U8 nVersionMinor; /**< Minor version accessor element */
+ OMX_U8 nRevision; /**< Revision version accessor element */
+ OMX_U8 nStep; /**< Step version accessor element */
+ } s;
+ OMX_U32 nVersion; /**< 32 bit value to make accessing the
+ version easily done in a single word
+ size copy/compare operation */
+} OMX_VERSIONTYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/mm-core/inc/OMX_Video.h b/mm-core/inc/OMX_Video.h
new file mode 100755
index 00000000..1fc334be
--- /dev/null
+++ b/mm-core/inc/OMX_Video.h
@@ -0,0 +1,1061 @@
+/**
+ * Copyright (c) 2008 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/**
+ * @file OMX_Video.h - OpenMax IL version 1.1.2
+ * The structures is needed by Video components to exchange parameters
+ * and configuration data with OMX components.
+ */
+#ifndef OMX_Video_h
+#define OMX_Video_h
+
+/** @defgroup video OpenMAX IL Video Domain
+ * @ingroup iv
+ * Structures for OpenMAX IL Video domain
+ * @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/**
+ * Each OMX header must include all required header files to allow the
+ * header to compile without errors. The includes below are required
+ * for this header file to compile successfully
+ */
+
+#include <OMX_IVCommon.h>
+
+
+/**
+ * Enumeration used to define the possible video compression codings.
+ * NOTE: This essentially refers to file extensions. If the coding is
+ * being used to specify the ENCODE type, then additional work
+ * must be done to configure the exact flavor of the compression
+ * to be used. For decode cases where the user application can
+ * not differentiate between MPEG-4 and H.264 bit streams, it is
+ * up to the codec to handle this.
+ */
+typedef enum OMX_VIDEO_CODINGTYPE {
+ OMX_VIDEO_CodingUnused, /**< Value when coding is N/A */
+ OMX_VIDEO_CodingAutoDetect, /**< Autodetection of coding type */
+ OMX_VIDEO_CodingMPEG2, /**< AKA: H.262 */
+ OMX_VIDEO_CodingH263, /**< H.263 */
+ OMX_VIDEO_CodingMPEG4, /**< MPEG-4 */
+ OMX_VIDEO_CodingWMV, /**< all versions of Windows Media Video */
+ OMX_VIDEO_CodingRV, /**< all versions of Real Video */
+ OMX_VIDEO_CodingAVC, /**< H.264/AVC */
+ OMX_VIDEO_CodingMJPEG, /**< Motion JPEG */
+ OMX_VIDEO_CodingVPX, /**< Google VPX, formerly known as On2 VP8 */
+ OMX_VIDEO_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_CodingMax = 0x7FFFFFFF
+} OMX_VIDEO_CODINGTYPE;
+
+
+/**
+ * Data structure used to define a video path. The number of Video paths for
+ * input and output will vary by type of the Video component.
+ *
+ * Input (aka Source) : zero Inputs, one Output,
+ * Splitter : one Input, 2 or more Outputs,
+ * Processing Element : one Input, one output,
+ * Mixer : 2 or more inputs, one output,
+ * Output (aka Sink) : one Input, zero outputs.
+ *
+ * The PortDefinition structure is used to define all of the parameters
+ * necessary for the compliant component to setup an input or an output video
+ * path. If additional vendor specific data is required, it should be
+ * transmitted to the component using the CustomCommand function. Compliant
+ * components will prepopulate this structure with optimal values during the
+ * GetDefaultInitParams command.
+ *
+ * STRUCT MEMBERS:
+ * cMIMEType : MIME type of data for the port
+ * pNativeRender : Platform specific reference for a display if a
+ * sync, otherwise this field is 0
+ * nFrameWidth : Width of frame to be used on channel if
+ * uncompressed format is used. Use 0 for unknown,
+ * don't care or variable
+ * nFrameHeight : Height of frame to be used on channel if
+ * uncompressed format is used. Use 0 for unknown,
+ * don't care or variable
+ * nStride : Number of bytes per span of an image
+ * (i.e. indicates the number of bytes to get
+ * from span N to span N+1, where negative stride
+ * indicates the image is bottom up
+ * nSliceHeight : Height used when encoding in slices
+ * nBitrate : Bit rate of frame to be used on channel if
+ * compressed format is used. Use 0 for unknown,
+ * don't care or variable
+ * xFramerate : Frame rate to be used on channel if uncompressed
+ * format is used. Use 0 for unknown, don't care or
+ * variable. Units are Q16 frames per second.
+ * bFlagErrorConcealment : Turns on error concealment if it is supported by
+ * the OMX component
+ * eCompressionFormat : Compression format used in this instance of the
+ * component. When OMX_VIDEO_CodingUnused is
+ * specified, eColorFormat is used
+ * eColorFormat : Decompressed format used by this component
+ * pNativeWindow : Platform specific reference for a window object if a
+ * display sink , otherwise this field is 0x0.
+ */
+typedef struct OMX_VIDEO_PORTDEFINITIONTYPE {
+ OMX_STRING cMIMEType;
+ OMX_NATIVE_DEVICETYPE pNativeRender;
+ OMX_U32 nFrameWidth;
+ OMX_U32 nFrameHeight;
+ OMX_S32 nStride;
+ OMX_U32 nSliceHeight;
+ OMX_U32 nBitrate;
+ OMX_U32 xFramerate;
+ OMX_BOOL bFlagErrorConcealment;
+ OMX_VIDEO_CODINGTYPE eCompressionFormat;
+ OMX_COLOR_FORMATTYPE eColorFormat;
+ OMX_NATIVE_WINDOWTYPE pNativeWindow;
+} OMX_VIDEO_PORTDEFINITIONTYPE;
+
+/**
+ * Port format parameter. This structure is used to enumerate the various
+ * data input/output format supported by the port.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Indicates which port to set
+ * nIndex : Indicates the enumeration index for the format from
+ * 0x0 to N-1
+ * eCompressionFormat : Compression format used in this instance of the
+ * component. When OMX_VIDEO_CodingUnused is specified,
+ * eColorFormat is used
+ * eColorFormat : Decompressed format used by this component
+ * xFrameRate : Indicates the video frame rate in Q16 format
+ */
+typedef struct OMX_VIDEO_PARAM_PORTFORMATTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nIndex;
+ OMX_VIDEO_CODINGTYPE eCompressionFormat;
+ OMX_COLOR_FORMATTYPE eColorFormat;
+ OMX_U32 xFramerate;
+} OMX_VIDEO_PARAM_PORTFORMATTYPE;
+
+
+/**
+ * This is a structure for configuring video compression quantization
+ * parameter values. Codecs may support different QP values for different
+ * frame types.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * nQpI : QP value to use for index frames
+ * nQpP : QP value to use for P frames
+ * nQpB : QP values to use for bidirectional frames
+ */
+typedef struct OMX_VIDEO_PARAM_QUANTIZATIONTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nQpI;
+ OMX_U32 nQpP;
+ OMX_U32 nQpB;
+} OMX_VIDEO_PARAM_QUANTIZATIONTYPE;
+
+
+/**
+ * Structure for configuration of video fast update parameters.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * bEnableVFU : Enable/Disable video fast update
+ * nFirstGOB : Specifies the number of the first macroblock row
+ * nFirstMB : specifies the first MB relative to the specified first GOB
+ * nNumMBs : Specifies the number of MBs to be refreshed from nFirstGOB
+ * and nFirstMB
+ */
+typedef struct OMX_VIDEO_PARAM_VIDEOFASTUPDATETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bEnableVFU;
+ OMX_U32 nFirstGOB;
+ OMX_U32 nFirstMB;
+ OMX_U32 nNumMBs;
+} OMX_VIDEO_PARAM_VIDEOFASTUPDATETYPE;
+
+
+/**
+ * Enumeration of possible bitrate control types
+ */
+typedef enum OMX_VIDEO_CONTROLRATETYPE {
+ OMX_Video_ControlRateDisable,
+ OMX_Video_ControlRateVariable,
+ OMX_Video_ControlRateConstant,
+ OMX_Video_ControlRateVariableSkipFrames,
+ OMX_Video_ControlRateConstantSkipFrames,
+ OMX_Video_ControlRateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_Video_ControlRateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_Video_ControlRateMax = 0x7FFFFFFF
+} OMX_VIDEO_CONTROLRATETYPE;
+
+
+/**
+ * Structure for configuring bitrate mode of a codec.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the struct in bytes
+ * nVersion : OMX spec version info
+ * nPortIndex : Port that this struct applies to
+ * eControlRate : Control rate type enum
+ * nTargetBitrate : Target bitrate to encode with
+ */
+typedef struct OMX_VIDEO_PARAM_BITRATETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_VIDEO_CONTROLRATETYPE eControlRate;
+ OMX_U32 nTargetBitrate;
+} OMX_VIDEO_PARAM_BITRATETYPE;
+
+
+/**
+ * Enumeration of possible motion vector (MV) types
+ */
+typedef enum OMX_VIDEO_MOTIONVECTORTYPE {
+ OMX_Video_MotionVectorPixel,
+ OMX_Video_MotionVectorHalfPel,
+ OMX_Video_MotionVectorQuarterPel,
+ OMX_Video_MotionVectorEighthPel,
+ OMX_Video_MotionVectorKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_Video_MotionVectorVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_Video_MotionVectorMax = 0x7FFFFFFF
+} OMX_VIDEO_MOTIONVECTORTYPE;
+
+
+/**
+ * Structure for configuring the number of motion vectors used as well
+ * as their accuracy.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the struct in bytes
+ * nVersion : OMX spec version info
+ * nPortIndex : port that this structure applies to
+ * eAccuracy : Enumerated MV accuracy
+ * bUnrestrictedMVs : Allow unrestricted MVs
+ * bFourMV : Allow use of 4 MVs
+ * sXSearchRange : Search range in horizontal direction for MVs
+ * sYSearchRange : Search range in vertical direction for MVs
+ */
+typedef struct OMX_VIDEO_PARAM_MOTIONVECTORTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_VIDEO_MOTIONVECTORTYPE eAccuracy;
+ OMX_BOOL bUnrestrictedMVs;
+ OMX_BOOL bFourMV;
+ OMX_S32 sXSearchRange;
+ OMX_S32 sYSearchRange;
+} OMX_VIDEO_PARAM_MOTIONVECTORTYPE;
+
+
+/**
+ * Enumeration of possible methods to use for Intra Refresh
+ */
+typedef enum OMX_VIDEO_INTRAREFRESHTYPE {
+ OMX_VIDEO_IntraRefreshCyclic,
+ OMX_VIDEO_IntraRefreshAdaptive,
+ OMX_VIDEO_IntraRefreshBoth,
+ OMX_VIDEO_IntraRefreshKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_IntraRefreshVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_IntraRefreshMax = 0x7FFFFFFF
+} OMX_VIDEO_INTRAREFRESHTYPE;
+
+
+/**
+ * Structure for configuring intra refresh mode
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eRefreshMode : Cyclic, Adaptive, or Both
+ * nAirMBs : Number of intra macroblocks to refresh in a frame when
+ * AIR is enabled
+ * nAirRef : Number of times a motion marked macroblock has to be
+ * intra coded
+ * nCirMBs : Number of consecutive macroblocks to be coded as "intra"
+ * when CIR is enabled
+ */
+typedef struct OMX_VIDEO_PARAM_INTRAREFRESHTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_VIDEO_INTRAREFRESHTYPE eRefreshMode;
+ OMX_U32 nAirMBs;
+ OMX_U32 nAirRef;
+ OMX_U32 nCirMBs;
+} OMX_VIDEO_PARAM_INTRAREFRESHTYPE;
+
+
+/**
+ * Structure for enabling various error correction methods for video
+ * compression.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * bEnableHEC : Enable/disable header extension codes (HEC)
+ * bEnableResync : Enable/disable resynchronization markers
+ * nResynchMarkerSpacing : Resynch markers interval (in bits) to be
+ * applied in the stream
+ * bEnableDataPartitioning : Enable/disable data partitioning
+ * bEnableRVLC : Enable/disable reversible variable length
+ * coding
+ */
+typedef struct OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bEnableHEC;
+ OMX_BOOL bEnableResync;
+ OMX_U32 nResynchMarkerSpacing;
+ OMX_BOOL bEnableDataPartitioning;
+ OMX_BOOL bEnableRVLC;
+} OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE;
+
+
+/**
+ * Configuration of variable block-size motion compensation (VBSMC)
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * b16x16 : Enable inter block search 16x16
+ * b16x8 : Enable inter block search 16x8
+ * b8x16 : Enable inter block search 8x16
+ * b8x8 : Enable inter block search 8x8
+ * b8x4 : Enable inter block search 8x4
+ * b4x8 : Enable inter block search 4x8
+ * b4x4 : Enable inter block search 4x4
+ */
+typedef struct OMX_VIDEO_PARAM_VBSMCTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL b16x16;
+ OMX_BOOL b16x8;
+ OMX_BOOL b8x16;
+ OMX_BOOL b8x8;
+ OMX_BOOL b8x4;
+ OMX_BOOL b4x8;
+ OMX_BOOL b4x4;
+} OMX_VIDEO_PARAM_VBSMCTYPE;
+
+
+/**
+ * H.263 profile types, each profile indicates support for various
+ * performance bounds and different annexes.
+ *
+ * ENUMS:
+ * Baseline : Baseline Profile: H.263 (V1), no optional modes
+ * H320 Coding : H.320 Coding Efficiency Backward Compatibility
+ * Profile: H.263+ (V2), includes annexes I, J, L.4
+ * and T
+ * BackwardCompatible : Backward Compatibility Profile: H.263 (V1),
+ * includes annex F
+ * ISWV2 : Interactive Streaming Wireless Profile: H.263+
+ * (V2), includes annexes I, J, K and T
+ * ISWV3 : Interactive Streaming Wireless Profile: H.263++
+ * (V3), includes profile 3 and annexes V and W.6.3.8
+ * HighCompression : Conversational High Compression Profile: H.263++
+ * (V3), includes profiles 1 & 2 and annexes D and U
+ * Internet : Conversational Internet Profile: H.263++ (V3),
+ * includes profile 5 and annex K
+ * Interlace : Conversational Interlace Profile: H.263++ (V3),
+ * includes profile 5 and annex W.6.3.11
+ * HighLatency : High Latency Profile: H.263++ (V3), includes
+ * profile 6 and annexes O.1 and P.5
+ */
+typedef enum OMX_VIDEO_H263PROFILETYPE {
+ OMX_VIDEO_H263ProfileBaseline = 0x01,
+ OMX_VIDEO_H263ProfileH320Coding = 0x02,
+ OMX_VIDEO_H263ProfileBackwardCompatible = 0x04,
+ OMX_VIDEO_H263ProfileISWV2 = 0x08,
+ OMX_VIDEO_H263ProfileISWV3 = 0x10,
+ OMX_VIDEO_H263ProfileHighCompression = 0x20,
+ OMX_VIDEO_H263ProfileInternet = 0x40,
+ OMX_VIDEO_H263ProfileInterlace = 0x80,
+ OMX_VIDEO_H263ProfileHighLatency = 0x100,
+ OMX_VIDEO_H263ProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_H263ProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_H263ProfileMax = 0x7FFFFFFF
+} OMX_VIDEO_H263PROFILETYPE;
+
+
+/**
+ * H.263 level types, each level indicates support for various frame sizes,
+ * bit rates, decoder frame rates.
+ */
+typedef enum OMX_VIDEO_H263LEVELTYPE {
+ OMX_VIDEO_H263Level10 = 0x01,
+ OMX_VIDEO_H263Level20 = 0x02,
+ OMX_VIDEO_H263Level30 = 0x04,
+ OMX_VIDEO_H263Level40 = 0x08,
+ OMX_VIDEO_H263Level45 = 0x10,
+ OMX_VIDEO_H263Level50 = 0x20,
+ OMX_VIDEO_H263Level60 = 0x40,
+ OMX_VIDEO_H263Level70 = 0x80,
+ OMX_VIDEO_H263LevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_H263LevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_H263LevelMax = 0x7FFFFFFF
+} OMX_VIDEO_H263LEVELTYPE;
+
+
+/**
+ * Specifies the picture type. These values should be OR'd to signal all
+ * pictures types which are allowed.
+ *
+ * ENUMS:
+ * Generic Picture Types: I, P and B
+ * H.263 Specific Picture Types: SI and SP
+ * H.264 Specific Picture Types: EI and EP
+ * MPEG-4 Specific Picture Types: S
+ */
+typedef enum OMX_VIDEO_PICTURETYPE {
+ OMX_VIDEO_PictureTypeI = 0x01,
+ OMX_VIDEO_PictureTypeP = 0x02,
+ OMX_VIDEO_PictureTypeB = 0x04,
+ OMX_VIDEO_PictureTypeSI = 0x08,
+ OMX_VIDEO_PictureTypeSP = 0x10,
+ OMX_VIDEO_PictureTypeEI = 0x11,
+ OMX_VIDEO_PictureTypeEP = 0x12,
+ OMX_VIDEO_PictureTypeS = 0x14,
+ OMX_VIDEO_PictureTypeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_PictureTypeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_PictureTypeMax = 0x7FFFFFFF
+} OMX_VIDEO_PICTURETYPE;
+
+
+/**
+ * H.263 Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nPFrames : Number of P frames between each I frame
+ * nBFrames : Number of B frames between each I frame
+ * eProfile : H.263 profile(s) to use
+ * eLevel : H.263 level(s) to use
+ * bPLUSPTYPEAllowed : Indicating that it is allowed to use PLUSPTYPE
+ * (specified in the 1998 version of H.263) to
+ * indicate custom picture sizes or clock
+ * frequencies
+ * nAllowedPictureTypes : Specifies the picture types allowed in the
+ * bitstream
+ * bForceRoundingTypeToZero : value of the RTYPE bit (bit 6 of MPPTYPE) is
+ * not constrained. It is recommended to change
+ * the value of the RTYPE bit for each reference
+ * picture in error-free communication
+ * nPictureHeaderRepetition : Specifies the frequency of picture header
+ * repetition
+ * nGOBHeaderInterval : Specifies the interval of non-empty GOB
+ * headers in units of GOBs
+ */
+typedef struct OMX_VIDEO_PARAM_H263TYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nPFrames;
+ OMX_U32 nBFrames;
+ OMX_VIDEO_H263PROFILETYPE eProfile;
+ OMX_VIDEO_H263LEVELTYPE eLevel;
+ OMX_BOOL bPLUSPTYPEAllowed;
+ OMX_U32 nAllowedPictureTypes;
+ OMX_BOOL bForceRoundingTypeToZero;
+ OMX_U32 nPictureHeaderRepetition;
+ OMX_U32 nGOBHeaderInterval;
+} OMX_VIDEO_PARAM_H263TYPE;
+
+
+/**
+ * MPEG-2 profile types, each profile indicates support for various
+ * performance bounds and different annexes.
+ */
+typedef enum OMX_VIDEO_MPEG2PROFILETYPE {
+ OMX_VIDEO_MPEG2ProfileSimple = 0, /**< Simple Profile */
+ OMX_VIDEO_MPEG2ProfileMain, /**< Main Profile */
+ OMX_VIDEO_MPEG2Profile422, /**< 4:2:2 Profile */
+ OMX_VIDEO_MPEG2ProfileSNR, /**< SNR Profile */
+ OMX_VIDEO_MPEG2ProfileSpatial, /**< Spatial Profile */
+ OMX_VIDEO_MPEG2ProfileHigh, /**< High Profile */
+ OMX_VIDEO_MPEG2ProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_MPEG2ProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_MPEG2ProfileMax = 0x7FFFFFFF
+} OMX_VIDEO_MPEG2PROFILETYPE;
+
+
+/**
+ * MPEG-2 level types, each level indicates support for various frame
+ * sizes, bit rates, decoder frame rates. No need
+ */
+typedef enum OMX_VIDEO_MPEG2LEVELTYPE {
+ OMX_VIDEO_MPEG2LevelLL = 0, /**< Low Level */
+ OMX_VIDEO_MPEG2LevelML, /**< Main Level */
+ OMX_VIDEO_MPEG2LevelH14, /**< High 1440 */
+ OMX_VIDEO_MPEG2LevelHL, /**< High Level */
+ OMX_VIDEO_MPEG2LevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_MPEG2LevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_MPEG2LevelMax = 0x7FFFFFFF
+} OMX_VIDEO_MPEG2LEVELTYPE;
+
+
+/**
+ * MPEG-2 params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nPFrames : Number of P frames between each I frame
+ * nBFrames : Number of B frames between each I frame
+ * eProfile : MPEG-2 profile(s) to use
+ * eLevel : MPEG-2 levels(s) to use
+ */
+typedef struct OMX_VIDEO_PARAM_MPEG2TYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nPFrames;
+ OMX_U32 nBFrames;
+ OMX_VIDEO_MPEG2PROFILETYPE eProfile;
+ OMX_VIDEO_MPEG2LEVELTYPE eLevel;
+} OMX_VIDEO_PARAM_MPEG2TYPE;
+
+
+/**
+ * MPEG-4 profile types, each profile indicates support for various
+ * performance bounds and different annexes.
+ *
+ * ENUMS:
+ * - Simple Profile, Levels 1-3
+ * - Simple Scalable Profile, Levels 1-2
+ * - Core Profile, Levels 1-2
+ * - Main Profile, Levels 2-4
+ * - N-bit Profile, Level 2
+ * - Scalable Texture Profile, Level 1
+ * - Simple Face Animation Profile, Levels 1-2
+ * - Simple Face and Body Animation (FBA) Profile, Levels 1-2
+ * - Basic Animated Texture Profile, Levels 1-2
+ * - Hybrid Profile, Levels 1-2
+ * - Advanced Real Time Simple Profiles, Levels 1-4
+ * - Core Scalable Profile, Levels 1-3
+ * - Advanced Coding Efficiency Profile, Levels 1-4
+ * - Advanced Core Profile, Levels 1-2
+ * - Advanced Scalable Texture, Levels 2-3
+ */
+typedef enum OMX_VIDEO_MPEG4PROFILETYPE {
+ OMX_VIDEO_MPEG4ProfileSimple = 0x01,
+ OMX_VIDEO_MPEG4ProfileSimpleScalable = 0x02,
+ OMX_VIDEO_MPEG4ProfileCore = 0x04,
+ OMX_VIDEO_MPEG4ProfileMain = 0x08,
+ OMX_VIDEO_MPEG4ProfileNbit = 0x10,
+ OMX_VIDEO_MPEG4ProfileScalableTexture = 0x20,
+ OMX_VIDEO_MPEG4ProfileSimpleFace = 0x40,
+ OMX_VIDEO_MPEG4ProfileSimpleFBA = 0x80,
+ OMX_VIDEO_MPEG4ProfileBasicAnimated = 0x100,
+ OMX_VIDEO_MPEG4ProfileHybrid = 0x200,
+ OMX_VIDEO_MPEG4ProfileAdvancedRealTime = 0x400,
+ OMX_VIDEO_MPEG4ProfileCoreScalable = 0x800,
+ OMX_VIDEO_MPEG4ProfileAdvancedCoding = 0x1000,
+ OMX_VIDEO_MPEG4ProfileAdvancedCore = 0x2000,
+ OMX_VIDEO_MPEG4ProfileAdvancedScalable = 0x4000,
+ OMX_VIDEO_MPEG4ProfileAdvancedSimple = 0x8000,
+ OMX_VIDEO_MPEG4ProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_MPEG4ProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_MPEG4ProfileMax = 0x7FFFFFFF
+} OMX_VIDEO_MPEG4PROFILETYPE;
+
+
+/**
+ * MPEG-4 level types, each level indicates support for various frame
+ * sizes, bit rates, decoder frame rates. No need
+ */
+typedef enum OMX_VIDEO_MPEG4LEVELTYPE {
+ OMX_VIDEO_MPEG4Level0 = 0x01, /**< Level 0 */
+ OMX_VIDEO_MPEG4Level0b = 0x02, /**< Level 0b */
+ OMX_VIDEO_MPEG4Level1 = 0x04, /**< Level 1 */
+ OMX_VIDEO_MPEG4Level2 = 0x08, /**< Level 2 */
+ OMX_VIDEO_MPEG4Level3 = 0x10, /**< Level 3 */
+ OMX_VIDEO_MPEG4Level4 = 0x20, /**< Level 4 */
+ OMX_VIDEO_MPEG4Level4a = 0x40, /**< Level 4a */
+ OMX_VIDEO_MPEG4Level5 = 0x80, /**< Level 5 */
+ OMX_VIDEO_MPEG4LevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_MPEG4LevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_MPEG4LevelMax = 0x7FFFFFFF
+} OMX_VIDEO_MPEG4LEVELTYPE;
+
+
+/**
+ * MPEG-4 configuration. This structure handles configuration options
+ * which are specific to MPEG4 algorithms
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nSliceHeaderSpacing : Number of macroblocks between slice header (H263+
+ * Annex K). Put zero if not used
+ * bSVH : Enable Short Video Header mode
+ * bGov : Flag to enable GOV
+ * nPFrames : Number of P frames between each I frame (also called
+ * GOV period)
+ * nBFrames : Number of B frames between each I frame
+ * nIDCVLCThreshold : Value of intra DC VLC threshold
+ * bACPred : Flag to use ac prediction
+ * nMaxPacketSize : Maximum size of packet in bytes.
+ * nTimeIncRes : Used to pass VOP time increment resolution for MPEG4.
+ * Interpreted as described in MPEG4 standard.
+ * eProfile : MPEG-4 profile(s) to use.
+ * eLevel : MPEG-4 level(s) to use.
+ * nAllowedPictureTypes : Specifies the picture types allowed in the bitstream
+ * nHeaderExtension : Specifies the number of consecutive video packet
+ * headers within a VOP
+ * bReversibleVLC : Specifies whether reversible variable length coding
+ * is in use
+ */
+typedef struct OMX_VIDEO_PARAM_MPEG4TYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nSliceHeaderSpacing;
+ OMX_BOOL bSVH;
+ OMX_BOOL bGov;
+ OMX_U32 nPFrames;
+ OMX_U32 nBFrames;
+ OMX_U32 nIDCVLCThreshold;
+ OMX_BOOL bACPred;
+ OMX_U32 nMaxPacketSize;
+ OMX_U32 nTimeIncRes;
+ OMX_VIDEO_MPEG4PROFILETYPE eProfile;
+ OMX_VIDEO_MPEG4LEVELTYPE eLevel;
+ OMX_U32 nAllowedPictureTypes;
+ OMX_U32 nHeaderExtension;
+ OMX_BOOL bReversibleVLC;
+} OMX_VIDEO_PARAM_MPEG4TYPE;
+
+
+/**
+ * WMV Versions
+ */
+typedef enum OMX_VIDEO_WMVFORMATTYPE {
+ OMX_VIDEO_WMVFormatUnused = 0x01, /**< Format unused or unknown */
+ OMX_VIDEO_WMVFormat7 = 0x02, /**< Windows Media Video format 7 */
+ OMX_VIDEO_WMVFormat8 = 0x04, /**< Windows Media Video format 8 */
+ OMX_VIDEO_WMVFormat9 = 0x08, /**< Windows Media Video format 9 */
+ OMX_VIDEO_WMFFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_WMFFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_WMVFormatMax = 0x7FFFFFFF
+} OMX_VIDEO_WMVFORMATTYPE;
+
+
+/**
+ * WMV Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFormat : Version of WMV stream / data
+ */
+typedef struct OMX_VIDEO_PARAM_WMVTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_VIDEO_WMVFORMATTYPE eFormat;
+} OMX_VIDEO_PARAM_WMVTYPE;
+
+
+/**
+ * Real Video Version
+ */
+typedef enum OMX_VIDEO_RVFORMATTYPE {
+ OMX_VIDEO_RVFormatUnused = 0, /**< Format unused or unknown */
+ OMX_VIDEO_RVFormat8, /**< Real Video format 8 */
+ OMX_VIDEO_RVFormat9, /**< Real Video format 9 */
+ OMX_VIDEO_RVFormatG2, /**< Real Video Format G2 */
+ OMX_VIDEO_RVFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_RVFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_RVFormatMax = 0x7FFFFFFF
+} OMX_VIDEO_RVFORMATTYPE;
+
+
+/**
+ * Real Video Params
+ *
+ * STUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFormat : Version of RV stream / data
+ * nBitsPerPixel : Bits per pixel coded in the frame
+ * nPaddedWidth : Padded width in pixel of a video frame
+ * nPaddedHeight : Padded Height in pixels of a video frame
+ * nFrameRate : Rate of video in frames per second
+ * nBitstreamFlags : Flags which internal information about the bitstream
+ * nBitstreamVersion : Bitstream version
+ * nMaxEncodeFrameSize: Max encoded frame size
+ * bEnablePostFilter : Turn on/off post filter
+ * bEnableTemporalInterpolation : Turn on/off temporal interpolation
+ * bEnableLatencyMode : When enabled, the decoder does not display a decoded
+ * frame until it has detected that no enhancement layer
+ * frames or dependent B frames will be coming. This
+ * detection usually occurs when a subsequent non-B
+ * frame is encountered
+ */
+typedef struct OMX_VIDEO_PARAM_RVTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_VIDEO_RVFORMATTYPE eFormat;
+ OMX_U16 nBitsPerPixel;
+ OMX_U16 nPaddedWidth;
+ OMX_U16 nPaddedHeight;
+ OMX_U32 nFrameRate;
+ OMX_U32 nBitstreamFlags;
+ OMX_U32 nBitstreamVersion;
+ OMX_U32 nMaxEncodeFrameSize;
+ OMX_BOOL bEnablePostFilter;
+ OMX_BOOL bEnableTemporalInterpolation;
+ OMX_BOOL bEnableLatencyMode;
+} OMX_VIDEO_PARAM_RVTYPE;
+
+
+/**
+ * AVC profile types, each profile indicates support for various
+ * performance bounds and different annexes.
+ */
+typedef enum OMX_VIDEO_AVCPROFILETYPE {
+ OMX_VIDEO_AVCProfileBaseline = 0x01, /**< Baseline profile */
+ OMX_VIDEO_AVCProfileMain = 0x02, /**< Main profile */
+ OMX_VIDEO_AVCProfileExtended = 0x04, /**< Extended profile */
+ OMX_VIDEO_AVCProfileHigh = 0x08, /**< High profile */
+ OMX_VIDEO_AVCProfileHigh10 = 0x10, /**< High 10 profile */
+ OMX_VIDEO_AVCProfileHigh422 = 0x20, /**< High 4:2:2 profile */
+ OMX_VIDEO_AVCProfileHigh444 = 0x40, /**< High 4:4:4 profile */
+ OMX_VIDEO_AVCProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_AVCProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_AVCProfileMax = 0x7FFFFFFF
+} OMX_VIDEO_AVCPROFILETYPE;
+
+
+/**
+ * AVC level types, each level indicates support for various frame sizes,
+ * bit rates, decoder frame rates. No need
+ */
+typedef enum OMX_VIDEO_AVCLEVELTYPE {
+ OMX_VIDEO_AVCLevel1 = 0x01, /**< Level 1 */
+ OMX_VIDEO_AVCLevel1b = 0x02, /**< Level 1b */
+ OMX_VIDEO_AVCLevel11 = 0x04, /**< Level 1.1 */
+ OMX_VIDEO_AVCLevel12 = 0x08, /**< Level 1.2 */
+ OMX_VIDEO_AVCLevel13 = 0x10, /**< Level 1.3 */
+ OMX_VIDEO_AVCLevel2 = 0x20, /**< Level 2 */
+ OMX_VIDEO_AVCLevel21 = 0x40, /**< Level 2.1 */
+ OMX_VIDEO_AVCLevel22 = 0x80, /**< Level 2.2 */
+ OMX_VIDEO_AVCLevel3 = 0x100, /**< Level 3 */
+ OMX_VIDEO_AVCLevel31 = 0x200, /**< Level 3.1 */
+ OMX_VIDEO_AVCLevel32 = 0x400, /**< Level 3.2 */
+ OMX_VIDEO_AVCLevel4 = 0x800, /**< Level 4 */
+ OMX_VIDEO_AVCLevel41 = 0x1000, /**< Level 4.1 */
+ OMX_VIDEO_AVCLevel42 = 0x2000, /**< Level 4.2 */
+ OMX_VIDEO_AVCLevel5 = 0x4000, /**< Level 5 */
+ OMX_VIDEO_AVCLevel51 = 0x8000, /**< Level 5.1 */
+ OMX_VIDEO_AVCLevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_AVCLevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_AVCLevelMax = 0x7FFFFFFF
+} OMX_VIDEO_AVCLEVELTYPE;
+
+
+/**
+ * AVC loop filter modes
+ *
+ * OMX_VIDEO_AVCLoopFilterEnable : Enable
+ * OMX_VIDEO_AVCLoopFilterDisable : Disable
+ * OMX_VIDEO_AVCLoopFilterDisableSliceBoundary : Disabled on slice boundaries
+ */
+typedef enum OMX_VIDEO_AVCLOOPFILTERTYPE {
+ OMX_VIDEO_AVCLoopFilterEnable = 0,
+ OMX_VIDEO_AVCLoopFilterDisable,
+ OMX_VIDEO_AVCLoopFilterDisableSliceBoundary,
+ OMX_VIDEO_AVCLoopFilterKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_AVCLoopFilterVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_AVCLoopFilterMax = 0x7FFFFFFF
+} OMX_VIDEO_AVCLOOPFILTERTYPE;
+
+
+/**
+ * AVC params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nSliceHeaderSpacing : Number of macroblocks between slice header, put
+ * zero if not used
+ * nPFrames : Number of P frames between each I frame
+ * nBFrames : Number of B frames between each I frame
+ * bUseHadamard : Enable/disable Hadamard transform
+ * nRefFrames : Max number of reference frames to use for inter
+ * motion search (1-16)
+ * nRefIdxTrailing : Pic param set ref frame index (index into ref
+ * frame buffer of trailing frames list), B frame
+ * support
+ * nRefIdxForward : Pic param set ref frame index (index into ref
+ * frame buffer of forward frames list), B frame
+ * support
+ * bEnableUEP : Enable/disable unequal error protection. This
+ * is only valid of data partitioning is enabled.
+ * bEnableFMO : Enable/disable flexible macroblock ordering
+ * bEnableASO : Enable/disable arbitrary slice ordering
+ * bEnableRS : Enable/disable sending of redundant slices
+ * eProfile : AVC profile(s) to use
+ * eLevel : AVC level(s) to use
+ * nAllowedPictureTypes : Specifies the picture types allowed in the
+ * bitstream
+ * bFrameMBsOnly : specifies that every coded picture of the
+ * coded video sequence is a coded frame
+ * containing only frame macroblocks
+ * bMBAFF : Enable/disable switching between frame and
+ * field macroblocks within a picture
+ * bEntropyCodingCABAC : Entropy decoding method to be applied for the
+ * syntax elements for which two descriptors appear
+ * in the syntax tables
+ * bWeightedPPrediction : Enable/disable weighted prediction shall not
+ * be applied to P and SP slices
+ * nWeightedBipredicitonMode : Default weighted prediction is applied to B
+ * slices
+ * bconstIpred : Enable/disable intra prediction
+ * bDirect8x8Inference : Specifies the method used in the derivation
+ * process for luma motion vectors for B_Skip,
+ * B_Direct_16x16 and B_Direct_8x8 as specified
+ * in subclause 8.4.1.2 of the AVC spec
+ * bDirectSpatialTemporal : Flag indicating spatial or temporal direct
+ * mode used in B slice coding (related to
+ * bDirect8x8Inference) . Spatial direct mode is
+ * more common and should be the default.
+ * nCabacInitIdx : Index used to init CABAC contexts
+ * eLoopFilterMode : Enable/disable loop filter
+ */
+typedef struct OMX_VIDEO_PARAM_AVCTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nSliceHeaderSpacing;
+ OMX_U32 nPFrames;
+ OMX_U32 nBFrames;
+ OMX_BOOL bUseHadamard;
+ OMX_U32 nRefFrames;
+ OMX_U32 nRefIdx10ActiveMinus1;
+ OMX_U32 nRefIdx11ActiveMinus1;
+ OMX_BOOL bEnableUEP;
+ OMX_BOOL bEnableFMO;
+ OMX_BOOL bEnableASO;
+ OMX_BOOL bEnableRS;
+ OMX_VIDEO_AVCPROFILETYPE eProfile;
+ OMX_VIDEO_AVCLEVELTYPE eLevel;
+ OMX_U32 nAllowedPictureTypes;
+ OMX_BOOL bFrameMBsOnly;
+ OMX_BOOL bMBAFF;
+ OMX_BOOL bEntropyCodingCABAC;
+ OMX_BOOL bWeightedPPrediction;
+ OMX_U32 nWeightedBipredicitonMode;
+ OMX_BOOL bconstIpred ;
+ OMX_BOOL bDirect8x8Inference;
+ OMX_BOOL bDirectSpatialTemporal;
+ OMX_U32 nCabacInitIdc;
+ OMX_VIDEO_AVCLOOPFILTERTYPE eLoopFilterMode;
+} OMX_VIDEO_PARAM_AVCTYPE;
+
+typedef struct OMX_VIDEO_PARAM_PROFILELEVELTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 eProfile; /**< type is OMX_VIDEO_AVCPROFILETYPE, OMX_VIDEO_H263PROFILETYPE,
+ or OMX_VIDEO_MPEG4PROFILETYPE depending on context */
+ OMX_U32 eLevel; /**< type is OMX_VIDEO_AVCLEVELTYPE, OMX_VIDEO_H263LEVELTYPE,
+ or OMX_VIDEO_MPEG4PROFILETYPE depending on context */
+ OMX_U32 nProfileIndex; /**< Used to query for individual profile support information,
+ This parameter is valid only for
+ OMX_IndexParamVideoProfileLevelQuerySupported index,
+ For all other indices this parameter is to be ignored. */
+} OMX_VIDEO_PARAM_PROFILELEVELTYPE;
+
+/**
+ * Structure for dynamically configuring bitrate mode of a codec.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the struct in bytes
+ * nVersion : OMX spec version info
+ * nPortIndex : Port that this struct applies to
+ * nEncodeBitrate : Target average bitrate to be generated in bps
+ */
+typedef struct OMX_VIDEO_CONFIG_BITRATETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nEncodeBitrate;
+} OMX_VIDEO_CONFIG_BITRATETYPE;
+
+/**
+ * Defines Encoder Frame Rate setting
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * xEncodeFramerate : Encoding framerate represented in Q16 format
+ */
+typedef struct OMX_CONFIG_FRAMERATETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 xEncodeFramerate; /* Q16 format */
+} OMX_CONFIG_FRAMERATETYPE;
+
+typedef struct OMX_CONFIG_INTRAREFRESHVOPTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL IntraRefreshVOP;
+} OMX_CONFIG_INTRAREFRESHVOPTYPE;
+
+typedef struct OMX_CONFIG_MACROBLOCKERRORMAPTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nErrMapSize; /* Size of the Error Map in bytes */
+ OMX_U8 ErrMap[1]; /* Error map hint */
+} OMX_CONFIG_MACROBLOCKERRORMAPTYPE;
+
+typedef struct OMX_CONFIG_MBERRORREPORTINGTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bEnabled;
+} OMX_CONFIG_MBERRORREPORTINGTYPE;
+
+typedef struct OMX_PARAM_MACROBLOCKSTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nMacroblocks;
+} OMX_PARAM_MACROBLOCKSTYPE;
+
+/**
+ * AVC Slice Mode modes
+ *
+ * OMX_VIDEO_SLICEMODE_AVCDefault : Normal frame encoding, one slice per frame
+ * OMX_VIDEO_SLICEMODE_AVCMBSlice : NAL mode, number of MBs per frame
+ * OMX_VIDEO_SLICEMODE_AVCByteSlice : NAL mode, number of bytes per frame
+ */
+typedef enum OMX_VIDEO_AVCSLICEMODETYPE {
+ OMX_VIDEO_SLICEMODE_AVCDefault = 0,
+ OMX_VIDEO_SLICEMODE_AVCMBSlice,
+ OMX_VIDEO_SLICEMODE_AVCByteSlice,
+ OMX_VIDEO_SLICEMODE_AVCKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
+ OMX_VIDEO_SLICEMODE_AVCVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ OMX_VIDEO_SLICEMODE_AVCLevelMax = 0x7FFFFFFF
+} OMX_VIDEO_AVCSLICEMODETYPE;
+
+/**
+ * AVC FMO Slice Mode Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nNumSliceGroups : Specifies the number of slice groups
+ * nSliceGroupMapType : Specifies the type of slice groups
+ * eSliceMode : Specifies the type of slice
+ */
+typedef struct OMX_VIDEO_PARAM_AVCSLICEFMO {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U8 nNumSliceGroups;
+ OMX_U8 nSliceGroupMapType;
+ OMX_VIDEO_AVCSLICEMODETYPE eSliceMode;
+} OMX_VIDEO_PARAM_AVCSLICEFMO;
+
+/**
+ * AVC IDR Period Configs
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nIDRPeriod : Specifies periodicity of IDR frames
+ * nPFrames : Specifies internal of coding Intra frames
+ */
+typedef struct OMX_VIDEO_CONFIG_AVCINTRAPERIOD {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nIDRPeriod;
+ OMX_U32 nPFrames;
+} OMX_VIDEO_CONFIG_AVCINTRAPERIOD;
+
+/**
+ * AVC NAL Size Configs
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nNaluBytes : Specifies the NAL unit size
+ */
+typedef struct OMX_VIDEO_CONFIG_NALSIZE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nNaluBytes;
+} OMX_VIDEO_CONFIG_NALSIZE;
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
+
diff --git a/mm-core/inc/QOMX_AudioExtensions.h b/mm-core/inc/QOMX_AudioExtensions.h
new file mode 100755
index 00000000..ccc1ca38
--- /dev/null
+++ b/mm-core/inc/QOMX_AudioExtensions.h
@@ -0,0 +1,511 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, 2011, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+*//** @file QOMX_AudioExtensions.h
+ This module contains the extensions for Audio
+
+*//*========================================================================*/
+
+#ifndef __H_QOMX_AUDIOEXTENSIONS_H__
+#define __H_QOMX_AUDIOEXTENSIONS_H__
+
+/*========================================================================
+
+ INCLUDE FILES FOR MODULE
+
+========================================================================== */
+#include <OMX_Audio.h>
+
+/*========================================================================
+
+ DEFINITIONS AND DECLARATIONS
+
+========================================================================== */
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif /* end of macro __cplusplus */
+
+/* Audio extension strings */
+#define OMX_QCOM_INDEX_PARAM_AMRWBPLUS "OMX.Qualcomm.index.audio.amrwbplus"
+#define OMX_QCOM_INDEX_PARAM_WMA10PRO "OMX.Qualcomm.index.audio.wma10pro"
+#define OMX_QCOM_INDEX_PARAM_SESSIONID "OMX.Qualcomm.index.audio.sessionId"
+#define OMX_QCOM_INDEX_PARAM_VOICERECORDTYPE "OMX.Qualcomm.index.audio.VoiceRecord"
+#define OMX_QCOM_INDEX_PARAM_AC3TYPE "OMX.Qualcomm.index.audio.ac3"
+#define OMX_QCOM_INDEX_PARAM_AC3PP "OMX.Qualcomm.index.audio.ac3.postproc"
+#define OMX_QCOM_INDEX_PARAM_DAK_BUNDLE "OMX.Qualcomm.index.audio.dakbundle"
+#define OMX_QCOM_INDEX_PARAM_DAK_M2S "OMX.Qualcomm.index.audio.dak_m2s"
+#define OMX_QCOM_INDEX_PARAM_DAK_SSE "OMX.Qualcomm.index.audio.dak_sse"
+#define OMX_QCOM_INDEX_PARAM_DAK_SLC "OMX.Qualcomm.index.audio.dak_slc"
+#define OMX_QCOM_INDEX_PARAM_DAK_VOL "OMX.Qualcomm.index.audio.dak_vol"
+#define OMX_QCOM_INDEX_PARAM_DAK_NB "OMX.Qualcomm.index.audio.dak_nb"
+#define OMX_QCOM_INDEX_PARAM_DAK_GEQ "OMX.Qualcomm.index.audio.dak_geq"
+#define OMX_QCOM_INDEX_PARAM_DAK_MSR "OMX.Qualcomm.index.audio.dak_msr"
+#define OMX_QCOM_INDEX_PARAM_DAK_HFE "OMX.Qualcomm.index.audio.dak_hfe"
+#define OMX_QCOM_INDEX_PARAM_DAK_FADE "OMX.Qualcomm.index.audio.dak_fade"
+#define OMX_QCOM_INDEX_PARAM_DAK_SEQ "OMX.Qualcomm.index.audio.dak_seq"
+#define OMX_QCOM_INDEX_CONFIG_DUALMONO "OMX.Qualcomm.index.audio.dualmono"
+
+typedef enum QOMX_AUDIO_AMRBANDMODETYPE {
+ QOMX_AUDIO_AMRBandModeWB9 = 0x7F000001,/**< AMRWB Mode 9 = SID*/
+ QOMX_AUDIO_AMRBandModeWB10 = 0x7F000002,/**< AMRWB Mode 10 = 13600 bps */
+ QOMX_AUDIO_AMRBandModeWB11 = 0x7F000003,/**< AMRWB Mode 11 = 18000 bps */
+ QOMX_AUDIO_AMRBandModeWB12 = 0x7F000004,/**< AMRWB Mode 12 = 24000 bps */
+ QOMX_AUDIO_AMRBandModeWB13 = 0x7F000005,/**< AMRWB Mode 13 = 24000 bps */
+ QOMX_AUDIO_AMRBandModeWB14 = 0x7F000006,/**< AMRWB Mode 14 = FRAME_ERASE*/
+ QOMX_AUDIO_AMRBandModeWB15 = 0x7F000007,/**< AMRWB Mode 15 = NO_DATA */
+}QOMX_AUDIO_AMRBANDMODETYPE;
+
+typedef enum QOMX_AUDIO_CODINGTYPE {
+ QOMX_AUDIO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+ QOMX_AUDIO_CodingEVRCB = 0x7F000001,
+ QOMX_AUDIO_CodingEVRCWB = 0x7F000002,
+ QOMX_AUDIO_CodingFLAC = 0x7F000003,
+ QOMX_AUDIO_CodingMax = 0x7FFFFFFF
+}QOMX_AUDIO_CODINGTYPE;
+
+
+/**
+ * AMR WB PLUS type
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nChannels : Number of channels
+ * nBitRate : Bit rate read only field
+ * nSampleRate : Sampling frequency for the clip(16/24/32/48KHz)
+ * eAMRBandMode : AMR Band Mode enumeration
+ * eAMRDTXMode : AMR DTX Mode enumeration
+ * eAMRFrameFormat : AMR frame format enumeration
+ */
+
+typedef struct QOMX_AUDIO_PARAM_AMRWBPLUSTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nChannels;
+ OMX_U32 nBitRate;
+ OMX_U32 nSampleRate;
+ OMX_AUDIO_AMRBANDMODETYPE eAMRBandMode;
+ OMX_AUDIO_AMRDTXMODETYPE eAMRDTXMode;
+ OMX_AUDIO_AMRFRAMEFORMATTYPE eAMRFrameFormat;
+} QOMX_AUDIO_PARAM_AMRWBPLUSTYPE;
+
+typedef enum QOMX_AUDIO_WMAFORMATTYPE {
+ QOMX_AUDIO_WMAFormat10Pro = 0x7F000001, /**< Windows Media Audio format 10*/
+} QOMX_AUDIO_WMAFORMATTYPE;
+
+/**
+ * WMA 10 PRO type
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nChannels : Number of channels
+ * nBitRate : Bit rate read only field
+ * eFormat : Version of WMA stream / data
+ * eProfile : Profile of WMA stream / data
+ * nSamplingRate : Sampling rate of the source data
+ * nBlockAlign : block alignment, or block size, in bytes of the audio codec
+ * nEncodeOptions : WMA Type-specific data
+ * nSuperBlockAlign : WMA Type-specific data
+ * validBitsPerSample : encoded stream (24-bit or 16-bit)
+ * formatTag : codec ID(0x162 or 0x166)
+ * advancedEncodeOpt : bit packed words indicating the features supported for LBR bitstream
+ * advancedEncodeOpt2 : bit packed words indicating the features supported for LBR bitstream
+ */
+typedef struct QOMX_AUDIO_PARAM_WMA10PROTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U16 nChannels;
+ OMX_U32 nBitRate;
+ QOMX_AUDIO_WMAFORMATTYPE eFormat;
+ OMX_AUDIO_WMAPROFILETYPE eProfile;
+ OMX_U32 nSamplingRate;
+ OMX_U16 nBlockAlign;
+ OMX_U16 nEncodeOptions;
+ OMX_U32 nSuperBlockAlign;
+ OMX_U32 validBitsPerSample;
+ OMX_U32 formatTag;
+ OMX_U32 advancedEncodeOpt;
+ OMX_U32 advancedEncodeOpt2;
+ OMX_U16 nVirtualPktSize;
+} QOMX_AUDIO_PARAM_WMA10PROTYPE;
+
+
+typedef enum OMX_AUDIO_AC3FORMATTYPE {
+ omx_audio_ac3 = 0x7f000001, /**< ac-3 */
+ omx_audio_eac3 = 0x7f000002 /**< eac-3 */
+} OMX_AUDIO_AC3FORMATTYPE;
+
+typedef enum OMX_AUDIO_AC3_CHANNEL_CONFIG
+{
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_RSVD = 0,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_1_0,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_2_0,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_3_0,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_2_1,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_3_1,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_2_2,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_3_2,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_3_0_1,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_2_2_1,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_3_2_1,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_3_0_2,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_2_2_2,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_3_2_2,
+ OMX_AUDIO_AC3_CHANNEL_CONFIG_DEFAULT = 0xFFFF
+} OMX_AUDIO_AC3_CHANNEL_CONFIG;
+
+/**
+ * AC-3 type
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nChannels : Number of channels
+ * nBitRate : Bitrate
+ * nSamplingRate : Sampling rate, 32K, 44.1K, 48K only supported
+ * eFormat : AC-3 or EAC-3
+ * eChannelConfig : Channel configuration
+ * nProgramID : Indication of ProgramID, 0-7
+ * bCompressionOn : Flag to enable Compression
+ * bLfeOn : Flag for LFE on/off
+ * bDelaySurroundChannels : Flag to put delay on surround channels
+ *
+ */
+typedef struct QOMX_AUDIO_PARAM_AC3TYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U16 nChannels;
+ OMX_U32 nBitRate;
+ OMX_U32 nSamplingRate;
+ OMX_AUDIO_AC3FORMATTYPE eFormat;
+ OMX_AUDIO_AC3_CHANNEL_CONFIG eChannelConfig;
+ OMX_U8 nProgramID;
+ OMX_BOOL bCompressionOn;
+ OMX_BOOL bLfeOn;
+ OMX_BOOL bDelaySurroundChannels;
+} QOMX_AUDIO_PARAM_AC3TYPE;
+
+typedef enum OMX_AUDIO_AC3_CHANNEL_ROUTING
+{
+ OMX_AUDIO_AC3_CHANNEL_LEFT,
+ OMX_AUDIO_AC3_CHANNEL_CENTER,
+ OMX_AUDIO_AC3_CHANNEL_RIGHT,
+ OMX_AUDIO_AC3_CHANNEL_LEFT_SURROUND,
+ OMX_AUDIO_AC3_CHANNEL_RIGHT_SURROUND,
+ OMX_AUDIO_AC3_CHANNEL_SURROUND,
+ OMX_AUDIO_AC3_CHANNEL_EXTENSION_1,
+ OMX_AUDIO_AC3_CHANNEL_EXTENSION_2,
+ OMX_AUDIO_AC3_CHANNEL_DEFAULT = 0xFFFF
+} OMX_AUDIO_AC3_CHANNEL_ROUTING;
+
+typedef enum OMX_AUDIO_AC3_COMPRESSION_MODE
+{
+ OMX_AUDIO_AC3_COMPRESSION_MODE_ANALOG_DIALNORM,
+ OMX_AUDIO_AC3_COMPRESSION_MODE_DIGITAL_DIALNORM,
+ OMX_AUDIO_AC3_COMPRESSION_MODE_LINE_OUT,
+ OMX_AUDIO_AC3_COMPRESSION_MODE_RF_REMOD
+} OMX_AUDIO_AC3_COMPRESSION_MODE;
+
+typedef enum OMX_AUDIO_AC3_STEREO_MODE
+{
+ OMX_AUDIO_AC3_STEREO_MODE_AUTO_DETECT,
+ OMX_AUDIO_AC3_STEREO_MODE_LT_RT,
+ OMX_AUDIO_AC3_STEREO_MODE_LO_RO,
+ OMX_AUDIO_AC3_STEREO_MODE_DEFAULT = 0xFFFF
+} OMX_AUDIO_AC3_STEREO_MODE;
+
+typedef enum OMX_AUDIO_AC3_DUAL_MONO_MODE
+{
+ OMX_AUDIO_AC3_DUAL_MONO_MODE_STEREO,
+ OMX_AUDIO_AC3_DUAL_MONO_MODE_LEFT_MONO,
+ OMX_AUDIO_AC3_DUAL_MONO_MODE_RIGHT_MONO,
+ OMX_AUDIO_AC3_DUAL_MONO_MODE_MIXED_MONO,
+ OMX_AUDIO_AC3_DUAL_MONO_MODE_DEFAULT = 0xFFFF
+} OMX_AUDIO_AC3_DUAL_MONO_MODE;
+
+typedef enum OMX_AUDIO_AC3_KARAOKE_MODE
+{
+ OMX_AUDIO_AC3_KARAOKE_MODE_NO_VOCAL,
+ OMX_AUDIO_AC3_KARAOKE_MODE_LEFT_VOCAL,
+ OMX_AUDIO_AC3_KARAOKE_MODE_RIGHT_VOCAL,
+ OMX_AUDIO_AC3_KARAOKE_MODE_BOTH_VOCAL,
+ OMX_AUDIO_AC3_KARAOKE_MODE_DEFAULT = 0xFFFF
+} OMX_AUDIO_AC3_KARAOKE_MODE;
+
+
+typedef struct QOMX_AUDIO_PARAM_AC3PP
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_AUDIO_AC3_CHANNEL_ROUTING eChannelRouting[8];
+ OMX_AUDIO_AC3_COMPRESSION_MODE eCompressionMode;
+ OMX_AUDIO_AC3_STEREO_MODE eStereoMode;
+ OMX_AUDIO_AC3_DUAL_MONO_MODE eDualMonoMode;
+ OMX_U32 usPcmScale;
+ OMX_U32 usDynamicScaleBoost;
+ OMX_U32 usDynamicScaleCut;
+ OMX_AUDIO_AC3_KARAOKE_MODE eKaraokeMode;
+} QOMX_AUDIO_PARAM_AC3PP;
+
+
+/**
+ * Stream info data
+ *
+ * STRUCT MEMBERS:
+ * sessionId : session Id for alsa to route data
+ */
+typedef struct QOMX_AUDIO_STREAM_INFO_DATA {
+ OMX_U8 sessionId;
+} QOMX_AUDIO_STREAM_INFO_DATA;
+
+
+/**
+ * Record Path
+ *
+ * STRUCT MEMBERS:
+ * recPath : Record Path for encoding
+ */
+typedef enum{
+
+QOMX_AUDIO_VOICE_TX,
+QOMX_AUDIO_VOICE_RX,
+QOMX_AUDIO_VOICE_MIXED,
+
+} QOMX_AUDIO_VOICERECORDMODETYPE;
+typedef struct QOMX_AUDIO_CONFIG_VOICERECORDTYPE {
+
+OMX_U32 nSize;
+OMX_VERSIONTYPE nVersion;
+QOMX_AUDIO_VOICERECORDMODETYPE eVoiceRecordMode;
+} QOMX_AUDIO_CONFIG_VOICERECORDTYPE;
+
+/* Enum for mapping dual-mono contents to left and right channels */
+typedef enum OMX_AUDIO_DUAL_MONO_CHANNEL_CONFIG {
+ OMX_AUDIO_DUAL_MONO_MODE_FL_FR,/* 1st SCE to left & right */
+ OMX_AUDIO_DUAL_MONO_MODE_SL_SR,/* 2nd SCE to left & right */
+ OMX_AUDIO_DUAL_MONO_MODE_SL_FR,/* 2nd SCE to left, 1st SCE to right */
+ OMX_AUDIO_DUAL_MONO_MODE_FL_SR,/* 1st SCE to left, 2nd SCE to right default */
+ OMX_AUDIO_DUAL_MONO_MODE_DEFAULT = OMX_AUDIO_DUAL_MONO_MODE_FL_SR,
+ OMX_AUDIO_DUAL_MONO_MODE_INVALID = -1
+} OMX_AUDIO_DUAL_MONO_CHANNEL_CONFIG;
+
+/************************************/
+/* DAK */
+/*************************************/
+
+/** this is the list of custom vendor index */
+typedef enum OMX_INDEX_DAK_TYPE {
+ OMX_IndexConfigDAK_BUNDLE = OMX_IndexVendorStartUnused /*0x7F000000*/, /**< reference: OMX_DAK_CONFIG_BUNDLETYPE */
+ OMX_IndexConfigDAK_M2S, /**< reference: OMX_DAK_CONFIG_M2STYPE */
+ OMX_IndexConfigDAK_SSE, /**< reference: OMX_DAK_CONFIG_SSETYPE */
+ OMX_IndexConfigDAK_SLC, /**< reference: OMX_DAK_CONFIG_SLCTYPE */
+ OMX_IndexConfigDAK_VOL, /**< reference: OMX_DAK_CONFIG_VOLTYPE */
+ OMX_IndexConfigDAK_NB, /**< reference: OMX_DAK_CONFIG_NBTYPE */
+ OMX_IndexConfigDAK_GEQ, /**< reference: OMX_DAK_CONFIG_GEQTYPE */
+ OMX_IndexConfigDAK_MSR, /**< reference: OMX_DAK_CONFIG_MSRTYPE */
+ OMX_IndexConfigDAK_HFE, /**< reference: OMX_DAK_CONFIG_HFETYPE */
+ OMX_IndexConfigDAK_FADE,/**< reference: OMX_DAK_CONFIG_FADETYPE */
+ OMX_IndexConfigDAK_SEQ, /**< reference: OMX_DAK_CONFIG_SEQTYPE */
+
+} OMX_INDEX_DAK_TYPE;
+
+
+/** Dolby Audio Kernel TDAS bundle */
+typedef struct OMX_DAK_CONFIG_BUNDLETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nDAK_Version; /**< Dolby Audio Kernel version information */
+ OMX_U32 nDAK_Revision; /**< Dolby Audio Kernel revision information */
+ OMX_U8 nLfeMixLevel; /**< level at which the LFE channel is mixed into the output audio */
+ OMX_U8 nSampleRateIndex; /**< Output sample rate */
+ OMX_U8 nInChans; /**< Channel format of input audio */
+ OMX_U8 nInMatrix; /**< L/R mixing specification for stereo audio input */
+ OMX_U8 nBypass; /**< Audio Processing bypass */
+ OMX_U8 nRateMultipier; /**< Sample-rate multiplier (output with respect to input) */
+ OMX_U8 nInChanFormat; /**< Input/Output channel format */
+ OMX_U8 nMsrMaxProfile; /**< Maximum number of virtual rendering channels in Mobile Surround */
+ OMX_BOOL bPortablemodeEnable; /**< Enable or disable Pulse Portable Mode */
+ OMX_S16 nPotablemodeGain; /**< Send the Portable Mode gain value from the Pulse decoder */
+ OMX_U8 nORL; /**< Device specific target signal level (output reference level) */
+ OMX_BOOL bPulsedownmixEnable; /**< Enable the Pulse Downmix compensation */
+ OMX_S8 nPulsedownmixAtten; /**< Attenuation value that Pulse is currently applying */
+ OMX_U8 nOutChans; /**< Channel format of output audio */
+
+} OMX_DAK_CONFIG_BUNDLETYPE;
+
+/** Dolby Audio Kernel Mono-to-Stereo Creator */
+typedef struct OMX_DAK_CONFIG_M2STYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnable; /**< Mono-to-Stereo Creator enable */
+ OMX_BOOL bDetector; /**< Stereo detector status */
+} OMX_DAK_CONFIG_M2STYPE;
+
+/** Dolby Audio Kernel Sound Space Expander */
+typedef struct OMX_DAK_CONFIG_SSETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnable; /**< Sound Space Expander enable */
+ OMX_U8 nWidth; /**< Width of expansion effect */
+ OMX_U8 nSpkMode; /**< Speaker Mode */
+} OMX_DAK_CONFIG_SSETYPE;
+
+/** Dolby Audio Kernel Sound Level Controller */
+typedef struct OMX_DAK_CONFIG_SLCTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnable; /**< Sound Level Controller enable */
+ OMX_U8 nLevel; /**< Source audio RMS level */
+ OMX_U8 nDepth; /**< Depth of effect */
+} OMX_DAK_CONFIG_SLCTYPE;
+
+/** Dolby Audio Kernel Volume */
+typedef struct OMX_DAK_CONFIG_VOLTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnable; /**< Volume enable */
+ OMX_U8 nGainType; /**< Linear/Logarithmic audio scaling */
+ OMX_U8 nInternalGain; /**< Audio volume scale */
+ OMX_U8 nExternalGain; /**< Audio volume scale applied by external volume control */
+ OMX_S8 nBalance; /**< L/R panning for output audio */
+ OMX_BOOL bMute; /**< Audio Mute */
+} OMX_DAK_CONFIG_VOLTYPE;
+
+/** Dolby Audio Kernel Natural Bass */
+typedef struct OMX_DAK_CONFIG_NBTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnable; /**< Natural Bass enable */
+ OMX_U8 nCutoff; /**< Speakers/headphones lower cutoff frequency */
+ OMX_U8 nBoost; /**< Strength of effect */
+ OMX_U8 nLevel; /**< Maximum output level capability of speakers/headphones */
+} OMX_DAK_CONFIG_NBTYPE;
+
+/** Dolby Audio Kernel Graphic EQ */
+typedef struct OMX_DAK_CONFIG_GEQTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnable; /**< Graphic EQ enable */
+ OMX_U8 nNbands; /**< Number of frequency bands */
+ OMX_S8 nPreamp; /**< Global attenuation to apply prior to band level adjustment */
+ OMX_U8 nMaxboost; /**< Maximum absolute boost with respect to the source audio */
+ OMX_S8 nBand1; /**< Boost/cut for 1st frequency band */
+ OMX_S8 nBand2; /**< Boost/cut for 2nd frequency band */
+ OMX_S8 nBand3; /**< Boost/cut for 3rd frequency band */
+ OMX_S8 nBand4; /**< Boost/cut for 4th frequency band */
+ OMX_S8 nBand5; /**< Boost/cut for 5th frequency band */
+ OMX_S8 nBand6; /**< Boost/cut for 6th frequency band */
+ OMX_S8 nBand7; /**< Boost/cut for 7th frequency band */
+} OMX_DAK_CONFIG_GEQTYPE;
+
+/** Dolby Audio Kernel, Mobile Surround and Surround Upmixer */
+typedef struct OMX_DAK_CONFIG_MSRTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bMsrEnable; /**< Mobile Surround enable */
+ OMX_U8 nMsrRoom; /**< Room Size control */
+ OMX_U8 nMsrBright; /**< Brightness control */
+ OMX_BOOL bMupEnable; /**< Mobile Surround Upmixer enable */
+} OMX_DAK_CONFIG_MSRTYPE;
+
+/** Dolby Audio Kernel High Frequency Enhancer */
+typedef struct OMX_DAK_CONFIG_HFETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnable; /**< High Frequency Enhancer enable */
+ OMX_U8 nDepth; /**< Strength of effect */
+} OMX_DAK_CONFIG_HFETYPE;
+
+/** Dolby Audio Kernel Fade */
+typedef struct OMX_DAK_CONFIG_FADETYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnable; /**< Fade enable */
+ OMX_U8 nTarget; /**< Target fade level */
+ OMX_U16 nTime; /**< Fade time interval */
+} OMX_DAK_CONFIG_FADETYPE;
+
+/** Dolby Audio Kernel Speaker EQ */
+typedef struct OMX_DAK_CONFIG_SEQTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_BOOL bEnable; /**< Speaker EQ enable */
+ OMX_S8 nLeftGainDB; /**< Additional gain for Left channel */
+ OMX_S8 nRightGainDB; /**< Additional gain for Right channel */
+ OMX_U8 nCoef48000Size; /**< Length of the block of coefficients for 48KHz Sampling Rate case */
+ OMX_PTR pCoef48000; /**< Pointer to the block of coefficients for the 48KHz case */
+ OMX_U8 nCoef44100Size; /**< Length of the block of coefficients for 44.1KHz Sampling Rate case */
+ OMX_PTR pCoef44100; /**< Pointer to the block of coefficients for the 44.1KHz case */
+ OMX_U8 nCoef32000Size; /**< Length of the block of coefficients for 32KHz Sampling Rate case */
+ OMX_PTR pCoef32000; /**< Pointer to the block of coefficients for the 32KHz case */
+ OMX_U8 nCoef24000Size; /**< Length of the block of coefficients for 24KHz Sampling Rate case */
+ OMX_PTR pCoef24000; /**< Pointer to the block of coefficients for the 24KHz case */
+
+} OMX_DAK_CONFIG_SEQTYPE;
+
+
+typedef enum OMX_AUDIO_CHANNELTYPE_EXTENSION {
+ OMX_AUDIO_ChannelTS = OMX_AUDIO_ChannelVendorStartUnused, /**< Top Surround */
+ OMX_AUDIO_ChannelCVH /**< Central Vertical Height */
+} OMX_AUDIO_CHANNELTYPE_EXTENSION;
+
+/**
+ * DUAL-MONO type
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eChannelConfig : Enum for channel config
+ *
+ */
+typedef struct QOMX_AUDIO_CONFIG_DUALMONOTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_AUDIO_DUAL_MONO_CHANNEL_CONFIG eChannelConfig;
+} QOMX_AUDIO_CONFIG_DUALMONOTYPE;
+
+#if defined( __cplusplus )
+}
+#endif /* end of macro __cplusplus */
+
+#endif /* end of macro __H_QOMX_AUDIOEXTENSIONS_H__ */
diff --git a/mm-core/inc/QOMX_AudioIndexExtensions.h b/mm-core/inc/QOMX_AudioIndexExtensions.h
new file mode 100755
index 00000000..c3c67d3d
--- /dev/null
+++ b/mm-core/inc/QOMX_AudioIndexExtensions.h
@@ -0,0 +1,78 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+*//** @file QOMX_AudioIndexExtensions.h
+ This module contains the index extensions for Audio
+
+*//*========================================================================*/
+
+
+#ifndef __H_QOMX_AUDIOINDEXEXTENSIONS_H__
+#define __H_QOMX_AUDIOINDEXEXTENSIONS_H__
+
+/*========================================================================
+
+ INCLUDE FILES FOR MODULE
+
+========================================================================== */
+#include <OMX_Core.h>
+
+/*========================================================================
+
+ DEFINITIONS AND DECLARATIONS
+
+========================================================================== */
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif /* end of macro __cplusplus */
+
+/**
+ * Enumeration used to define Qualcomm's vendor extensions for
+ * audio. The audio extensions occupy a range of
+ * 0x7F100000-0x7F1FFFFF, inclusive.
+ */
+typedef enum QOMX_AUDIO_EXTENSIONS_INDEXTYPE
+{
+ QOMX_IndexParamAudioAmrWbPlus = 0x7F200000, /**< "OMX.Qualcomm.index.audio.amrwbplus" */
+ QOMX_IndexParamAudioWma10Pro = 0x7F200001, /**< "OMX.Qualcomm.index.audio.wma10pro" */
+ QOMX_IndexParamAudioSessionId = 0x7F200002, /**< "OMX.Qualcomm.index.audio.sessionId" */
+ QOMX_IndexParamAudioVoiceRecord = 0x7F200003, /**< "OMX.Qualcomm.index.audio.VoiceRecord" */
+ QOMX_IndexConfigAudioDualMono = 0x7F200004, /**< "OMX.Qualcomm.index.audio.dualmono" */
+ QOMX_IndexParamAudioUnused = 0x7F2FFFFF
+} QOMX_AUDIO_EXTENSIONS_INDEXTYPE;
+
+#if defined( __cplusplus )
+}
+#endif /* end of macro __cplusplus */
+
+#endif /* end of macro __H_QOMX_AUDIOINDEXEXTENSIONS_H__ */
diff --git a/mm-core/inc/QOMX_CoreExtensions.h b/mm-core/inc/QOMX_CoreExtensions.h
new file mode 100755
index 00000000..e02930a7
--- /dev/null
+++ b/mm-core/inc/QOMX_CoreExtensions.h
@@ -0,0 +1,164 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011 Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#ifndef __H_QOMX_COREEXTENSIONS_H__
+#define __H_QOMX_COREEXTENSIONS_H__
+
+
+
+/*========================================================================
+
+ INCLUDE FILES FOR MODULE
+
+========================================================================== */
+#include <OMX_Core.h>
+
+/*========================================================================
+
+ DEFINITIONS AND DECLARATIONS
+
+========================================================================== */
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif /* end of macro __cplusplus */
+
+/**
+ * Qualcom vendor extensions.
+ */
+#define OMX_QCOM_INDEX_PARAM_INDEXEXTRADATA "OMX.QCOM.index.param.IndexExtraData" /**< reference: QOMX_INDEXEXTRADATATYPE */
+#define OMX_QCOM_INDEX_PARAM_HELDBUFFERCOUNT "OMX.QCOM.index.param.HeldBufferCount" /**< reference: QOMX_HELDBUFFERCOUNTTYPE */
+
+/**
+ * Buffer header nFlags field extension.
+ *
+ * The source of a stream sets the TIMESTAMPINVALID flag to
+ * indicate that the buffer header nTimeStamp field does not
+ * hold valid timestamp information. The component that updates
+ * the nTimeStamp field to reflect a valid timestamp shall clear
+ * this flag.
+ */
+#define QOMX_BUFFERFLAG_TIMESTAMPINVALID 0x80000000
+
+/**
+ * Buffer header nFlags field extension.
+ *
+ * The READONLY flag is set when the component emitting the
+ * buffer on an output port identifies the buffer's contents to
+ * be read-only. The IL client or input port that receives a
+ * filled read-only buffer cannot alter the contents of the
+ * buffer. This flag can be cleared by the component when the
+ * emptied buffer is returned to it.
+ */
+#define QOMX_BUFFERFLAG_READONLY 0x40000000
+
+/**
+ * Buffer header nFlags field extension.
+ *
+ * The ENDOFSUBFRAME flag is an optional flag that is set by an
+ * output port when the last byte that a buffer payload contains
+ * is an end-of-subframe. Any component that implements setting
+ * the ENDOFSUBFRAME flag on an output port shall set this flag
+ * for every buffer sent from the output port containing an
+ * end-of-subframe.
+ *
+ * A subframe is defined by the next level of natural
+ * partitioning in a logical unit for a given format. For
+ * example, a subframe in an H.264 access unit is defined as the
+ * "network abstraction layer" unit, or NAL unit.
+ */
+#define QOMX_BUFFERFLAG_ENDOFSUBFRAME 0x20000000
+
+/**
+ * A component sends this error to the IL client (via the EventHandler callback)
+ * in the event that application of a config or parameter has failed some time
+ * after the return of OMX_SetConfig or OMX_SetParameter. This may happen when a
+ * component transitions between states and discovers some incompatibility
+ * between multiple settings. Configuration indicies sent via extra data may also
+ * fail when set to a down stream component. The index that failed will be
+ * included as the nData2 parameter of the EventHandler callback.
+ */
+#define QOMX_ErrorAsyncIndexFailed (OMX_ErrorVendorStartUnused+1)
+
+/* In some scenarios there may be a possibilty to run out of the storage space
+ * and components may want to notify this error to IL client to take appropriate
+ * action by the IL client.
+ *
+ * For example, In recording scenario, MUX component can know the available
+ * space in the recording media and can compute peridically to accommodate the
+ * meta data before we reach to a stage where we end up no space to write even
+ * the meta data. When the space limit reached in recording media, MUX component
+ * would like to notify the IL client with QOMX_ErrorSpaceLimitReached.
+ * After this error all the buffers that are returned will have nFilledLen
+ * unchanges i.e not consumed.
+ */
+#define QOMX_ErrorStorageLimitReached (OMX_ErrorVendorStartUnused + 2)
+
+/**
+ * This structure is used to enable/disable the generation or
+ * consumption of the QOMX_ExtraDataOMXIndex extra data type for
+ * the specified OpenMax index.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * bEnabled : Enable/Disable the extra data processing
+ * nIndex : The index associated with the extra data
+ */
+typedef struct QOMX_INDEXEXTRADATATYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bEnabled;
+ OMX_INDEXTYPE nIndex;
+} QOMX_INDEXEXTRADATATYPE;
+
+/**
+ * This structure is used to indicate the maximum number of buffers
+ * that a port will hold during data flow.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * nHeldBufferCount : Read-only, maximum number of buffers that will be held
+ */
+typedef struct QOMX_HELDBUFFERCOUNTTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nHeldBufferCount;
+} QOMX_HELDBUFFERCOUNTTYPE;
+
+#if defined( __cplusplus )
+}
+#endif /* end of macro __cplusplus */
+
+#endif /* end of macro __H_QOMX_COREEXTENSIONS_H__ */
diff --git a/mm-core/inc/QOMX_FileFormatExtensions.h b/mm-core/inc/QOMX_FileFormatExtensions.h
new file mode 100755
index 00000000..e4576930
--- /dev/null
+++ b/mm-core/inc/QOMX_FileFormatExtensions.h
@@ -0,0 +1,137 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011 Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#ifndef __QOMX_FILE_FORMAT_EXTENSIONS_H__
+#define __QOMX_FILE_FORMAT_EXTENSIONS_H__
+
+/*============================================================================
+*//** @file QOMX_FileFormatExtensions.h
+ This header contains constants and type definitions that specify the
+ extensions added to the OpenMAX Vendor specific APIs.
+*//*========================================================================*/
+
+/*============================================================================
+ Edit History
+
+when who what, where, why
+-------- --- -------------------------------------------------------
+
+============================================================================*/
+
+//////////////////////////////////////////////////////////////////////////////
+// Include Files
+//////////////////////////////////////////////////////////////////////////////
+#include "OMX_Core.h"
+
+
+/* :OMX.QCOM.index.param.container.info*/
+#define QOMX_QcomIndexParamContainerInfo 0x7F000009
+
+#define QOMX_INDEX_CONTAINER_INFO_STRING "QOMX.Qualcomm.index.param.containerinfo"
+#define OMX_QCOM_INDEX_FILE_FORMAT "OMX.QCOM.index.config.FileFormat"
+
+/**-----------------------------------------------------------------------------
+ OMX.QCOM.index.param.container.info
+--------------------------------------------------------------------------------
+*/
+
+typedef enum QOMX_CONTAINER_FORMATTYPE {
+ QOMX_FORMAT_RAW,
+ QOMX_FORMAT_MP4,
+ QOMX_FORMAT_3GP,
+ QOMX_FORMAT_3G2,
+ QOMX_FORMAT_AMC,
+ QOMX_FORMAT_SKM,
+ QOMX_FORMAT_K3G,
+ QOMX_FORMAT_VOB,
+ QOMX_FORMAT_AVI,
+ QOMX_FORMAT_ASF,
+ QOMX_FORMAT_RM ,
+ QOMX_FORMAT_MPEG_ES,
+ QOMX_FORMAT_DIVX,
+ QOMX_FORMATMPEG_TS,
+ QOMX_FORMAT_QT,
+ QOMX_FORMAT_M4A,
+ QOMX_FORMAT_MP3,
+ QOMX_FORMAT_WAVE,
+ QOMX_FORMAT_XMF,
+ QOMX_FORMAT_AMR,
+ QOMX_FORMAT_AAC,
+ QOMX_FORMAT_EVRC,
+ QOMX_FORMAT_QCP,
+ QOMX_FORMAT_SMF,
+ QOMX_FORMAT_OGG,
+ QOMX_FORMAT_BMP,
+ QOMX_FORMAT_JPG,
+ QOMX_FORMAT_JPG2000
+}QOMX_CONTAINER_FORMATTYPE;
+
+typedef struct QOMX_CONTAINER_INFOTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ QOMX_CONTAINER_FORMATTYPE eFmtType;
+} QOMX_CONTAINER_INFOTYPE;
+
+typedef enum QOMX_FILEFORMATTYPE {
+ QOMX_FileFormatNone, /**< no file format naming convention is followed. */
+ QOMX_FileFormatDCF, /**< DCF file naming convention. */
+ QOMX_FileFormatMax = 0x7FFFFFFF
+} QOMX_FILEFORMATTYPE;
+
+/** QOMX_CONFIG_FILEFORMATTYPE is used to determine how the file writer will interpret
+the provided content URI and whether it will increment the index of the file name. */
+typedef struct QOMX_CONFIG_FILEFORMATTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+ OMX_U32 nPortIndex; /**< port that this structure applies to */
+ QOMX_FILEFORMATTYPE eFileFormat; /** file format type */
+} QOMX_CONFIG_FILEFORMATTYPE;
+
+/**The QOMX_RECORDINGSTATISTICSINTERVALTYPE structure is used to enable
+IL client to indicate the interval of the statistics notification to file mux
+component. Time interval will indicate the frequency(in ms) when client needs
+the statistics data*/
+typedef struct QOMX_RECORDINGSTATISTICSINTERVALTYPE {
+ OMX_U32 nSize; /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;/**< OMX specification version information */
+ OMX_TICKS interval;/**< specifies the time(milliseconds) between updates */
+ }QOMX_RECORDINGSTATISTICSINTERVALTYPE;
+
+/**QOMX_RECORDINGSTATISTICSTYPE indicates the current recording
+time and space statistics of this session, which can be used by client to
+identify current status of recorded data in milliseconds and bytes */
+typedef struct QOMX_RECORDINGSTATISTICSTYPE {
+ OMX_U32 nSize;/**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;/**< OMX specification version information */
+ OMX_TICKS nRecordedTime; /** duration that we already recorded*/
+ OMX_TICKS nTimeCanRecord;/** the time we can record at the same bitrate*/
+ OMX_U64 nSpaceConsumed;/** space that consumed in bytes*/
+ OMX_U64 nSpaceLeft;/** space left in bytes*/
+} QOMX_RECORDINGSTATISTICSTYPE;
+
+#endif /*__QOMX_FILE_FORMAT_EXTENSIONS_H__*/
diff --git a/mm-core/inc/QOMX_IVCommonExtensions.h b/mm-core/inc/QOMX_IVCommonExtensions.h
new file mode 100755
index 00000000..bb25632f
--- /dev/null
+++ b/mm-core/inc/QOMX_IVCommonExtensions.h
@@ -0,0 +1,399 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011 Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#ifndef __H_QOMX_IVCOMMONEXTENSIONS_H__
+#define __H_QOMX_IVCOMMONEXTENSIONS_H__
+
+/*========================================================================
+
+*//** @file QOMX_CommonExtensions.h
+
+@par FILE SERVICES:
+ common extensions API for OpenMax IL.
+
+ This file contains the description of the Qualcomm OpenMax IL
+ common extention interface, through which the IL client and OpenMax
+ components can access additional capabilities.
+
+*//*====================================================================== */
+
+
+/*========================================================================
+
+ INCLUDE FILES FOR MODULE
+
+========================================================================== */
+#include <OMX_Core.h>
+
+/*========================================================================
+
+ DEFINITIONS AND DECLARATIONS
+
+========================================================================== */
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif /* end of macro __cplusplus */
+
+/* IV common extension strings */
+#define OMX_QCOM_INDEX_CONFIG_MEDIAINFO "OMX.QCOM.index.config.mediainfo" /**< reference: QOMX_MEDIAINFOTYPE */
+#define OMX_QCOM_INDEX_CONFIG_CONTENTURI "OMX.QCOM.index.config.contenturi" /**< reference: OMX_PARAM_CONTENTURITYPE */
+#define OMX_QCOM_INDEX_PARAM_IMAGESIZECONTROL "OMX.Qualcomm.index.param.ImageSizeControl" /**< reference: QOMX_IMAGE_IMAGESIZECONTROLTYPE */
+#define OMX_QCOM_INDEX_CONFIG_PAUSEPORT "OMX.QCOM.index.config.PausePort" /**< reference: QOMX_CONFIG_PAUSEPORTTYPE */
+
+/** reference: QOMX_URANGETYPE
+ * nMin, nMax, nStepSize give width in pixels */
+#define OMX_QCOM_INDEX_PARAM_FRAMEWIDTHRANGESUPPORTED "OMX.QCOM.index.param.FrameWidthRangeSupported"
+
+/** reference: QOMX_URANGETYPE
+ * nMin, nMax, nStepSize give height in pixels */
+#define OMX_QCOM_INDEX_PARAM_FRAMEHEIGHTRANGESUPPORTED "OMX.QCOM.index.param.FrameHeightRangeSupported"
+
+/** reference: QOMX_URANGETYPE
+ * nMin, nMax, nStepSize give the number of macroblocks per
+ * frame. */
+#define OMX_QCOM_INDEX_PARAM_MACROBLOCKSPERFRAMERANGESUPPORTED "OMX.QCOM.index.param.MacroblocksPerFrameRangeSupported"
+
+/** reference: QOMX_URANGETYPE
+ * nMin, nMax, nStepSize give the number of macroblocks per
+ * second. */
+#define OMX_QCOM_INDEX_PARAM_MACROBLOCKSPERSECONDRANGESUPPORTED "OMX.QCOM.index.param.MacroblocksPerSecondRangeSupported"
+
+/** reference: QOMX_URANGETYPE
+ * nMin, nMax, nStepSize give frame rate in frames per second
+ * in Q16 format. */
+#define OMX_QCOM_INDEX_PARAM_FRAMERATERANGESUPPORTED "OMX.QCOM.index.param.FrameRateRangeSupported"
+
+#define OMX_QCOM_INDEX_PARAM_PLANEDEFINITION "OMX.QCOM.index.param.PlaneDefinition" /** reference: QOMX_PLANEDEFINITIONTYPE */
+
+/** reference: QOMX_URANGETYPE
+ * nMin, nMax, nStepSize give the crop width in pixels */
+#define OMX_QOMX_INDEX_PARAM_CROPWIDTHRANGESUPPORTED "OMX.QCOM.index.param.CropWidthRangeSupported"
+
+/** reference: QOMX_URANGETYPE
+ * nMin, nMax, nStepSize give the crop height in pixels */
+#define OMX_QOMX_INDEX_PARAM_CROPHEIGHTRANGESUPPORTED "OMX.QCOM.index.param.CropHeightRangeSupported"
+
+/** reference: QOMX_URANGETYPE
+ * nMin, nMax, nStepSize give the digital zoom factor on width
+ * in Q16 format. */
+#define OMX_QCOM_INDEX_PARAM_DIGITALZOOMWIDTHRANGESUPPORTED "OMX.QCOM.index.param.DigitalZoomWidthRangeSupported"
+
+/** reference: QOMX_URANGETYPE
+ * nMin, nMax, nStepSize give the digital zoom factor on height
+ * in Q16 format. */
+#define OMX_QCOM_INDEX_PARAM_DIGITALZOOMHEIGHTRANGESUPPORTED "OMX.QCOM.index.param.DigitalZoomHeightRangeSupported"
+
+/**
+ * Enumeration defining the extended uncompressed image/video
+ * formats.
+ *
+ * ENUMS:
+ * YVU420PackedSemiPlanar : Buffer containing all Y, and then V and U
+ * interleaved.
+ * YVU420PackedSemiPlanar32m4ka : YUV planar format, similar to the
+ * YVU420PackedSemiPlanar format, but with the
+ * following restrictions:
+ *
+ * 1. The width and height of both plane must
+ * be a multiple of 32 texels.
+ *
+ * 2. The base address of both planes must be
+ * aligned to a 4kB boundary.
+ *
+ * YUV420PackedSemiPlanar16m2ka : YUV planar format, similar to the
+ * YUV420PackedSemiPlanar format, but with the
+ * following restrictions:
+ *
+ * 1. The width of the luma plane must be a
+ * multiple of 16 pixels.
+ *
+ * 2. The address of both planes must be
+ * aligned to a 2kB boundary.
+ *
+ * YUV420PackedSemiPlanar64x32Tile2m8ka : YUV planar format, similar to the
+ * YUV420PackedSemiPlanar format, but with the
+ * following restrictions:
+ *
+ * 1. The data is laid out in a 4x2 MB tiling
+ * memory structure
+ *
+ * 2. The width of each plane is a multiple of
+ * 2 4x2 MB tiles.
+ *
+ * 3. The height of each plan is a multiple of
+ * a 4x2 MB tile.
+ *
+ * 4. The base address of both planes must be
+ * aligned to an 8kB boundary.
+ *
+ * 5. The tiles are scanned in the order
+ * defined in the MFCV5.1 User's Manual.
+ */
+typedef enum QOMX_COLOR_FORMATTYPE
+{
+ QOMX_COLOR_FormatYVU420PackedSemiPlanar = 0x7F000001,
+ QOMX_COLOR_FormatYVU420PackedSemiPlanar32m4ka,
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar16m2ka,
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka
+} QOMX_COLOR_FORMATTYPE;
+
+typedef enum QOMX_MEDIAINFOTAGTYPE {
+ QOMX_MediaInfoTagVersion, /**< OMX_VERSIONTYPE. Version of the standard specifying the media information.*/
+ QOMX_MediaInfoTagUID, /**< OMX_U8*. Unique ID of the media data, ie image unique ID.*/
+ QOMX_MediaInfoTagDescription, /**< OMX_U8*. Comments about the media.*/
+ QOMX_MediaInfoTagTitle, /**< OMX_U8*. Title of the media.*/
+ QOMX_MediaInfoTagAuthor, /**< OMX_U8*. Author of the media.*/
+ QOMX_MediaInfoTagCopyright, /**< OMX_U8*. Copyright information.*/
+ QOMX_MediaInfoTagTrackNum, /**< OMX_U32. Track number.*/
+ QOMX_MediaInfoTagGenre, /**< OMX_U8*. The genre of the media.*/
+ QOMX_MediaInfoTagEquipmentMake, /**< OMX_U8*. Manufacturer of recording equipment.*/
+ QOMX_MediaInfoTagEquipmentModel,/**< OMX_U8*. Model or name of the recording equipment.*/
+ QOMX_MediaInfoTagSoftware, /**< OMX_U8*. Name and version of the software or firmware of the device generating the media.*/
+ QOMX_MediaInfoTagAssociatedFile,/**< OMX_U8*. The name of the file related to the media. For example, an audio file related to an image file.*/
+ QOMX_MediaInfoTagResolution, /**< QOMX_RESOLUTIONTYPE. Number of pixels per resolution unit.*/
+ QOMX_MediaInfoTagDateCreated, /**< QOMX_DATESTAMPTYPE. Date when media was created.*/
+ QOMX_MediaInfoTagTimeCreated, /**< QOMX_TIMESTAMPTYPE. Time when media was created.*/
+ QOMX_MediaInfoTagDateModified, /**< QOMX_DATESTAMPETYPE. Date when file was last modified.*/
+ QOMX_MediaInfoTagTimeModified, /**< QOMX_TIMESTAMPTYPE. Time when file was last modified.*/
+ QOMX_MediaInfoTagGPSAreaName, /**< OMX_U8*. The name of the location.*/
+ QOMX_MediaInfoTagGPSVersion, /**< OMX_VERSIONTYPE. GPS version.*/
+ QOMX_MediaInfoTagGPSCoordinates,/**< QOMX_GEODETICTYPE. The longitude, latitude, and altitude.*/
+ QOMX_MediaInfoTagGPSSatellites, /**< OMX_U8*. The GPS satellites used for measurements.*/
+ QOMX_MediaInfoTagGPSPrecision, /**< OMX_U32. GPS degree of precision.*/
+ QOMX_MediaInfoTagGPSDateStamp, /**< QOMX_DATESTAMPTYPE. Date of the GPS data.*/
+ QOMX_MediaInfoTagGPSTimeStamp, /**< QOMX_TIMESTAMPTYPE. Time of the GPS data.*/
+ QOMX_MediaInfoTagMediaStreamType,/**< QOMX_MEDIASTREAMTYPE. Type of the stream. */
+ QOMX_MediaInfoDuration, /**< OMX_TICKS. Total duration of the media.*/
+ QOMX_MediaInfoSize, /**< OMX_U32. Total size of the media in bytes.*/
+ QOMX_MediaInfoTagAlbum, /**< OMX_U8*. Name of album/movie/show.*/
+ QOMX_MediaInfoTagLocation, /**< OMX_U8*. Recording location information.*/
+ QOMX_MediaInfoTagClassification, /**< OMX_U8*. Classification information of media.*/
+ QOMX_MediaInfoTagRatings, /**< OMX_U8*. Media Ratings based on popularity & rating criteria.*/
+ QOMX_MediaInfoTagKeyword, /**< OMX_U8*. Keyword associated with media which are intended to reflect mood of the A/V.*/
+ QOMX_MediaInfoTagPerformance, /**< OMX_U8*. Media Performer information..*/
+ QOMX_MediaInfoTagYear, /**< OMX_U8*. Production year information of media.*/
+ QOMX_MediaInfoTagComposer, /**< OMX_U8*. Name of the composer of media i.e. audio.*/
+ QOMX_MediaInfoTagEncoderName, /**< OMX_U8*. Name of the person or organisation who encoded media.*/
+ QOMX_MediaInfoTagCopyProhibitFlag, /**< OMX_U8*. Flag to indicate if copy is allowed or not.*/
+ QOMX_MediaInfoTagLyricist, /**< OMX_U8*. Name of the lyricist or text writer in recording. Specific to ID3 tag.*/
+ QOMX_MediaInfoTagSubtitle, /**< OMX_U8*. Subtitle/Description used for informaton directly related to title of media.*/
+ QOMX_MediaInfoTagOriginalFileName, /**< OMX_U8*. Original file name.*/
+ QOMX_MediaInfoTagOriginalLyricist, /**< OMX_U8*. Name of the original lyricist/text writer of original recording.*/
+ QOMX_MediaInfoTagOriginalArtist, /**< OMX_U8*. Name of the original artist.*/
+ QOMX_MediaInfoTagOriginalReleaseYear, /**< OMX_U8*. Original release year of recorded media.*/
+ QOMX_MediaInfoTagFileOwner, /**< OMX_U8*. Licensee or name of the file owner.*/
+ QOMX_MediaInfoTagOrchestra, /**< OMX_U8*. Name of the orchestra or performers during recording.*/
+ QOMX_MediaInfoTagConductor, /**< OMX_U8*. Name of the conductor.*/
+ QOMX_MediaInfoTagRemixedBy, /**< OMX_U8*. Person or organization name who did the remix.*/
+ QOMX_MediaInfoTagAlbumArtist, /**< OMX_U8*. Name of the album artist.*/
+ QOMX_MediaInfoTagPublisher, /**< OMX_U8*. Name of the publisher or label.*/
+ QOMX_MediaInfoTagRecordingDates, /**< OMX_U8*. Recording date of media.*/
+ QOMX_MediaInfoTagInternetRadioStationName, /**< OMX_U8*. Name of the Internet radio station from which the audio is streamed.*/
+ QOMX_MediaInfoTagInternetRadioStationOwner, /**< OMX_U8*. Name of the owner of the Internet radio station from which the audio is streamed.*/
+ QOMX_MediaInfoTagInternationalRecordingCode,/**< OMX_U8*. International standard recording code.*/
+ QOMX_MediaInfoTagEncoderSwHwSettings, /**< OMX_U8*. Software,hardware settings used by encoder.*/
+ QOMX_MediaInfoTagInvolvedPeopleList, /**< OMX_U8*. List of people involved. Specific to ID3 tag.*/
+ QOMX_MediaInfoTagComments, /**< OMX_U8*. Comments about the media. It can be any kind of full text informaton.*/
+ QOMX_MediaInfoTagCommissioned, /**< OMX_U8*. Commissioned information of media.*/
+ QOMX_MediaInfoTagSubject, /**< OMX_U8*. Subject associated with media.*/
+ QOMX_MediaInfoTagContact, /**< OMX_U8*. Conatct information. URL information of the seller.*/
+ QOMX_MediaInfoTagValidityPeriod, /**< OMX_U8*. Length or period of validity of media.*/
+ QOMX_MediaInfoTagValidityEffectiveDate, /**< OMX_U8*. Validity effective date of media*/
+ QOMX_MediaInfoTagNumberOfAllowedPlaybacks, /**< OMX_U8*. Number of allowed playbacks for this media*/
+ QOMX_MediaInfoTagPlayCounter, /**< OMX_U8*. Current play counter of the media.Its number of times a file has been played.*/
+ QOMX_MediaInfoTagMemo, /**< OMX_U8*. Memo associatd with media.*/
+ QOMX_MediaInfoTagDeviceName, /**< OMX_U8*. Name of the devices used in creating media.*/
+ QOMX_MediaInfoTagURL, /**< OMX_U8*. List artist /genre /movie sites URL.*/
+ QOMX_MediaInfoTagFileType, /**< OMX_U8*. Indicates type of audio track.*/
+ QOMX_MediaInfoTagContentGroupDesc, /**< OMX_U8*. Content group description if the sound belongs to a larger category of of music /sound.*/
+ QOMX_MediaInfoTagInitialKeys, /**< OMX_U8*. Contains the musical key in which media starts.*/
+ QOMX_MediaInfoTagLanguages, /**< OMX_U8*. Languages of the text or lyrics spoken or sung in the media.*/
+ QOMX_MediaInfoTagMediaType, /**< OMX_U8*. Describes from which media the media sound originated.*/
+ QOMX_MediaInfoTagPlaylistDelay, /**< OMX_U8*. Denotes number of milliseconds between each song of the playlist.*/
+ QOMX_MediaInfoTagBeatsPerMinute, /**< OMX_U8*. Number of beats per minute in main part of audio.*/
+ QOMX_MediaInfoTagPartOfSet, /**< OMX_U8*. Describes part of the set selected or played. */
+ QOMX_MediaInfoTagInstrumentName, /**< OMX_U8*. Name of the instrument used in creating media.*/
+ QOMX_MediaInfoTagLyrics, /**< OMX_U8*. Lyrics of the media/audio track.*/
+ QOMX_MediaInfoTagTrackName, /**< OMX_U8*. Name of the media/audio track.*/
+ QOMX_MediaInfoTagMarker, /**< OMX_U8*. Text string cotnents placed at a specific location to denote information about the music at that point.*/
+ QOMX_MediaInfoTagCuePoint, /**< OMX_U8*. Subset of the content which can be optionally played.*/
+ QOMX_MediaInfoTagGPSPositioningName, /**< OMX_U8*. GPS positioning name. */
+ QOMX_MediaInfoTagGPSPositioningMethod, /**< OMX_U8*. GPS positioning method.*/
+ QOMX_MediaInfoTagGPSSurveyData, /**< OMX_U8*. GPS survey data. */
+ QOMX_MediaInfoTagGPSByteOrder, /**< OMX_U16.GPS byte order. */
+ QOMX_MediaInfoTagGPSLatitudeRef, /**< OMX_U32.Reference GPS latitude. */
+ QOMX_MediaInfoTagGPSLongitudeRef, /**< OMX_U32.Reference GPS longitude */
+ QOMX_MediaInfoTagGPSAltitudeRef, /**< OMX_U32. Reference GPS altitude.*/
+ QOMX_MediaInfoTagGPSExtensionMapScaleInfo, /**< OMX_U64. GPS extension map scale information.*/
+ QOMX_MediaInfoTagUUIDAtomInfo, /**< OMX_U8*. The user defined data associated with UUID.*/
+ QOMX_MediaInfoTagUUIDAtomCount, /**< OMX_U32 UUID atom count.*/
+ QOMX_MediaInfoTagLocationRole, /**< OMX_32. Indicates the role of the place. i.e. ‘0’ indicate ‘shooting location'. ‘1’ ‘real location’.*/
+ QOMX_MediaInfoTagAstronomicalBody, /**< OMX_U8*. Astronomical body on which the location exists.*/
+ QOMX_MediaInfoTagUserInfoData /**< OMX_U8*. The user defined tag informaton.*/
+} QOMX_MEDIAINFOTAGTYPE;
+
+typedef struct QOMX_MEDIAINFOTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex; /**< Read-only value containing the index of the output port. */
+ QOMX_MEDIAINFOTAGTYPE eTag; /**< The type of media info being specified. */
+ OMX_U32 nDataSize; /**< The size of the associated cData. Set nDataSize to 0 to retrieve the size required for cData. */
+ OMX_U8 cData[1]; /**< The media data info */
+} QOMX_MEDIAINFOTYPE;
+
+
+typedef enum QOMX_RESOLUTIONUNITTYPE {
+ QOMX_ResolutionUnitInch,
+ QOMX_ResolutionCentimeter
+} QOMX_RESOLUTIONUNITTYPE;
+
+typedef struct QOMX_RESOLUTIONTYPE {
+ QOMX_RESOLUTIONUNITTYPE eUnit; /**< The unit of measurement. */
+ OMX_U32 nX; /**< The number of pixels per unit in the width direction. */
+ OMX_U32 nY; /**< The number of pixels per unit in the height direction. */
+} QOMX_RESOLUTIONTYPE;
+
+typedef struct QOMX_TIMESTAMPTYPE {
+ OMX_U32 nHour; /**< The hour portion of the time stamp, based on a 24-hour format. */
+ OMX_U32 nMinute; /**< The minute portion of the time stamp. */
+ OMX_U32 nSecond; /**< The second portion of the time stamp. */
+ OMX_U32 nMillisecond; /**< the millisecond portion of the time stamp. */
+} QOMX_TIMESTAMPTYPE;
+
+typedef struct QOMX_DATESTAMPTYPE {
+ OMX_U32 nYear; /**< The year portion of the date stamp. */
+ OMX_U32 nMonth; /**< The monthportion of the date stamp. Valid values are 1 to 12.*/
+ OMX_U32 nDay; /**< The day portion of the date stamp. Valid values are 1 to 31 depending on the month specified.*/
+} QOMX_DATESTAMPTYPE;
+
+typedef enum QOMX_GEODETICREFTYPE {
+ QOMX_GeodeticRefNorth, /**< North latitude. */
+ QOMX_GeodeticRefSouth, /**< South latitude. */
+ QOMX_GeodeticRefEast, /**< East longitude. */
+ QOMX_GeodeticRefWest /**< West longitude. */
+} QOMX_GEODETICREFTYPE;
+
+/** QOMX_GEODETICANGLETYPE is used to set geodetic angle coordinates on an ellipsoid (the Earth),
+and is explicitly used to specify latitude and longitude. This structure is referenced by QOMX_GEODETICTYPE. */
+typedef struct QOMX_GEODETICANGLETYPE {
+ QOMX_GEODETICREFTYPE eReference; /**< Indicates whether the geodetic angle is a latitude or longitude. */
+ OMX_U32 nDegree; /**< The degree of the latitude or longitude. */
+ OMX_U32 nMinute; /**< The minute of the latitude or longitude. */
+ OMX_U32 nSecond; /**< The second of the latitude or longitude. */
+} QOMX_GEODETICANGLETYPE;
+
+typedef enum QOMX_ALTITUDEREFTYPE {
+ QOMX_AltitudeRefSeaLevel, /**< At sea level. */
+ QOMX_AltitudeRefBelowSeaLevel /**< Below sea level. */
+} QOMX_ALTITUDEREFTYPE;
+
+typedef struct QOMX_ALTITUDETYPE {
+ QOMX_ALTITUDEREFTYPE eReference; /**< The reference point for the altitude. */
+ OMX_U32 nMeter; /**< The absolute value of the number of meters above or below sea level. */
+ OMX_U32 nMillimeter; /**< The absolute value of the number of millimeters above or below sea level. */
+} QOMX_ALTITUDETYPE;
+
+/** QOMX_GEODETICTYPE is used to set geodetic coordinates such as longitude, latitude, and altitude.
+This structure references QOMX_GEODETICANGLETYPE and QOMX_ALTITUDETYPE. */
+typedef struct QOMX_GEODETICTYPE {
+ QOMX_GEODETICANGLETYPE sLatitude; /**< Indicates the latitude.*/
+ QOMX_GEODETICANGLETYPE sLongitude; /**< Indicates the longitude.*/
+ QOMX_ALTITUDETYPE sAltitude; /**< Indicates the altitude.*/
+} QOMX_GEODETICTYPE;
+
+
+typedef struct QOMX_IMAGE_IMAGESIZECONTROLTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex; /**< port index on which size control needs to be applied */
+ OMX_U32 nTargetImageSize; /**< expected max target size in Bytes */
+} QOMX_IMAGE_IMAGESIZECONTROLTYPE;
+
+typedef enum QOMX_URITYPE {
+ QOMX_URITYPE_RTSP, /**< RTSP URI Type. */
+ QOMX_URITYPE_HTTP, /**< HTTP URI Type. */
+ QOMX_URITYPE_LOCAL /**< Local URI Type.(i.e Non Network) */
+}QOMX_URITYPE;
+
+
+typedef enum QOMX_STREAMTYPE {
+ QOMX_STREAMTYPE_VOD, /**< Video On demand Stream */
+ QOMX_STREAMTYPE_LIVE,/**< Live Stream */
+ QOMX_STREAMTYPE_FILE /**< File based Stream */
+}QOMX_STREAMTYPE;
+
+
+typedef struct QOMX_MEDIASTREAMTYPE{
+ QOMX_URITYPE eURIType;
+ QOMX_STREAMTYPE eStreamType;
+}QOMX_MEDIASTREAMTYPE;
+
+
+/**
+ * This structure specifies the parameters associated with each
+ * plane of the uncompressed image/video format.
+ */
+typedef struct QOMX_PLANEDEFINITIONTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex; /**< Represents the port that this structure applies to */
+ OMX_U32 nPlaneIndex; /**< Specifies the plane enumeration index that this structure applies to, starting with a base value of 1 */
+ OMX_U32 nMinStride; /**< Read-only parameter that specifies the minimum buffer stride */
+ OMX_U32 nMaxStride; /**< Read-only parameter that specifies the maximum buffer stride */
+ OMX_U32 nStrideMultiples; /**< Read-only parameter that specifies the buffer stride multiple supported */
+ OMX_S32 nActualStride; /**< Specifies the actual stride to be applied */
+ OMX_U32 nMinPlaneBufferHeight; /**< Read-only parameter that specifies the minimum buffer height (number of stride lines) */
+ OMX_U32 nActualPlaneBufferHeight; /**< Specifies the actual buffer height (number of stride lines) to be applied */
+ OMX_U32 nBufferSize; /**< Read-only parameter that specifies the minimum size of the buffer, in bytes */
+ OMX_U32 nBufferAlignment; /**< Read-only field that specifies the required alignment of the buffer, in bytes */
+} QOMX_PLANEDEFINITIONTYPE;
+
+/**
+ * Pause port parameters
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Index of port that this structure represent
+ * bPausePort : Boolean field which indicates if port is paused or resume. By default bPausePort = OMX_FALSE
+ * & port will be paused when bPausePort = OMX_TRUE
+ */
+typedef struct QOMX_CONFIG_PAUSEPORTTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex; /**< Represents the port that this structure applies to */
+ OMX_BOOL bPausePort; /**< Specifies if port need to PAUSE or RESUME */
+} QOMX_CONFIG_PAUSEPORTTYPE;
+
+#if defined( __cplusplus )
+}
+#endif /* end of macro __cplusplus */
+
+#endif /* end of macro __H_QOMX_IVCOMMONEXTENSIONS_H__ */
diff --git a/mm-core/inc/QOMX_SourceExtensions.h b/mm-core/inc/QOMX_SourceExtensions.h
new file mode 100755
index 00000000..9936f6dc
--- /dev/null
+++ b/mm-core/inc/QOMX_SourceExtensions.h
@@ -0,0 +1,157 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011-2012 Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#ifndef __H_QOMX_SOURCEEXTENSIONS_H__
+#define __H_QOMX_SOURCEEXTENSIONS_H__
+/*========================================================================
+*//** @file QOMX_SourceExtensions.h
+
+@par FILE SERVICES:
+ Qualcomm extensions API for OpenMax IL demuxer component.
+
+ This file contains the description of the Qualcomm OpenMax IL
+ demuxer component extention interface, through which the IL client and
+ OpenMax components can access additional capabilities of the demuxer.
+
+*//*====================================================================== */
+
+
+/*========================================================================
+ INCLUDE FILES FOR MODULE
+========================================================================== */
+#include <OMX_Core.h>
+/*========================================================================
+ DEFINITIONS AND DECLARATIONS
+========================================================================== */
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif /* end of macro __cplusplus */
+/* Frame size query supported extension string */
+#define OMX_QCOM_INDEX_PARAM_FRAMESIZEQUERYSUPPORTED "OMX.QCOM.index.param.FrameSizeQuerySupported" /**< reference: QOMX_FRAMESIZETYPE */
+
+/* Content interface extension strings */
+#define OMX_QCOM_INDEX_PARAM_CONTENTINTERFACE_IXSTREAM "OMX.QCOM.index.param.contentinterface.ixstream" /**< reference: QOMX_CONTENTINTERFACETYPE*/
+#define OMX_QCOM_INDEX_PARAM_CONTENTINTERFACE_ISTREAMPORT "OMX.QCOM.index.param.contentinterface.istreamport" /**< reference: QOMX_CONTENTINTERFACETYPE*/
+
+/* Source seek access extension string */
+#define OMX_QCOM_INDEX_PARAM_SEEK_ACCESS "OMX.QCOM.index.param.SeekAccess" /**< reference: QOMX_PARAM_SEEKACCESSTYPE*/
+
+/* Media duration extension string*/
+#define OMX_QCOM_INDEX_CONFIG_MEDIADURATION "OMX.QCOM.index.config.MediaDuration" /**< reference: OMX_TIME_CONFIG_MEDIADURATIONTYPE*/
+
+/**
+ * Data interface Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nInterfaceSize : Size of the data pointed by pInterface
+ * pInterface : Interface pointer
+ */
+typedef struct QOMX_CONTENTINTERFACETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nInterfaceSize;
+ OMX_U8 pInterface[1];
+} QOMX_DATAINTERFACETYPE;
+
+/**
+ * Seek Access Parameters
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Index of port
+ * bSeekAllowed : Flag to indicate whether seek is supported or not
+ */
+typedef struct QOMX_PARAM_SEEKACCESSTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bSeekAllowed;
+} QOMX_PARAM_SEEKACCESSTYPE;
+
+/**
+ * Media Duration parameters
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Index of port
+ * nDuration : Total duration of the media
+*/
+typedef struct OMX_TIME_CONFIG_MEDIADURATIONTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_TICKS nDuration;
+} OMX_TIME_CONFIG_MEDIADURATIONTYPE;
+
+/**
+ * The parameters for QOMX_FRAMESIZETYPE are defined as
+ * follows:
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Represents the port that this structure
+ * applies to
+ * sFrameSize : Indicates the size of the frame
+ * nFrameSizeIndex : Enumerates the possible frame sizes for
+ * the given session/URL configuration. The
+ * caller specifies all fields and the
+ * OMX_GetParameter call returns the value of
+ * the frame size. The value of
+ * nFrameSizeIndex goes from 0 to N-1, where
+ * N is the number of frame sizes that may be
+ * emitted by the port. The port does not
+ * need to report N as the caller can
+ * determine N by enumerating all the frame
+ * sizes supported by the port. If the port
+ * does not have advance knowledge of the
+ * possible frame sizes, it may report no
+ * frame sizes. If there are no more frame
+ * sizes, OMX_GetParameter returns
+ * OMX_ErrorNoMore.
+ */
+typedef struct QOMX_FRAMESIZETYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_FRAMESIZETYPE sFrameSize;
+ OMX_U32 nFrameSizeIndex;
+} QOMX_FRAMESIZETYPE;
+
+#if defined( __cplusplus )
+}
+#endif /* end of macro __cplusplus */
+
+#endif /* end of macro __H_QOMX_SOURCEEXTENSIONS_H__ */
diff --git a/mm-core/inc/QOMX_StreamingExtensions.h b/mm-core/inc/QOMX_StreamingExtensions.h
new file mode 100755
index 00000000..ec88de80
--- /dev/null
+++ b/mm-core/inc/QOMX_StreamingExtensions.h
@@ -0,0 +1,486 @@
+#ifndef QOMX_STREAMINGEXTENSIONS_H_
+#define QOMX_STREAMINGEXTENSIONS_H_
+/*--------------------------------------------------------------------------
+Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*========================================================================
+
+*//** @file QOMX_StreamingExtensions.h
+
+@par FILE SERVICES:
+ Qualcomm extensions API for OpenMax IL Streaming Components.
+
+ This file contains the description of the Qualcomm OpenMax IL
+ streaming extention interface, through which the IL client and OpenMax
+ components can access additional streaming capabilities.
+
+*//*====================================================================== */
+
+/*========================================================================
+ Edit History
+
+$Header: //source/qcom/qct/multimedia2/api/OpenMax/QCOM/main/latest/QOMX_StreamingExtensions.h#7 $
+$DateTime: 2011/03/02 12:27:27 $
+$Change: 1638323 $
+
+========================================================================== */
+
+/* =======================================================================
+** Includes and Public Data Declarations
+** ======================================================================= */
+
+/* =======================================================================
+
+ INCLUDE FILES FOR MODULE
+
+========================================================================== */
+
+#include <OMX_Types.h>
+#include <OMX_Component.h>
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif /* end of macro __cplusplus */
+
+/* =======================================================================
+
+ DATA DECLARATIONS
+
+========================================================================== */
+/* -----------------------------------------------------------------------
+** Type Declarations
+** ----------------------------------------------------------------------- */
+/**
+ * Qualcomm vendor streaming extension strings.
+ */
+#define OMX_QUALCOMM_INDEX_CONFIG_WATERMARK "OMX.Qualcomm.index.config.Watermark"
+#define OMX_QUALCOMM_INDEX_CONFIG_WATERMARKSTATUS "OMX.Qualcomm.index.config.WatermarkStatus"
+#define OMX_QUALCOMM_INDEX_CONFIG_BUFFERMARKING "OMX.Qualcomm.index.config.BufferMarking"
+#define OMX_QUALCOMM_INDEX_PARAM_STREAMING_NETWORKINTERFACE "OMX.Qualcomm.index.param.streaming.NetworkInterface"
+#define OMX_QUALCOMM_INDEX_PARAM_STREAMING_NETWORKPROFILE "OMX.Qualcomm.index.param.streaming.NetworkProfile"
+#define OMX_QUALCOMM_INDEX_PARAM_STREAMING_PROXYSERVER "OMX.Qualcomm.index.param.streaming.ProxyServer"
+#define OMX_QUALCOMM_INDEX_PARAM_STREAMING_SOURCEPORTS "OMX.Qualcomm.index.param.streaming.SourcePorts"
+#define OMX_QUALCOMM_INDEX_CONFIG_STREAMING_PROTOCOLHEADER "OMX.Qualcomm.index.param.streaming.ProtocolHeader"
+#define OMX_QUALCOMM_INDEX_CONFIG_STREAMING_PROTOCOLEVENT "OMX.Qualcomm.index.config.streaming.ProtocolEvent"
+#define OMX_QUALCOMM_INDEX_CONFIG_STREAMING_DYNAMIC_SWITCH_CAPABILITY "OMX.Qualcomm.index.config.streaming.DynamicSessionSwitchCapability"
+#define OMX_QUALCOMM_INDEX_CONFIG_STREAMING_PROTOCOLHEADERSEVENT "OMX.QCOM.index.config.streaming.ProtocolHeadersEvent"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_USERPAUSETIMEOUT "OMX.QCOM.index.config.streaming.UserPauseTimeout"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_NOTIFYERRORONOPTIONSTIMEOUT "OMX.QCOM.index.config.streaming.NotifyErrorOnOptionsTimeout"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_USEINTERLEAVEDTCP "OMX.QCOM.index.config.streaming.UseInterleavedTCP"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_DATAINACTIVITYTIMEOUT "OMX.QCOM.index.config.streaming.DataInactivityTimeout"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_RTSPOPTIONSKEEPALIVEINTERVAL "OMX.QCOM.index.config.streaming.RTSPOptionsKeepaliveInterval"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_RTCPRRINTERVAL "OMX.QCOM.index.config.streaming.RTCPRRInterval"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_RECONFIGUREPORT "OMX.QCOM.index.config.streaming.ReconfigurePort"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_DEFAULTRTSPMESSAGETIMEOUT "OMX.QCOM.index.config.streaming.DefaultRTSPMessageTimeout"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_ENABLEFIREWALLPROBES "OMX.QCOM.index.config.streaming.EnableFirewallProbes"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_RTSPOPTIONSBEFORESETUP "OMX.QCOM.index.config.streaming.RTSPOptionsBeforeSetup"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_RTSPPIPELINEDFASTSTARTUP "OMX.QCOM.index.config.streaming.RTSPPipelinedFastStartup"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_WMFASTSTARTSPEED "OMX.QCOM.index.config.streaming.WMFastStartSpeed"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_ENABLEFASTRECONNECT "OMX.QCOM.index.config.streaming.EnableFastReconnect"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_FASTRECONNECTMAXATTEMPTS "OMX.QCOM.index.config.streaming.FastReconnectMaxAttempts"
+#define OMX_QCOM_INDEX_CONFIG_STREAMING_DOWNLOADPROGRESSUNITSTYPE "OMX.QCOM.index.config.streaming.DownloadProgressUnitsType"
+#define OMX_QOMX_INDEX_CONFIG_STREAMING_DOWNLOADPROGRESS "OMX.QCOM.index.config.streaming.DownloadProgress"
+/**
+ * Enumeration of the buffering watermark types
+ */
+typedef enum QOMX_WATERMARKTYPE
+{
+ QOMX_WATERMARK_UNDERRUN, /**< buffer has reached or is operating in an underrun condition */
+ QOMX_WATERMARK_NORMAL /**< has reached or is operating in a normal (optimal) condition */
+}QOMX_WATERMARKTYPE;
+
+/**
+ * Enumeration of type of buffering level tracking
+ */
+typedef enum QOMX_WATERMARKUNITSTYPE
+{
+ QOMX_WATERMARKUNITSTYPE_Time, /**< use a media time based reference */
+ QOMX_WATERMARKUNITSTYPE_Data /**< use a data fullness based reference */
+}QOMX_WATERMARKUNITSTYPE;
+
+/**
+ * Buffering watermark levels.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eWaterMark : eWaterMark specifies the type of buffering watermark being
+ * configured
+ * QOMX_WATERMARK_UNDERRUN Indicates the condition when the
+ * buffer has reached or is operating in an underrun condition
+ * - not enough data
+ * QOMX_WATERMARK_NORMAL Indicates the condition when the buffer
+ * has reached or is operating in a normal (optimal) condition
+ * - sufficient data within the buffer.
+ *
+ * nLevel : specifies the buffering level associated with the watermark.
+ * The units associated with the watermark level is dependent
+ * on the eUnitsType being selected.
+ * QOMX_WATERMARKUNITSTYPE_Time nLevel in units of microseconds.
+ * QOMX_WATERMARKUNITSTYPE_Data nLevel in units of bytes.
+ *
+ * nUnitsType : specifies the type of buffering level tracking to be used.
+ * QOMX_WATERMARKUNITSTYPE_Time the buffer watermark level
+ * shall use a media time based reference.
+ * QOMX_WATERMARKUNITSTYPE_Data the buffer watermark level
+ * shall use a data fullness based reference.
+ * bEnable : specifies if the watermark type is being enabled or disabled
+ */
+typedef struct QOMX_BUFFERINGWATERMARKTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_WATERMARKTYPE eWaterMark;
+ OMX_U32 nLevel;
+ QOMX_WATERMARKUNITSTYPE eUnitsType;
+ OMX_BOOL bEnable;
+} QOMX_BUFFERINGWATERMARKTYPE;
+
+/**
+ * Current buffering status of the streaming source component, for a given
+ * media port
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eCurrentWaterMark : specifies the current buffer watermark level condition
+ * QOMX_WATERMARK_UNDERRUN Indicates the condition when the
+ * buffer has reached or is operating in an underrun
+ * condition - not enough data
+ * QOMX_WATERMARK_NORMAL Indicates the condition when the
+ * buffer has reached or is operating in a normal
+ * (optimal) condition - sufficient data within the buffer.
+ * eUnitsType : specifies the type of buffering level tracking to be used.
+ * QOMX_WATERMARKUNITSTYPE_Time the buffer watermark level
+ * shall use a media time based reference.
+ * QOMX_WATERMARKUNITSTYPE_Data the buffer watermark level
+ * shall use a data fullness based reference.
+ * nCurrentLevel : specifies the current buffer watermark level condition
+ * The units associated with the watermark level is dependent
+ * on the eUnitsType being selected.
+ * QOMX_WATERMARKUNITSTYPE_Time nLevel in units of microseconds.
+ * QOMX_WATERMARKUNITSTYPE_Data nLevel in units of bytes.
+ */
+typedef struct QOMX_BUFFERINGSTATUSTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_WATERMARKTYPE eCurrentWaterMark;
+ QOMX_WATERMARKUNITSTYPE eUnitsType;
+ OMX_U32 nCurrentLevel;
+} QOMX_BUFFERINGSTATUSTYPE;
+
+/**
+ * marked buffer shall be emitted when the buffering level has reach an
+ * underrun condition (QOMX_WATERMARK_UNDERRUN).
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * markInfo : identifies the target component handle that shall emit
+ * the mark buffer event and associated
+ * bEnable : enables or disables the buffer marking insertion.
+ *
+ */
+typedef struct QOMX_BUFFERMARKINGTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_MARKTYPE markInfo;
+ OMX_BOOL bEnable;
+} QOMX_BUFFERMARKINGTYPE;
+
+/**
+ * Source ports.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nMinimumPortNumber : Minimum port number the component may use
+ * nMaximumPortNumber : Maximum port number the component may use
+ */
+typedef struct QOMX_PARAM_STREAMING_SOURCE_PORTS
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U16 nMinimumPortNumber;
+ OMX_U16 nMaximumPortNumber;
+} QOMX_PARAM_STREAMING_SOURCE_PORTS;
+
+/**
+ * Enumeration used to define to the protocol message type.
+ */
+typedef enum QOMX_STREAMING_PROTOCOLMESSAGETYPE
+{
+ QOMX_STREAMING_PROTOCOLMESSAGE_REQUEST,
+ QOMX_STREAMING_PROTOCOLMESSAGE_RESPONSE,
+ QOMX_STREAMING_PROTOCOLMESSAGE_ALL
+} QOMX_STREAMING_PROTOCOLMESSAGETYPE;
+
+/**
+ * Enumeration used to define the protocol header action type.
+ */
+typedef enum QOMX_STREAMING_PROTOCOLHEADERACTIONTYPE
+{
+ QOMX_STREAMING_PROTOCOLHEADERACTION_NONE,
+ QOMX_STREAMING_PROTOCOLHEADERACTION_ADD,
+ QOMX_STREAMING_PROTOCOLHEADERACTION_REMOVE
+} QOMX_STREAMING_PROTOCOLHEADERACTIONTYPE;
+
+/**
+ * Protocol message header.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes (including size of
+ messageHeader parameter)
+ * nVersion : OMX specification version information
+ * eMessageType : enumeration to distinguish protocol message type
+ * eActionType : enumeration indicating protocol header action type
+ * nMessageClassSize : size of the message class string (excluding any
+ * terminating characters)
+ * nHeaderNameSize : size of the header name string (excluding any
+ * terminating characters)
+ * nHeaderValueSize : size of the header value string (excluding any
+ * terminating characters)
+ * messageHeader : the NULL-terminated message header string formed by
+ * concatenating message class, header name and value
+ * strings, i.e. the first nMessageClassSize bytes of the
+ * messageHeader parameter correspond to the message class
+ * (without any terminating characters), followed by the
+ * header name of size nHeaderNameSize bytes and then the
+ * header value of size nHeaderValueSize bytes. The value
+ * of message class is interpreted by what is mentioned in
+ * eMessageType,
+ * 1) For request message
+ * (QOMX_STREAMING_PROTOCOLMESSAGE_REQUEST) it is the
+ * Method token (as specified in the RFC 2616 and RFC
+ * 2326).
+ * 2) For response message
+ * (QOMX_STREAMING_PROTOCOLMESSAGE_RESPONSE) it is
+ * either or both the Method token and a three digit
+ * Status-Code (as specified in the RFC 2616 and
+ * RFC 2326) or a class of the response Status-Codes
+ * (1xx, 2xx, 3xx, 4xx, and 5xx). When both present,
+ * the method token and status code are separated by
+ * 1 empty space.
+ * 3) For all messages
+ * (QOMX_STREAMING_PROTOCOLMESSAGE_ALL) it will be
+ * absent (nMessageClassSize will be zero).
+ */
+typedef struct QOMX_CONFIG_STREAMING_PROTOCOLHEADERTYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ QOMX_STREAMING_PROTOCOLMESSAGETYPE eMessageType;
+ QOMX_STREAMING_PROTOCOLHEADERACTIONTYPE eActionType;
+ OMX_U32 nMessageClassSize;
+ OMX_U32 nHeaderNameSize;
+ OMX_U32 nHeaderValueSize;
+ OMX_U8 messageHeader[1];
+} QOMX_CONFIG_STREAMING_PROTOCOLHEADERTYPE;
+
+/**
+ * Protocol Event.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes (including size of
+ protocolEventText parameter)
+ * nVersion : OMX specification version information
+ * nProtocolEvent : 1xx, 2xx, 3xx, 4xx or 5xx codes for HTTP/RTSP protocol
+ * nReasonPhraseSize : size of the reason phrase string (excluding any
+ * terminating characters)
+ * nEntityBodySize : size of the entity body string (excluding any
+ * terminating characters)
+ * nContentUriSize : size of the url (exclusing any terminating characters)
+ * url is used a key to identify for which operation this
+ * event belongs to
+ * protocolEventText : NULL-terminated protocol event text string formed by
+ * concatenating reason phrase and entity body
+ * and uri, i.e. the first nReasonPhraseSize bytes of the
+ * protocolEventText parameter correspond to the reason
+ * phrase (without any terminating characters), followed
+ * by the entity body of size nEntityBodySize bytes,
+ * followed by nContentUriSize bytes of URI
+ */
+typedef struct QOMX_CONFIG_STREAMING_PROTOCOLEVENTTYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nProtocolEvent;
+ OMX_U32 nReasonPhraseSize;
+ OMX_U32 nEntityBodySize;
+ OMX_U32 nContentUriSize;
+ OMX_U8 protocolEventText[1];
+} QOMX_CONFIG_STREAMING_PROTOCOLEVENTTYPE;
+
+/**
+ * Protocol Headers Event
+ *
+ * STRUCT MEMBERS:
+ * nSize: Size of the structure in bytes including
+ * messageHeaders.
+ * nVersion: OMX specification version information
+ * eMessageType: enumeration to distinguish protocol message
+ * type
+ * nMessageClassSize: Size of the message class string.
+ * nMessageAttributesSize: Size of the message attributes
+ * string.
+ *
+ * This structure can be populated in 2 modes:
+ * (i) Query for required sizes of message class and message
+ * attributes. In this mode, nMessageClassSize and
+ * nMessageAtributesSize both need to be set to zero.
+ * (ii) Request to populate messageHeaders. In this mode, at
+ * least one of nMessageClassSize or nMessageAttributesSize
+ * need to be non-zero. On output, messageHeaders will be
+ * populated with the message class and message attributes.
+ * nMessageClassSize and/or nMessageAtributesSize may be
+ * overwritten to reflect the actual start and end of
+ * message class and message attributes. The max sizes of
+ * message class and message attributes will not exceed the
+ * values input by the client. The strings are not null
+ * terminated.
+ */
+typedef struct QOMX_STREAMING_PROTOCOLHEADERSTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ QOMX_STREAMING_PROTOCOLMESSAGETYPE eMessageType;
+ OMX_U32 nMessageClassSize;
+ OMX_U32 nMessageAtributesSize;
+ OMX_U8 messageHeaders[1];
+} QOMX_STREAMING_PROTOCOLHEADERSTYPE;
+
+/**
+ * Enumeration of possible streaming network interfaces.
+ */
+typedef enum QOMX_STREAMING_NETWORKINTERFACETYPE
+{
+ QOMX_STREAMING_NETWORKINTERFACE_ANY_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_CDMA_SN_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_CDMA_AN_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_UMTS_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_SIO_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_CDMA_BCAST_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_WLAN_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_DUN_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_FLO_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_DVBH_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_STA_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_IPSEC_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_LO_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_MBMS_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_IWLAN_3GPP_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_IWLAN_3GPP2_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_MIP6_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_UW_FMC_IFACE,
+ QOMX_STREAMING_NETWORKINTERFACE_CMMB_IFACE
+} QOMX_STREAMING_NETWORKINTERFACETYPE;
+
+/*
+ * Network interface.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes (including size of
+ protocolErrorText parameter)
+ * nVersion : OMX specification version information
+ * eNetworkInterface : Network interface the component may use
+ */
+typedef struct QOMX_PARAM_STREAMING_NETWORKINTERFACE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ QOMX_STREAMING_NETWORKINTERFACETYPE eNetworkInterface;
+} QOMX_PARAM_STREAMING_NETWORKINTERFACE;
+
+/**
+ * Enumeration of UnitType for DownloadProgress
+ */
+typedef enum QOMX_DOWNLOADPROGRESSUNITSTYPE
+{
+ QOMX_DOWNLOADPROGRESSUNITSTYPE_TIME,
+ QOMX_DOWNLOADPROGRESSUNITSTYPE_DATA
+} QOMX_DOWNLOADPROGRESSUNITSTYPE;
+
+
+/**
+ * DownloadProgress units
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes (including size of
+ protocolEventText parameter)
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eUnitsType : Specifies the type of units type in
+ * which download prgoress should be
+ * reported
+ */
+typedef struct QOMX_CONFIG_STREAMING_DOWNLOADPROGRESSUNITS
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_DOWNLOADPROGRESSUNITSTYPE eUnitsType;
+} QOMX_CONFIG_STREAMING_DOWNLOADPROGRESSUNITS;
+
+
+/**
+ * Download Progress
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes (including size of
+ protocolEventText parameter)
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * nDataDownloaded : specifies the amount of data downloaded
+ * in time or data scale (based on
+ * eUnitsType) from the media position
+ * specified by nStartOffset below. It
+ * starts at zero and progressively
+ * increases as more data is downloaded
+ * nCurrentStartOffset: specifies is the current download start
+ * position in time or data scale (based
+ * on eUnitsType)
+ */
+typedef struct QOMX_CONFIG_STREAMING_DOWNLOADPROGRESSTYPE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nDataDownloaded;
+ OMX_U32 nCurrentStartOffset;
+} QOMX_CONFIG_STREAMING_DOWNLOADPROGRESSTYPE;
+
+#if defined( __cplusplus )
+}
+#endif /* end of macro __cplusplus */
+
+#endif /* QOMX_STREAMINGEXTENSIONS_H_ */
+
diff --git a/mm-core/inc/QOMX_VideoExtensions.h b/mm-core/inc/QOMX_VideoExtensions.h
new file mode 100755
index 00000000..2ab013a3
--- /dev/null
+++ b/mm-core/inc/QOMX_VideoExtensions.h
@@ -0,0 +1,580 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011 Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#ifndef __H_QOMX_VIDEOEXTENSIONS_H__
+#define __H_QOMX_VIDEOEXTENSIONS_H__
+
+/*========================================================================
+
+*//** @file QOMX_VideoExtensions.h
+
+@par FILE SERVICES:
+ Qualcomm extensions API for OpenMax IL Video.
+
+ This file contains the description of the Qualcomm OpenMax IL
+ video extention interface, through which the IL client and OpenMax
+ components can access additional video capabilities.
+
+*//*====================================================================== */
+
+
+/*========================================================================== */
+
+/*========================================================================
+
+ INCLUDE FILES FOR MODULE
+
+========================================================================== */
+#include <OMX_Core.h>
+#include <OMX_Video.h>
+
+/*========================================================================
+
+ DEFINITIONS AND DECLARATIONS
+
+========================================================================== */
+
+#if defined( __cplusplus )
+extern "C"
+{
+#endif /* end of macro __cplusplus */
+
+/* Video extension strings */
+#define OMX_QCOM_INDEX_PARAM_VIDEO_SYNTAXHDR "OMX.QCOM.index.param.video.SyntaxHdr"
+#define OMX_QCOM_INDEX_PARAM_VIDEO_ENCODERMODE "OMX.QCOM.index.param.video.EncoderMode"
+#define OMX_QCOM_INDEX_CONFIG_VIDEO_INTRAREFRESH "OMX.QCOM.index.config.video.IntraRefresh"
+#define OMX_QCOM_INDEX_CONFIG_VIDEO_INTRAPERIOD "OMX.QCOM.index.config.video.IntraPeriod"
+#define OMX_QCOM_INDEX_CONFIG_VIDEO_TEMPORALSPATIALTRADEOFF "OMX.QCOM.index.config.video.TemporalSpatialTradeOff"
+#define OMX_QCOM_INDEX_CONFIG_VIDEO_MBCONCEALMENTREPORTING "OMX.QCOM.index.config.video.MBConcealmentReporting"
+#define OMX_QCOM_INDEX_PARAM_VIDEO_EXTRADATAMULTISLICEINFO "OMX.QCOM.index.param.video.ExtraDataMultiSliceInfo" /**< reference: QOMX_ENABLETYPE */
+#define OMX_QCOM_INDEX_CONFIG_VIDEO_FLOWSTATUS "OMX.QCOM.index.config.video.FlowStatus" /**< reference: QOMX_FLOWSTATUSTYPE */
+#define OMX_QCOM_INDEX_PARAM_VIDEO_PICTURETYPEDECODE "OMX.QCOM.index.param.video.PictureTypeDecode" /**< reference: QOMX_VIDEO_DECODEPICTURETYPE */
+#define OMX_QCOM_INDEX_PARAM_VIDEO_SAMPLEASPECTRATIO "OMX.QCOM.index.param.video.SampleAspectRatio" /**< reference: QOMX_VIDEO_SAMPLEASPECTRATIO */
+
+/* Video coding types */
+#define OMX_QCOM_INDEX_PARAM_VIDEO_DIVX "OMX.QCOM.index.param.video.DivX"
+#define OMX_QCOM_INDEX_PARAM_VIDEO_VP "OMX.QCOM.index.param.video.VP"
+#define OMX_QCOM_INDEX_PARAM_VIDEO_SPARK "OMX.QCOM.index.param.video.Spark"
+#define OMX_QCOM_INDEX_PARAM_VIDEO_VC1 "OMX.QCOM.index.param.video.VC1"
+
+/**
+ * Enumeration used to define the extended video compression
+ * codings, not present in the OpenMax IL 1.1.2 specification.
+ * NOTE: This essentially refers to file extensions. If the
+ * coding is being used to specify the ENCODE type, then
+ * additional work must be done to configure the exact
+ * flavor of the compression to be used.
+ */
+typedef enum QOMX_VIDEO_CODINGTYPE
+{
+ QOMX_VIDEO_CodingDivX = 0x7F000001, /**< all versions of DivX */
+ QOMX_VIDEO_CodingVP = 0x7F000002, /**< all versions of On2 VP codec */
+ QOMX_VIDEO_CodingSpark = 0x7F000003, /**< Sorenson Spark */
+ QOMX_VIDEO_CodingVC1 = 0x7F000004, /**< VC-1 */
+ QOMX_VIDEO_MPEG1 = 0x7F000005 /**< MPEG-1 */
+} QOMX_VIDEO_CODINGTYPE;
+
+/**
+ * DivX Versions
+ */
+typedef enum QOMX_VIDEO_DIVXFORMATTYPE {
+ QOMX_VIDEO_DIVXFormatUnused = 0x01, /**< Format unused or unknown */
+ QOMX_VIDEO_DIVXFormat311 = 0x02, /**< DivX 3.11 */
+ QOMX_VIDEO_DIVXFormat4 = 0x04, /**< DivX 4 */
+ QOMX_VIDEO_DIVXFormat5 = 0x08, /**< DivX 5 */
+ QOMX_VIDEO_DIVXFormat6 = 0x10, /**< DivX 6 */
+ QOMX_VIDEO_DIVXFormatKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_DIVXFormatVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_DIVXFormatMax = 0x7FFFFFFF
+} QOMX_VIDEO_DIVXFORMATTYPE;
+
+/**
+ * DivX profile types, each profile indicates support for
+ * various performance bounds.
+ */
+typedef enum QOMX_VIDEO_DIVXPROFILETYPE {
+ QOMX_VIDEO_DivXProfileqMobile = 0x01, /**< qMobile Profile */
+ QOMX_VIDEO_DivXProfileMobile = 0x02, /**< Mobile Profile */
+ QOMX_VIDEO_DivXProfileMT = 0x04, /**< Mobile Theatre Profile */
+ QOMX_VIDEO_DivXProfileHT = 0x08, /**< Home Theatre Profile */
+ QOMX_VIDEO_DivXProfileHD = 0x10, /**< High Definition Profile */
+ QOMX_VIDEO_DIVXProfileKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_DIVXProfileVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_DIVXProfileMax = 0x7FFFFFFF
+} QOMX_VIDEO_DIVXPROFILETYPE;
+
+/**
+ * DivX Video Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFormat : Version of DivX stream / data
+ * eProfile : Profile of DivX stream / data
+ */
+typedef struct QOMX_VIDEO_PARAM_DIVXTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_DIVXFORMATTYPE eFormat;
+ QOMX_VIDEO_DIVXPROFILETYPE eProfile;
+} QOMX_VIDEO_PARAM_DIVXTYPE;
+
+/**
+ * VP Versions
+ */
+typedef enum QOMX_VIDEO_VPFORMATTYPE {
+ QOMX_VIDEO_VPFormatUnused = 0x01, /**< Format unused or unknown */
+ QOMX_VIDEO_VPFormat6 = 0x02, /**< VP6 Video Format */
+ QOMX_VIDEO_VPFormat7 = 0x04, /**< VP7 Video Format */
+ QOMX_VIDEO_VPFormat8 = 0x08, /**< VP8 Video Format */
+ QOMX_VIDEO_VPFormatKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_VPFormatVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_VPFormatMax = 0x7FFFFFFF
+} QOMX_VIDEO_VPFORMATTYPE;
+
+/**
+ * VP profile types, each profile indicates support for various
+ * encoding tools.
+ */
+typedef enum QOMX_VIDEO_VPPROFILETYPE {
+ QOMX_VIDEO_VPProfileSimple = 0x01, /**< Simple Profile, applies to VP6 only */
+ QOMX_VIDEO_VPProfileAdvanced = 0x02, /**< Advanced Profile, applies to VP6 only */
+ QOMX_VIDEO_VPProfileVersion0 = 0x04, /**< Version 0, applies to VP7 and VP8 */
+ QOMX_VIDEO_VPProfileVersion1 = 0x08, /**< Version 1, applies to VP7 and VP8 */
+ QOMX_VIDEO_VPProfileVersion2 = 0x10, /**< Version 2, applies to VP8 only */
+ QOMX_VIDEO_VPProfileVersion3 = 0x20, /**< Version 3, applies to VP8 only */
+ QOMX_VIDEO_VPProfileKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_VPProfileVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_VPProfileMax = 0x7FFFFFFF
+} QOMX_VIDEO_VPPROFILETYPE;
+
+/**
+ * VP Video Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFormat : Format of VP stream / data
+ * eProfile : Profile or Version of VP stream / data
+ */
+typedef struct QOMX_VIDEO_PARAM_VPTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_VPFORMATTYPE eFormat;
+ QOMX_VIDEO_VPPROFILETYPE eProfile;
+} QOMX_VIDEO_PARAM_VPTYPE;
+
+/**
+ * Spark Versions
+ */
+typedef enum QOMX_VIDEO_SPARKFORMATTYPE {
+ QOMX_VIDEO_SparkFormatUnused = 0x01, /**< Format unused or unknown */
+ QOMX_VIDEO_SparkFormat0 = 0x02, /**< Video Format Version 0 */
+ QOMX_VIDEO_SparkFormat1 = 0x04, /**< Video Format Version 1 */
+ QOMX_VIDEO_SparkFormatKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_SparkFormatVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_SparkFormatMax = 0x7FFFFFFF
+} QOMX_VIDEO_SPARKFORMATTYPE;
+
+/**
+ * Spark Video Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eFormat : Version of Spark stream / data
+ */
+typedef struct QOMX_VIDEO_PARAM_SPARKTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_SPARKFORMATTYPE eFormat;
+} QOMX_VIDEO_PARAM_SPARKTYPE;
+
+/**
+ * VC-1 profile types, each profile indicates support for
+ * various encoding tools.
+ */
+typedef enum QOMX_VIDEO_VC1PROFILETYPE {
+ QOMX_VIDEO_VC1ProfileSimple = 0x01, /**< Simple Profile */
+ QOMX_VIDEO_VC1ProfileMain = 0x02, /**< Main Profile */
+ QOMX_VIDEO_VC1ProfileAdvanced = 0x04, /**< Advanced Profile */
+ QOMX_VIDEO_VC1ProfileKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_VC1ProfileVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_VC1ProfileMax = 0x7FFFFFFF
+} QOMX_VIDEO_VC1PROFILETYPE;
+
+/**
+ * VC-1 level types, each level indicates support for various
+ * performance bounds.
+ */
+typedef enum QOMX_VIDEO_VC1LEVELTYPE {
+ QOMX_VIDEO_VC1LevelLow = 0x01, /**< Low Level, applies to simple and main profiles*/
+ QOMX_VIDEO_VC1LevelMedium = 0x02, /**< Medium Level, applies to simple and main profiles */
+ QOMX_VIDEO_VC1LevelHigh = 0x04, /**< High Level, applies to main profile only */
+ QOMX_VIDEO_VC1Level0 = 0x08, /**< Level 0, applies to advanced profile only */
+ QOMX_VIDEO_VC1Level1 = 0x10, /**< Level 1, applies to advanced profile only */
+ QOMX_VIDEO_VC1Level2 = 0x20, /**< Level 2, applies to advanced profile only */
+ QOMX_VIDEO_VC1Level3 = 0x40, /**< Level 3, applies to advanced profile only */
+ QOMX_VIDEO_VC1Level4 = 0x80, /**< Level 4, applies to advanced profile only */
+ QOMX_VIDEO_VC1LevelKhronosExtensions = 0x6F000000,
+ QOMX_VIDEO_VC1LevelVendorStartUnused = 0x7F000000,
+ QOMX_VIDEO_VC1LevelMax = 0x7FFFFFFF
+} QOMX_VIDEO_VC1LEVELTYPE;
+
+/**
+ * VC-1 Video Params
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version information
+ * nPortIndex : Port that this structure applies to
+ * eProfile : Profile of VC-1 stream / data
+ * eLevel : Level of VC-1 stream / data
+ */
+typedef struct QOMX_VIDEO_PARAM_VC1TYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_VC1PROFILETYPE eProfile;
+ QOMX_VIDEO_VC1LEVELTYPE eLevel;
+} QOMX_VIDEO_PARAM_VC1TYPE;
+
+/**
+ * Extended MPEG-4 level types not defined in the OpenMax IL
+ * 1.1.2 specification, each level indicates support for various
+ * frame sizes, bit rates, decoder frame rates.
+ */
+typedef enum QOMX_VIDEO_MPEG4LEVELTYPE {
+ QOMX_VIDEO_MPEG4Level6 = 0x7F000001, /**< Level 6 */
+ QOMX_VIDEO_MPEG4Level7 = 0x7F000002, /**< Level 7 */
+ QOMX_VIDEO_MPEG4Level8 = 0x7F000003, /**< Level 8 */
+ QOMX_VIDEO_MPEG4Level9 = 0x7F000004, /**< Level 9 */
+ QOMX_VIDEO_MPEG4LevelMax = 0x7FFFFFFF
+} QOMX_VIDEO_MPEG4LEVELTYPE;
+
+/**
+ * This structure is used in retrieving the syntax header from a
+ * video encoder component, or setting the out of band syntax
+ * header configuration data on a video decoder component.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * nBytes : When used with OMX_GetParameter for the encoder
+ * component, it is a read-write field. When
+ * QOMX_VIDEO_SYNTAXHDRTYPE is passed in
+ * OMX_GetParameter this is the size of the buffer
+ * array pointed by data field. When the
+ * OMX_GetParameter call returns this is the
+ * amount of data within the buffer array.
+ *
+ * The IL client needs to allocate the buffer
+ * array and then request for the syntax header.
+ * If the size of buffer array to allocate is
+ * unknown to the IL client, then it can call
+ * OMX_GetParamter with nBytes set to 0. In this
+ * case, when OMX_GetParameter returns, the nBytes
+ * field will be set to the size of the syntax
+ * header. IL Client can then allocate a buffer of
+ * this size and call OMX_GetParamter again.
+ *
+ * When used with OMX_SetParameter for the decoder
+ * component, it is a read-only field specifying
+ * the amount of data in the buffer array.
+ * data : The syntax header data. The format of the
+ * syntax header is specific to the video codec,
+ * and is described below.
+ *
+ * H.263 : N/A
+ * H.264 : The SPS and PPS parameter sets
+ * MPEG-4 : The VO, VOS, and VOL header
+ * WMV7 : The "Extra Data" info, in the ASF Stream
+ * Properties Object.
+ * WMV8 : The "Extra Data" info, in the ASF Stream
+ * Properties Object.
+ * WMV9 SP/MP : The STRUCT_C portion of the sequence layer
+ * meta data, defined in Table 263 of the VC-1
+ * specification.
+ * VC-1 SP/MP : The STRUCT_C portion of the sequence layer
+ * meta data, defined in Table 263 of the VC-1
+ * specification.
+ * VC-1 AP : The sequence and entry point header
+ * DivX 3 : N/A
+ * DivX 4.x : The VO, VOS, and VOL header
+ * DivX 5.x : The VO, VOS, and VOL header
+ * DivX 6.x : The VO, VOS, and VOL header
+ * VP6 : N/A
+ * Spark : N/A
+ */
+typedef struct QOMX_VIDEO_SYNTAXHDRTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nBytes;
+ OMX_U8 data[1];
+} QOMX_VIDEO_SYNTAXHDRTYPE;
+
+
+/**
+ * Enumeration used to define the extended video intra refresh types, not
+ * present in the OpenMax IL 1.1.2 specification.
+ *
+ * ENUMS:
+ * IntraRefreshRandom : Random intra refresh mode.
+ */
+typedef enum QOMX_VIDEO_INTRAREFRESHTYPE
+{
+ QOMX_VIDEO_IntraRefreshRandom = 0x7F100000
+} QOMX_VIDEO_INTRAREFRESHTYPE;
+
+
+/**
+ * This structure is used to configure the intra periodicity for encoder.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * nIDRPeriod : Defines the periodicity of IDR occurrence. This specifies
+ * coding a frame as IDR after a specific number of intra
+ * frames. The periodicity of intra frame coding is specified by
+ * the nPFrames. If nIDRPeriod is set to 0, only the first
+ * frame of the encode session is an IDR frame. This field is
+ * ignored for non-AVC codecs and is used only for codecs that
+ * support IDR Period.
+ * nPFrames : Specifies the number of P frames between each I Frame.
+ * nBFrames : Specifies the number of B frames between each I Frame.
+ */
+typedef struct QOMX_VIDEO_INTRAPERIODTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nIDRPeriod;
+ OMX_U32 nPFrames;
+ OMX_U32 nBFrames;
+} QOMX_VIDEO_INTRAPERIODTYPE;
+
+
+/**
+ * Enumeration used to define the extended video extra data payload types not
+ * present in the OpenMax IL 1.1.2 specification.
+ *
+ * ENUMS:
+ * VideoMultiSliceInfo : Multi slice layout information
+ *
+ * Slice information layout:
+ * First 4 bytes = Number of Slice Entries
+ *
+ * Then individual slice entries: 8 bytes per entry.
+ * Slice1 information: offset (4 bytes), Length (4 bytes)
+ * Slice2 information: offset (4 bytes), Length (4 bytes)
+ * Slice3 information: offset (4 bytes), Length (4 bytes)
+ * ...................................
+ * ...................................
+ * SliceN information: offset (4 bytes), Length (4 bytes)
+ *
+ *
+ * VideoNumConcealedMB : Number of concealed MBs
+ *
+ * The data array consists of an unsigned 32-bit size field
+ * indicating the number of concealed macroblocks in the
+ * uncompressed frame.
+ *
+ *
+ * QOMX_ExtraDataOMXIndex : Indicates that the data payload contains an
+ * OpenMax index and associated payload.
+ *
+ * The data of the extra data payload shall contain the value of the
+ * OMX_INDEXTYPE corresponding to the requested operation as an unsigned
+ * 32 bit number occupying the first four bytes of the payload. The index
+ * will be immediately followed by the associated structure. Padding bytes
+ * are appended to ensure 32 bit address alignment if needed.
+ */
+typedef enum QOMX_VIDEO_EXTRADATATYPE
+{
+ QOMX_ExtraDataVideoMultiSliceInfo = 0x7F100000,
+ QOMX_ExtraDataVideoNumConcealedMB,
+ QOMX_ExtraDataOMXIndex,
+ QOMX_ExtraDataHDCPEncryptionInfo
+} QOMX_VIDEO_EXTRADATATYPE;
+
+
+/**
+ * Enumeration used to define the video encoder modes
+ *
+ * ENUMS:
+ * EncoderModeDefault : Default video recording mode.
+ * All encoder settings made through
+ * OMX_SetParameter/OMX_SetConfig are applied. No
+ * parameter is overridden.
+ * EncoderModeMMS : Video recording mode for MMS (Multimedia Messaging
+ * Service). This mode is similar to EncoderModeDefault
+ * except that here the Rate control mode is overridden
+ * internally and set as a variant of variable bitrate with
+ * variable frame rate. After this mode is set if the IL
+ * client tries to set OMX_VIDEO_CONTROLRATETYPE via
+ * OMX_IndexParamVideoBitrate that would be rejected. For
+ * this, client should set mode back to EncoderModeDefault
+ * first and then change OMX_VIDEO_CONTROLRATETYPE.
+ */
+typedef enum QOMX_VIDEO_ENCODERMODETYPE
+{
+ QOMX_VIDEO_EncoderModeDefault = 0x01,
+ QOMX_VIDEO_EncoderModeMMS = 0x02,
+ QOMX_VIDEO_EncoderModeMax = 0x7FFFFFFF
+} QOMX_VIDEO_ENCODERMODETYPE;
+
+/**
+ * This structure is used to set the video encoder mode.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * nMode : defines the video encoder mode
+ */
+typedef struct QOMX_VIDEO_PARAM_ENCODERMODETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ QOMX_VIDEO_ENCODERMODETYPE nMode;
+} QOMX_VIDEO_PARAM_ENCODERMODETYPE;
+
+
+/**
+ * This structure is used to set the temporal (picture rate) - spatial
+ * (picture quality) trade-off factor.
+ * This setting is only valid when rate control is enabled and set to a mode
+ * with variable frame rate. For all other rate control modes this setting is
+ * ignored.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * nTSFactor : temporal-spatial tradeoff factor value in the range of 0-100.
+ * A factor of 0 won't emphasizes picture rate in rate
+ * control decisions at all i.e only picture quality is emphasized. For
+ * increasing values from 1 to 99 the emphasis of picture rate in rate
+ * control decisions increases. A factor of 100 emphasizes only picture rate
+ * in rate control decisions.
+ */
+typedef struct QOMX_VIDEO_TEMPORALSPATIALTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nTSFactor;
+} QOMX_VIDEO_TEMPORALSPATIALTYPE;
+
+/**
+ * This structure is used to enable or disable the MB concealmenet reporting
+ * for the uncompressed frames emitted from the port.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * bEnableMBConcealmentReporting : Flag indicating whether MB concealment
+ * reporting is enabled or disabled.
+ * OMX_TRUE: Enables MB concealment reporting
+ * OMX_FALSE: Disables MB concealment reporting
+ */
+typedef struct QOMX_VIDEO_MBCONCEALMENTREPORTINGTYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_BOOL bEnableMBConcealmentReporting;
+} QOMX_VIDEO_MBCONCEALMENTREPORTINGTYPE;
+
+/**
+ * Specifies the extended picture types. These values should be
+ * OR'd along with the types defined in OMX_VIDEO_PICTURETYPE to
+ * signal all pictures types which are allowed.
+ *
+ * ENUMS:
+ * H.264 Specific Picture Types: IDR
+ */
+typedef enum QOMX_VIDEO_PICTURETYPE {
+ QOMX_VIDEO_PictureTypeIDR = OMX_VIDEO_PictureTypeVendorStartUnused + 0x1000
+} QOMX_VIDEO_PICTURETYPE;
+
+/**
+ * This structure is used to configure the processing of
+ * specific picture types.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * nPictureTypes : Specifies the picture type(s)
+ * that shall be processed. The value consists
+ * of the desired picture types, defined by the
+ * OMX_VIDEO_PICTURETYPE and
+ * QOMX_VIDEO_PICTURETYPE enumerations, OR'd to
+ * signal all the pictures types which are
+ * allowed.
+ */
+typedef struct QOMX_VIDEO_DECODEPICTURETYPE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nPictureTypes;
+} QOMX_VIDEO_DECODEPICTURETYPE;
+
+/**
+ * This structure describes the sample aspect ratio information.
+ *
+ * STRUCT MEMBERS:
+ * nSize : Size of the structure in bytes
+ * nVersion : OMX specification version info
+ * nPortIndex : Port that this structure applies to
+ * nWidth : Specifies the horizontal aspect size of
+ * the sample
+ * nHeight : Specifies the vertical aspect size of the
+ * sample
+ */
+typedef struct QOMX_VIDEO_SAMPLEASPECTRATIO {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U16 nWidth;
+ OMX_U16 nHeight;
+} QOMX_VIDEO_SAMPLEASPECTRATIO;
+
+#if defined( __cplusplus )
+}
+#endif /* end of macro __cplusplus */
+
+#endif /* end of macro __H_QOMX_VIDEOEXTENSIONS_H__ */
diff --git a/mm-core/inc/drmplay_version.h b/mm-core/inc/drmplay_version.h
new file mode 100755
index 00000000..e3562f35
--- /dev/null
+++ b/mm-core/inc/drmplay_version.h
@@ -0,0 +1,34 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#ifndef DRMPLAY_VERSION_H
+#define DRMPLAY_VERSION_H
+
+#define DRMPLAY_API_VERSION ".101"
+
+#endif /* DRMPLAY_VERSION_H */
diff --git a/mm-core/inc/qc_omx_common.h b/mm-core/inc/qc_omx_common.h
new file mode 100755
index 00000000..a673d3cd
--- /dev/null
+++ b/mm-core/inc/qc_omx_common.h
@@ -0,0 +1,65 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+*//** @file qc_omx_common.h
+ This module contains the definitions of the OpenMAX core.
+
+*//*========================================================================*/
+
+#ifndef QC_OMX_COMMON_H
+#define QC_OMX_COMMON_H
+
+
+#include <stdio.h> // Standard IO
+#include "OMX_Core.h" // OMX API
+#include "OMX_QCOMExtns.h" // OMX API
+
+#define OMX_CORE_MAX_CMP 1 // MAX Components supported
+#define OMX_CORE_MAX_CMP_ROLES 1 // MAX Roles per component
+#define OMX_SPEC_VERSION 0x00000101 // OMX Version
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void * (*create_qc_omx_component)(void);
+
+#ifdef _ANDROID_
+#define LOG_TAG "QC_CORE"
+#endif
+#include "qc_omx_msg.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mm-core/inc/qc_omx_component.h b/mm-core/inc/qc_omx_component.h
new file mode 100755
index 00000000..ad226d00
--- /dev/null
+++ b/mm-core/inc/qc_omx_component.h
@@ -0,0 +1,183 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o m p o n e n t I n t e r f a c e
+
+*//** @file qc_omx_component.h
+ This module contains the abstract interface for the OpenMAX components.
+
+*//*========================================================================*/
+
+#ifndef QC_OMX_COMPONENT_H
+#define QC_OMX_COMPONENT_H
+//////////////////////////////////////////////////////////////////////////////
+// Include Files
+//////////////////////////////////////////////////////////////////////////////
+#include "OMX_Core.h"
+#include "OMX_Component.h"
+
+class qc_omx_component
+{
+
+public:
+ /* single member to hold the vtable */
+ OMX_COMPONENTTYPE m_cmp;
+
+public:
+
+ // this is critical, otherwise, sub class destructor will not be called
+ virtual ~qc_omx_component(){}
+
+ // Initialize the component after creation
+ virtual OMX_ERRORTYPE component_init(OMX_IN OMX_STRING componentName)=0;
+
+ /*******************************************************************/
+ /* Standard OpenMAX Methods */
+ /*******************************************************************/
+
+ // Query the component for its information
+ virtual
+ OMX_ERRORTYPE get_component_version(OMX_HANDLETYPE cmp_handle,
+ OMX_STRING cmp_name,
+ OMX_VERSIONTYPE* cmp_version,
+ OMX_VERSIONTYPE* spec_version,
+ OMX_UUIDTYPE* cmp_UUID)=0;
+
+ // Invoke a command on the component
+ virtual
+ OMX_ERRORTYPE send_command(OMX_HANDLETYPE cmp_handle,
+ OMX_COMMANDTYPE cmd,
+ OMX_U32 param1,
+ OMX_PTR cmd_data)=0;
+
+ // Get a Parameter setting from the component
+ virtual
+ OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE cmp_handle,
+ OMX_INDEXTYPE param_index,
+ OMX_PTR param_data)=0;
+
+ // Send a parameter structure to the component
+ virtual
+ OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE cmp_handle,
+ OMX_INDEXTYPE param_index,
+ OMX_PTR param_data)=0;
+
+ // Get a configuration structure from the component
+ virtual
+ OMX_ERRORTYPE get_config(OMX_HANDLETYPE cmp_handle,
+ OMX_INDEXTYPE config_index,
+ OMX_PTR config_data)=0;
+
+ // Set a component configuration value
+ virtual
+ OMX_ERRORTYPE set_config(OMX_HANDLETYPE cmp_handle,
+ OMX_INDEXTYPE config_index,
+ OMX_PTR config_data)=0;
+
+ // Translate the vendor specific extension string to
+ // standardized index type
+ virtual
+ OMX_ERRORTYPE get_extension_index(OMX_HANDLETYPE cmp_handle,
+ OMX_STRING paramName,
+ OMX_INDEXTYPE* indexType)=0;
+
+ // Get Current state information
+ virtual
+ OMX_ERRORTYPE get_state(OMX_HANDLETYPE cmp_handle,
+ OMX_STATETYPE* state)=0;
+
+ // Component Tunnel Request
+ virtual
+ OMX_ERRORTYPE component_tunnel_request(OMX_HANDLETYPE cmp_handle,
+ OMX_U32 port,
+ OMX_HANDLETYPE peer_component,
+ OMX_U32 peer_port,
+ OMX_TUNNELSETUPTYPE* tunnel_setup)=0;
+
+ // Use a buffer already allocated by the IL client
+ // or a buffer already supplied by a tunneled component
+ virtual
+ OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE cmp_handle,
+ OMX_BUFFERHEADERTYPE** buffer_hdr,
+ OMX_U32 port,
+ OMX_PTR app_data,
+ OMX_U32 bytes,
+ OMX_U8* buffer)=0;
+
+
+ // Request that the component allocate new buffer and associated header
+ virtual
+ OMX_ERRORTYPE allocate_buffer(OMX_HANDLETYPE cmp_handle,
+ OMX_BUFFERHEADERTYPE** buffer_hdr,
+ OMX_U32 port,
+ OMX_PTR app_data,
+ OMX_U32 bytes)=0;
+
+ // Release the buffer and associated header from the component
+ virtual
+ OMX_ERRORTYPE free_buffer(OMX_HANDLETYPE cmp_handle,
+ OMX_U32 port,
+ OMX_BUFFERHEADERTYPE* buffer)=0;
+
+ // Send a filled buffer to an input port of a component
+ virtual
+ OMX_ERRORTYPE empty_this_buffer(OMX_HANDLETYPE cmp_handle,
+ OMX_BUFFERHEADERTYPE* buffer)=0;
+
+ // Send an empty buffer to an output port of a component
+ virtual
+ OMX_ERRORTYPE fill_this_buffer(OMX_HANDLETYPE cmp_handle,
+ OMX_BUFFERHEADERTYPE* buffer)=0;
+
+ // Set callbacks
+ virtual
+ OMX_ERRORTYPE set_callbacks( OMX_HANDLETYPE cmp_handle,
+ OMX_CALLBACKTYPE* callbacks,
+ OMX_PTR app_data)=0;
+
+ // Component De-Initialize
+ virtual
+ OMX_ERRORTYPE component_deinit( OMX_HANDLETYPE cmp_handle)=0;
+
+ // Use the Image already allocated via EGL
+ virtual
+ OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE cmp_handle,
+ OMX_BUFFERHEADERTYPE** buffer_hdr,
+ OMX_U32 port,
+ OMX_PTR app_data,
+ void* egl_image)=0;
+
+ // Component Role enum
+ virtual
+ OMX_ERRORTYPE component_role_enum( OMX_HANDLETYPE cmp_handle,
+ OMX_U8* role,
+ OMX_U32 index)=0;
+
+};
+#endif /* QC_OMX_COMPONENT_H */
diff --git a/mm-core/inc/qc_omx_msg.h b/mm-core/inc/qc_omx_msg.h
new file mode 100755
index 00000000..53ee9088
--- /dev/null
+++ b/mm-core/inc/qc_omx_msg.h
@@ -0,0 +1,57 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*==========================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+*//** @file qc_omx_msg.h
+ This module contains the definitions of the OpenMAX core.
+
+*//*========================================================================*/
+
+#ifndef _QC_OMX_MSG_H_
+#define _QC_OMX_MSG_H_
+
+#ifdef _ENABLE_QC_MSG_LOG_
+ #ifdef _ANDROID_
+ #include <utils/Log.h>
+ #define DEBUG_PRINT_ERROR LOGE
+ #define DEBUG_PRINT LOGI
+ #define DEBUG_DETAIL LOGV
+ #else
+ #define DEBUG_PRINT_ERROR printf
+ #define DEBUG_PRINT printf
+ #define DEBUG_DETAIL printf
+ #endif // _ANDROID_
+#else
+ #define DEBUG_PRINT_ERROR
+ #define DEBUG_PRINT
+ #define DEBUG_DETAIL
+#endif // _ENABLE_QC_MSG_LOG_
+
+#endif // _QC_OMX_MSG_H_
diff --git a/mm-core/omxcore/Android.mk b/mm-core/omxcore/Android.mk
index aa9383e3..f27e3926 100644
--- a/mm-core/omxcore/Android.mk
+++ b/mm-core/omxcore/Android.mk
@@ -28,8 +28,6 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-#OMXCORE_CFLAGS := -g -O3 -DVERBOSE
-#OMXCORE_CFLAGS += -O0 -fno-inline -fno-short-enums
OMXCORE_CFLAGS += -D_ANDROID_
OMXCORE_CFLAGS += -D_ENABLE_QC_MSG_LOG_
diff --git a/mm-core/src/7627A/qc_registry_table.c b/mm-core/src/7627A/qc_registry_table.c
new file mode 100755
index 00000000..ad0d83e5
--- /dev/null
+++ b/mm-core/src/7627A/qc_registry_table.c
@@ -0,0 +1,780 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011,2012 Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the registry table for the QCOM's OpenMAX core.
+
+*//*========================================================================*/
+
+#include "qc_omx_core.h"
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxH264Dec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.ittiam.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxIttiamVenc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+ {
+ "OMX.ittiam.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxIttiamVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.ittiam.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxIttiamVdec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vc1",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmvDec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.real",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxrv9Dec.so",
+ {
+ "video_decoder.real"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVidEnc.so",
+ {
+ "video_encoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.spark",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.spark"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vp",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxOn2Dec.so",
+ {
+ "video_decoder.vp"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vp8",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVp8Dec.so",
+ {
+ "video_decoder.vp8"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVidEnc.so",
+ {
+ "video_encoder.h263",
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVidEnc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.mp3",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxMp3Dec.so",
+ #else
+ "libmm-adec-omxmp3.so.1",
+ #endif
+ {
+ "audio_decoder.mp3"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAacDec.so",
+ #else
+ "libmm-adec-omxaac.so.1",
+ #endif
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.mp3",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxMp3Dec.so",
+ #else
+ "libmm-adec-omxmp3.so.1",
+ #endif
+ {
+ "audio_decoder.mp3"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAacDec.so",
+ #else
+ "libmm-adec-omxaac.so.1",
+ #endif
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAmrDec.so",
+ #else
+ "libmm-adec-omxamr.so.1",
+ #endif
+ {
+ "audio_decoder.amrnb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAmrDec.so",
+ #else
+ "libmm-adec-omxamr.so.1",
+ #endif
+ {
+ "audio_decoder.amrnb"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAacEnc.so",
+ #else
+ "libmm-aenc-omxaac.so.1",
+ #endif
+ {
+ "audio_encoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.Qcelp13Hw",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxQcelpHwDec.so",
+ #else
+ "libmm-adec-omxQcelp13.so.1",
+ #endif
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.Qcelp13Hw",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxQcelpHwDec.so",
+ #else
+ "libmm-adec-omxQcelp13.so.1",
+ #endif
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.evrchw",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxEvrcHwDec.so",
+ #else
+ "libmm-adec-omxevrc.so.1",
+ #endif
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxEvrcHwDec.so",
+ #else
+ "libmm-adec-omxevrc.so.1",
+ #endif
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.amr",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAmrEnc.so",
+ #else
+ "libmm-aenc-omxamr.so.1",
+ #endif
+ {
+ "audio_encoder.amr"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxWmaDec.so",
+ #else
+ "libmm-adec-omxwma.so.1",
+ #endif
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxWmaDec.so",
+ #else
+ "libmm-adec-omxwma.so.1",
+ #endif
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma10Pro",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxWmaDec.so",
+ #else
+ "libmm-adec-omxwma.so.1",
+ #endif
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.wma10Pro",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxWmaDec.so",
+ #else
+ "libmm-adec-omxwma.so.1",
+ #endif
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.amrwb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAmrwbDec.so",
+ #else
+ "libmm-adec-omxamrwb.so.1",
+ #endif
+ {
+ "audio_decoder.amrwb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.amrwb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAmrwbDec.so",
+ #else
+ "libmm-adec-omxamrwb.so.1",
+ #endif
+ {
+ "audio_decoder.amrwb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.amrwbp",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAmrwbDec.so",
+ #else
+ "libmm-adec-omxamrwb.so.1",
+ #endif
+ {
+ "audio_decoder.amrwbp"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.amrwbp",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxAmrwbDec.so",
+ #else
+ "libmm-adec-omxamrwb.so.1",
+ #endif
+ {
+ "audio_decoder.amrwbp"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxQcelp13Enc.so",
+ #else
+ "libmm-aenc-omxqcelp13.so.1",
+ #endif
+ {
+ "audio_encoder.qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxQcelp13Enc.so",
+ #else
+ "libmm-aenc-omxqcelp13.so.1",
+ #endif
+ {
+ "audio_encoder.qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxEvrcEnc.so",
+ #else
+ "libmm-aenc-omxevrc.so.1",
+ #endif
+ {
+ "audio_encoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxEvrcEnc.so",
+ #else
+ "libmm-aenc-omxevrc.so.1",
+ #endif
+ {
+ "audio_encoder.evrc"
+ }
+ },
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-core/src/7627A/qc_registry_table_android.c b/mm-core/src/7627A/qc_registry_table_android.c
new file mode 100755
index 00000000..5cfb6f4a
--- /dev/null
+++ b/mm-core/src/7627A/qc_registry_table_android.c
@@ -0,0 +1,679 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the registry table for the QCOM's OpenMAX core.
+
+*//*========================================================================*/
+
+
+#include "qc_omx_core.h"
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxH264Dec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.ittiam.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxIttiamVenc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+ {
+ "OMX.ittiam.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxIttiamVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.ittiam.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxIttiamVdec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx",
+ NULL, // Create instance function
+ //Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx4",
+ NULL, // Create instance function
+ //Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vc1",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmvDec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.real",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxrv9Dec.so",
+ {
+ "video_decoder.real"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.spark",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMpeg4Dec.so",
+ {
+ "video_decoder.spark"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vp",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxOn2Dec.so",
+ {
+ "video_decoder.vp"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vp8",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVp8Dec.so",
+ {
+ "video_decoder.vp8"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVidEnc.so",
+ {
+ "video_encoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVidEnc.so",
+ {
+ "video_encoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVidEnc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.mp3",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMp3Dec.so",
+ {
+ "audio_decoder.mp3"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.Qcelp13Hw",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelpHwDec.so",
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.Qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Dec.so",
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.evrchw",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcHwDec.so",
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcDec.so",
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.amrwbp",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrwbDec.so",
+ {
+ "audio_decoder.amrwbp"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma10Pro",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxEvrcEnc.so",
+ #else
+ "libmm-aenc-omxevrc.so.1",
+ #endif
+ {
+ "audio_encoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "libOmxQcelp13Enc.so",
+ #else
+ "libmm-aenc-omxqcelp13.so.1",
+ #endif
+ {
+ "audio_encoder.qcelp13"
+ }
+ },
+#ifndef _ANDROID_
+ {
+ "OMX.qcom.audio.decoder.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrDec.so",
+ {
+ "audio_decoder.amrnb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.amrwb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrwbDec.so",
+ {
+ "audio_decoder.amrwb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.mp3",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMp3Dec.so",
+ {
+ "audio_decoder.mp3"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrDec.so",
+ {
+ "audio_decoder.amrnb"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacEnc.so",
+ {
+ "audio_encoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.Qcelp13Hw",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelpHwDec.so",
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcHwDec.so",
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.amr",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrEnc.so",
+ {
+ "audio_encoder.amr"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.amrwb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ }
+ NULL, // Shared object library handle
+ "libOmxAmrwbDec.so",
+ {
+ "audio_decoder.amrwb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.amrwbp",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrwbDec.so",
+ {
+ "audio_decoder.amrwbp"
+ }
+ }
+#endif
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-core/src/8660/qc_registry_table.c b/mm-core/src/8660/qc_registry_table.c
new file mode 100755
index 00000000..3253370c
--- /dev/null
+++ b/mm-core/src/8660/qc_registry_table.c
@@ -0,0 +1,671 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Code Aurora Forum, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the registry table for the QCOM's OpenMAX core.
+
+*//*========================================================================*/
+
+#include "qc_omx_core.h"
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vc1",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.wmv",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx311",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.h263",
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.mp3",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMp3Dec.so",
+ {
+ "audio_decoder.mp3"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.multiaac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.mp3",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMp3Dec.so",
+ {
+ "audio_decoder.mp3"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.multiaac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacEnc.so",
+ {
+ "audio_encoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.Qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Dec.so",
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.Qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Dec.so",
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcDec.so",
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcDec.so",
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrEnc.so",
+ {
+ "audio_encoder.amrnb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wmaLossLess",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.wmaLossLess",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma10Pro",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.wma10Pro",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Enc.so",
+ {
+ "audio_encoder.qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.tunneled.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcEnc.so",
+ {
+ "audio_encoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.adpcm",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAdpcmDec.so",
+ {
+ "audio_decoder.adpcm"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.tunneled.adpcm",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAdpcmDec.so",
+ {
+ "audio_decoder.adpcm"
+ }
+ },
+ {
+ "OMX.qcom.file.muxer",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+
+ "libOmxMux.so",
+ {
+ "container_muxer.mp2"
+ }
+},
+ {
+ "OMX.qcom.audio.encoder.tunneled.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacEnc.so",
+ {
+ "audio_encoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacEnc.so",
+ {
+ "audio_encoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Enc.so",
+ {
+ "audio_encoder.qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcEnc.so",
+ {
+ "audio_encoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrEnc.so",
+ {
+ "audio_encoder.amrnb"
+ }
+ },
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-core/src/8660/qc_registry_table_android.c b/mm-core/src/8660/qc_registry_table_android.c
new file mode 100755
index 00000000..2ab2cfc6
--- /dev/null
+++ b/mm-core/src/8660/qc_registry_table_android.c
@@ -0,0 +1,468 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Code Aurora Forum, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the registry table for the QCOM's OpenMAX core.
+
+*//*========================================================================*/
+
+
+#include "qc_omx_core.h"
+#ifdef ENABLE_DRMPLAY
+#include "drmplay_version.h"
+#endif
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.avc.secure",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx311",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg2",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.mpeg2"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vc1",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.wmv",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.Qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Dec.so",
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcDec.so",
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma10Pro",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wmaLossLess",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacEnc.so",
+ {
+ "audio_encoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Enc.so",
+ {
+ "audio_encoder.qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcEnc.so",
+ {
+ "audio_encoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrEnc.so",
+ {
+ "audio_encoder.amrnb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.multiaac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+#ifdef ENABLE_DRMPLAY
+ {
+ "drm.play" DRMPLAY_API_VERSION,
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libDrmPlay.so",
+ {
+ "drm.play" DRMPLAY_API_VERSION
+ }
+ },
+ {
+ "OMX.qcom.file.muxer",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMux.so",
+ {
+ "container_muxer.mp2"
+ }
+ }
+#endif
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-core/src/8960/qc_registry_table.c b/mm-core/src/8960/qc_registry_table.c
new file mode 100755
index 00000000..ac47efce
--- /dev/null
+++ b/mm-core/src/8960/qc_registry_table.c
@@ -0,0 +1,272 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Code Aurora Forum, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the registry table for the QCOM's OpenMAX core.
+
+*//*========================================================================*/
+
+#include "qc_omx_core.h"
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vc1",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.wmv",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.file.muxer",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+
+ "libOmxMux.so",
+ {
+ "container_muxer.mp2"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx311",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.h263",
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.multiaac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-core/src/8960/qc_registry_table_android.c b/mm-core/src/8960/qc_registry_table_android.c
new file mode 100755
index 00000000..72b178e1
--- /dev/null
+++ b/mm-core/src/8960/qc_registry_table_android.c
@@ -0,0 +1,463 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Code Aurora Forum, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the registry table for the QCOM's OpenMAX core.
+
+*//*========================================================================*/
+
+
+#include "qc_omx_core.h"
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.avc.secure",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx311",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg2",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.mpeg2"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vc1",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.wmv",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.Qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Dec.so",
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcDec.so",
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma10Pro",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacEnc.so",
+ {
+ "audio_encoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Enc.so",
+ {
+ "audio_encoder.qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcEnc.so",
+ {
+ "audio_encoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrEnc.so",
+ {
+ "audio_encoder.amrnb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.multiaac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "drm.play",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libDrmPlay.so",
+ {
+ "drm.play"
+ }
+ },
+ {
+ "OMX.qcom.file.muxer",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMux.so",
+ {
+ "container_muxer.mp2"
+ }
+ }
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-core/src/8974/qc_registry_table.c b/mm-core/src/8974/qc_registry_table.c
new file mode 100755
index 00000000..9d7c905b
--- /dev/null
+++ b/mm-core/src/8974/qc_registry_table.c
@@ -0,0 +1,448 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Code Aurora Forum, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the registry table for the QCOM's OpenMAX core.
+
+*//*========================================================================*/
+
+#include "qc_omx_core.h"
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vc1",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.wmv",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.file.muxer",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+
+ "libOmxMux.so",
+ {
+ "container_muxer.mp2"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx311",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vp8",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vp8"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.h263",
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+{
+ "OMX.qcom.video.encoder.vp8",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.vp8",
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.Qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Dec.so",
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcDec.so",
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma10Pro",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacEnc.so",
+ {
+ "audio_encoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Enc.so",
+ {
+ "audio_encoder.qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcEnc.so",
+ {
+ "audio_encoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrEnc.so",
+ {
+ "audio_encoder.amrnb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.multiaac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-core/src/8974/qc_registry_table_android.c b/mm-core/src/8974/qc_registry_table_android.c
new file mode 100755
index 00000000..9be74928
--- /dev/null
+++ b/mm-core/src/8974/qc_registry_table_android.c
@@ -0,0 +1,495 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Code Aurora Forum, Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the registry table for the QCOM's OpenMAX core.
+
+*//*========================================================================*/
+
+
+#include "qc_omx_core.h"
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.video.decoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.avc.secure",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.avc"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.divx311",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.divx"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.mpeg2",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.mpeg2"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.vc1",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.wmv",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vc1"
+ }
+ },
+ {
+ "OMX.qcom.video.decoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.h263"
+ }
+ },
+{
+ "OMX.qcom.video.decoder.vp8",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVdec.so",
+ {
+ "video_decoder.vp8"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.mpeg4",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.mpeg4"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.h263",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.h263"
+ }
+ },
+ {
+ "OMX.qcom.video.encoder.avc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.avc"
+ }
+ },
+{
+ "OMX.qcom.video.encoder.vp8",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxVenc.so",
+ {
+ "video_encoder.vp8"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.Qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Dec.so",
+ {
+ "audio_decoder.Qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcDec.so",
+ {
+ "audio_decoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.wma10Pro",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxWmaDec.so",
+ {
+ "audio_decoder.wma"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacEnc.so",
+ {
+ "audio_encoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.qcelp13",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxQcelp13Enc.so",
+ {
+ "audio_encoder.qcelp13"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.evrc",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxEvrcEnc.so",
+ {
+ "audio_encoder.evrc"
+ }
+ },
+ {
+ "OMX.qcom.audio.encoder.amrnb",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAmrEnc.so",
+ {
+ "audio_encoder.amrnb"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.aac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "OMX.qcom.audio.decoder.multiaac",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxAacDec.so",
+ {
+ "audio_decoder.aac"
+ }
+ },
+ {
+ "drm.play",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libDrmPlay.so",
+ {
+ "drm.play"
+ }
+ },
+ {
+ "OMX.qcom.file.muxer",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "libOmxMux.so",
+ {
+ "container_muxer.mp2"
+ }
+ }
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-core/src/common/omx_core_cmp.cpp b/mm-core/src/common/omx_core_cmp.cpp
new file mode 100755
index 00000000..dfe04667
--- /dev/null
+++ b/mm-core/src/common/omx_core_cmp.cpp
@@ -0,0 +1,406 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the implementation of the OpenMAX core Macros which
+ operate directly on the component.
+
+*//*========================================================================*/
+
+//////////////////////////////////////////////////////////////////////////////
+// Include Files
+//////////////////////////////////////////////////////////////////////////////
+#include "qc_omx_common.h"
+#include "omx_core_cmp.h"
+#include "qc_omx_component.h"
+#include <string.h>
+
+
+void * qc_omx_create_component_wrapper(OMX_PTR obj_ptr)
+{
+ qc_omx_component *pThis = (qc_omx_component *)obj_ptr;
+ OMX_COMPONENTTYPE* component = &(pThis->m_cmp);
+ memset(&pThis->m_cmp,0,sizeof(OMX_COMPONENTTYPE));
+
+ component->nSize = sizeof(OMX_COMPONENTTYPE);
+ component->nVersion.nVersion = OMX_SPEC_VERSION;
+ component->pApplicationPrivate = 0;
+ component->pComponentPrivate = obj_ptr;
+
+ component->AllocateBuffer = &qc_omx_component_allocate_buffer;
+ component->FreeBuffer = &qc_omx_component_free_buffer;
+ component->GetParameter = &qc_omx_component_get_parameter;
+ component->SetParameter = &qc_omx_component_set_parameter;
+ component->SendCommand = &qc_omx_component_send_command;
+ component->FillThisBuffer = &qc_omx_component_fill_this_buffer;
+ component->EmptyThisBuffer = &qc_omx_component_empty_this_buffer;
+ component->GetState = &qc_omx_component_get_state;
+ component->GetComponentVersion = &qc_omx_component_get_version;
+ component->GetConfig = &qc_omx_component_get_config;
+ component->SetConfig = &qc_omx_component_set_config;
+ component->GetExtensionIndex = &qc_omx_component_get_extension_index;
+ component->ComponentTunnelRequest = &qc_omx_component_tunnel_request;
+ component->UseBuffer = &qc_omx_component_use_buffer;
+ component->SetCallbacks = &qc_omx_component_set_callbacks;
+ component->UseEGLImage = &qc_omx_component_use_EGL_image;
+ component->ComponentRoleEnum = &qc_omx_component_role_enum;
+ component->ComponentDeInit = &qc_omx_component_deinit;
+ return (void *)component;
+}
+
+
+
+/************************************************************************/
+/* COMPONENT INTERFACE */
+/************************************************************************/
+
+OMX_ERRORTYPE
+qc_omx_component_init(OMX_IN OMX_HANDLETYPE hComp, OMX_IN OMX_STRING componentName)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_init %x\n",(unsigned)hComp);
+
+ if(pThis)
+ {
+ // call the init fuction
+ eRet = pThis->component_init(componentName);
+
+ if(eRet != OMX_ErrorNone)
+ {
+ // in case of error, please destruct the component created
+ delete pThis;
+ }
+ }
+ return eRet;
+}
+
+
+OMX_ERRORTYPE
+qc_omx_component_get_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_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_get_version %x, %s , %x\n",(unsigned)hComp,componentName,(unsigned)componentVersion);
+ if(pThis)
+ {
+ eRet = pThis->get_component_version(hComp,componentName,componentVersion,specVersion,componentUUID);
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE
+qc_omx_component_send_command(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_COMMANDTYPE cmd,
+ OMX_IN OMX_U32 param1,
+ OMX_IN OMX_PTR cmdData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_send_command %x, %d , %d\n",(unsigned)hComp,(unsigned)cmd,(unsigned)param1);
+
+ if(pThis)
+ {
+ eRet = pThis->send_command(hComp,cmd,param1,cmdData);
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE
+qc_omx_component_get_parameter(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_INOUT OMX_PTR paramData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_get_parameter %x, %x , %d\n",(unsigned)hComp,(unsigned)paramData,paramIndex);
+
+ if(pThis)
+ {
+ eRet = pThis->get_parameter(hComp,paramIndex,paramData);
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE
+qc_omx_component_set_parameter(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_IN OMX_PTR paramData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_set_parameter %x, %x , %d\n",(unsigned)hComp,(unsigned)paramData,paramIndex);
+
+ if(pThis)
+ {
+ eRet = pThis->set_parameter(hComp,paramIndex,paramData);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_get_config(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_INOUT OMX_PTR configData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_get_config %x\n",(unsigned)hComp);
+
+ if(pThis)
+ {
+ eRet = pThis->get_config(hComp,
+ configIndex,
+ configData);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_set_config(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_IN OMX_PTR configData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_set_config %x\n",(unsigned)hComp);
+
+ if(pThis)
+ {
+ eRet = pThis->set_config(hComp,
+ configIndex,
+ configData);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_STRING paramName,
+ OMX_OUT OMX_INDEXTYPE* indexType)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ if(pThis)
+ {
+ eRet = pThis->get_extension_index(hComp,paramName,indexType);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_get_state(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STATETYPE* state)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_get_state %x\n",(unsigned)hComp);
+
+ if(pThis)
+ {
+ eRet = pThis->get_state(hComp,state);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_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)
+{
+ DEBUG_PRINT("Error: qc_omx_component_tunnel_request Not Implemented\n");
+ return OMX_ErrorNotImplemented;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_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_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_use_buffer %x\n",(unsigned)hComp);
+
+ if(pThis)
+ {
+ eRet = pThis->use_buffer(hComp,
+ bufferHdr,
+ port,
+ appData,
+ bytes,
+ buffer);
+ }
+ return eRet;
+}
+
+
+// qc_omx_component_allocate_buffer -- API Call
+ OMX_ERRORTYPE
+qc_omx_component_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_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_allocate_buffer %x, %x , %d\n",(unsigned)hComp,(unsigned)bufferHdr,(unsigned)port);
+
+ if(pThis)
+ {
+ eRet = pThis->allocate_buffer(hComp,bufferHdr,port,appData,bytes);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_free_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_free_buffer[%d] %x, %x\n", (unsigned)port, (unsigned)hComp, (unsigned)buffer);
+
+ if(pThis)
+ {
+ eRet = pThis->free_buffer(hComp,port,buffer);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_empty_this_buffer %x, %x\n",(unsigned)hComp,(unsigned)buffer);
+
+ if(pThis)
+ {
+ eRet = pThis->empty_this_buffer(hComp,buffer);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_fill_this_buffer %x, %x\n",(unsigned)hComp,(unsigned)buffer);
+ if(pThis)
+ {
+ eRet = pThis->fill_this_buffer(hComp,buffer);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_set_callbacks(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_CALLBACKTYPE* callbacks,
+ OMX_IN OMX_PTR appData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_set_callbacks %x, %x , %x\n",(unsigned)hComp,(unsigned)callbacks,(unsigned)appData);
+
+ if(pThis)
+ {
+ eRet = pThis->set_callbacks(hComp,callbacks,appData);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_deinit(OMX_IN OMX_HANDLETYPE hComp)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_deinit %x\n",(unsigned)hComp);
+
+ if(pThis)
+ {
+ // call the deinit fuction first
+ OMX_STATETYPE state;
+ pThis->get_state(hComp,&state);
+ DEBUG_PRINT("Calling FreeHandle in state %d \n", state);
+ eRet = pThis->component_deinit(hComp);
+ // destroy the component.
+ delete pThis;
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_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_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_use_EGL_image %x, %x , %d\n",(unsigned)hComp,(unsigned)bufferHdr,(unsigned)port);
+ if(pThis)
+ {
+ eRet = pThis->use_EGL_image(hComp,bufferHdr,port,appData,eglImage);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_U8* role,
+ OMX_IN OMX_U32 index)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_role_enum %x, %x , %d\n",(unsigned)hComp,(unsigned)role,(unsigned)index);
+
+ if(pThis)
+ {
+ eRet = pThis->component_role_enum(hComp,role,index);
+ }
+ return eRet;
+}
diff --git a/mm-core/src/common/omx_core_cmp.h b/mm-core/src/common/omx_core_cmp.h
new file mode 100755
index 00000000..1daf26ed
--- /dev/null
+++ b/mm-core/src/common/omx_core_cmp.h
@@ -0,0 +1,160 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ OpenMAX Core Macros interface.
+
+============================================================================*/
+
+//////////////////////////////////////////////////////////////////////////////
+// Include Files
+//////////////////////////////////////////////////////////////////////////////
+#ifndef OMX_CORE_CMP_H
+#define OMX_CORE_CMP_H
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+void * qc_omx_create_component_wrapper(OMX_PTR obj_ptr);
+
+
+OMX_ERRORTYPE
+qc_omx_component_init(OMX_IN OMX_HANDLETYPE hComp, OMX_IN OMX_STRING componentName);
+
+
+OMX_ERRORTYPE
+qc_omx_component_get_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_ERRORTYPE
+qc_omx_component_send_command(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_COMMANDTYPE cmd,
+ OMX_IN OMX_U32 param1,
+ OMX_IN OMX_PTR cmdData);
+
+OMX_ERRORTYPE
+qc_omx_component_get_parameter(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_INOUT OMX_PTR paramData);
+
+OMX_ERRORTYPE
+qc_omx_component_set_parameter(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_IN OMX_PTR paramData);
+
+OMX_ERRORTYPE
+qc_omx_component_get_config(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_INOUT OMX_PTR configData);
+
+OMX_ERRORTYPE
+qc_omx_component_set_config(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_IN OMX_PTR configData);
+
+OMX_ERRORTYPE
+qc_omx_component_get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_STRING paramName,
+ OMX_OUT OMX_INDEXTYPE* indexType);
+
+OMX_ERRORTYPE
+qc_omx_component_get_state(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STATETYPE* state);
+
+OMX_ERRORTYPE
+qc_omx_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_ERRORTYPE
+qc_omx_component_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);
+
+
+// qc_omx_component_allocate_buffer -- API Call
+OMX_ERRORTYPE
+qc_omx_component_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_ERRORTYPE
+qc_omx_component_free_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer);
+
+OMX_ERRORTYPE
+qc_omx_component_empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer);
+
+OMX_ERRORTYPE
+qc_omx_component_fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer);
+
+OMX_ERRORTYPE
+qc_omx_component_set_callbacks(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_CALLBACKTYPE* callbacks,
+ OMX_IN OMX_PTR appData);
+
+OMX_ERRORTYPE
+qc_omx_component_deinit(OMX_IN OMX_HANDLETYPE hComp);
+
+OMX_ERRORTYPE
+qc_omx_component_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_ERRORTYPE
+qc_omx_component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_U8* role,
+ OMX_IN OMX_U32 index);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/mm-core/src/common/qc_omx_core.c b/mm-core/src/common/qc_omx_core.c
new file mode 100755
index 00000000..f332f65b
--- /dev/null
+++ b/mm-core/src/common/qc_omx_core.c
@@ -0,0 +1,830 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the implementation of the OpenMAX core.
+
+*//*========================================================================*/
+
+//////////////////////////////////////////////////////////////////////////////
+// Include Files
+//////////////////////////////////////////////////////////////////////////////
+
+#include <dlfcn.h> // dynamic library
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <pthread.h>
+
+#include "qc_omx_core.h"
+#include "omx_core_cmp.h"
+
+extern omx_core_cb_type core[];
+extern const unsigned int SIZE_OF_CORE;
+static pthread_mutex_t lock_core = PTHREAD_MUTEX_INITIALIZER;
+
+/* ======================================================================
+FUNCTION
+ omx_core_load_cmp_library
+
+DESCRIPTION
+ Loads up the libary name mentioned in the argument
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ Constructor for creating component instances.
+========================================================================== */
+static create_qc_omx_component
+omx_core_load_cmp_library(char *libname, void **handle_ptr)
+{
+ create_qc_omx_component fn_ptr = NULL;
+ if(handle_ptr)
+ {
+ DEBUG_PRINT("Dynamically Loading the library : %s\n",libname);
+ *handle_ptr = dlopen(libname,RTLD_NOW);
+ if(*handle_ptr)
+ {
+ fn_ptr = dlsym(*handle_ptr, "get_omx_component_factory_fn");
+
+ if(fn_ptr == NULL)
+ {
+ DEBUG_PRINT("Error: Library %s incompatible as QCOM OMX component loader - %s\n",
+ libname, dlerror());
+ *handle_ptr = NULL;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT("Error: Couldn't load %s: %s\n",libname,dlerror());
+ }
+ }
+ return fn_ptr;
+}
+
+/* ======================================================================
+FUNCTION
+ OMX_Init
+
+DESCRIPTION
+ This is the first function called by the application.
+ There is nothing to do here since components shall be loaded
+ whenever the get handle method is called.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY
+OMX_Init()
+{
+ DEBUG_PRINT("OMXCORE API - OMX_Init \n");
+ /* Nothing to do here ; shared objects shall be loaded at the get handle method */
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ get_cmp_index
+
+DESCRIPTION
+ Obtains the index associated with the name.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ Error None.
+========================================================================== */
+static int get_cmp_index(char *cmp_name)
+{
+ int rc = -1,i=0;
+ DEBUG_PRINT("before get_cmp_index **********%d\n", rc);
+
+ for(i=0; i< (int)SIZE_OF_CORE; i++)
+ {
+ DEBUG_PRINT("get_cmp_index: cmp_name = %s , core[i].name = %s ,count = %d \n",cmp_name,core[i].name,i);
+
+ if(!strcmp(cmp_name, core[i].name))
+ {
+ rc = i;
+ break;
+ }
+ }
+ DEBUG_PRINT("returning index %d\n", rc);
+ return rc;
+}
+
+/* ======================================================================
+FUNCTION
+ clear_cmp_handle
+
+DESCRIPTION
+ Clears the component handle from the component table.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+static void clear_cmp_handle(OMX_HANDLETYPE inst)
+{
+ unsigned i = 0,j=0;
+
+ if(NULL == inst)
+ return;
+
+ for(i=0; i< SIZE_OF_CORE; i++)
+ {
+ for(j=0; j< OMX_COMP_MAX_INST; j++)
+ {
+ if(inst == core[i].inst[j])
+ {
+ core[i].inst[j] = NULL;
+ return;
+ }
+ }
+ }
+ return;
+}
+/* ======================================================================
+FUNCTION
+ is_cmp_handle_exists
+
+DESCRIPTION
+ Check if the component handle already exists or not.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ index pointer if the handle exists
+ negative value otherwise
+========================================================================== */
+static int is_cmp_handle_exists(OMX_HANDLETYPE inst)
+{
+ unsigned i=0,j=0;
+ int rc = -1;
+
+ if(NULL == inst)
+ return rc;
+
+ pthread_mutex_lock(&lock_core);
+ for(i=0; i< SIZE_OF_CORE; i++)
+ {
+ for(j=0; j< OMX_COMP_MAX_INST; j++)
+ {
+ if(inst == core[i].inst[j])
+ {
+ rc = i;
+ goto finish;
+ }
+ }
+ }
+finish:
+ pthread_mutex_unlock(&lock_core);
+ return rc;
+}
+
+/* ======================================================================
+FUNCTION
+ get_comp_handle_index
+
+DESCRIPTION
+ Gets the index to store the next handle for specified component name.
+
+PARAMETERS
+ cmp_name : Component Name
+
+RETURN VALUE
+ Index of next handle to be stored
+========================================================================== */
+static int get_comp_handle_index(char *cmp_name)
+{
+ unsigned i=0,j=0;
+ int rc = -1;
+ for(i=0; i< SIZE_OF_CORE; i++)
+ {
+ if(!strcmp(cmp_name, core[i].name))
+ {
+ for(j=0; j< OMX_COMP_MAX_INST; j++)
+ {
+ if(NULL == core[i].inst[j])
+ {
+ rc = j;
+ DEBUG_PRINT("free handle slot exists %d\n", rc);
+ return rc;
+ }
+ }
+ break;
+ }
+ }
+ return rc;
+}
+
+/* ======================================================================
+FUNCTION
+ check_lib_unload
+
+DESCRIPTION
+ Check if any component instance is using the library
+
+PARAMETERS
+ index: Component Index in core array.
+
+RETURN VALUE
+ 1: Library Unused and can be unloaded.
+ 0: Library used and shouldnt be unloaded.
+========================================================================== */
+static int check_lib_unload(int index)
+{
+ unsigned i=0;
+ int rc = 1;
+
+ for(i=0; i< OMX_COMP_MAX_INST; i++)
+ {
+ if(core[index].inst[i])
+ {
+ rc = 0;
+ DEBUG_PRINT("Library Used \n");
+ break;
+ }
+ }
+ return rc;
+}
+/* ======================================================================
+FUNCTION
+ is_cmp_already_exists
+
+DESCRIPTION
+ Check if the component already exists or not. Used in the
+ management of component handles.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ Error None.
+========================================================================== */
+static int is_cmp_already_exists(char *cmp_name)
+{
+ unsigned i =0,j=0;
+ int rc = -1;
+ for(i=0; i< SIZE_OF_CORE; i++)
+ {
+ if(!strcmp(cmp_name, core[i].name))
+ {
+ for(j=0; j< OMX_COMP_MAX_INST; j++)
+ {
+ if(core[i].inst[j])
+ {
+ rc = i;
+ DEBUG_PRINT("Component exists %d\n", rc);
+ return rc;
+ }
+ }
+ break;
+ }
+ }
+ return rc;
+}
+
+/* ======================================================================
+FUNCTION
+ get_cmp_handle
+
+DESCRIPTION
+ Get component handle.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ Error None.
+========================================================================== */
+void* get_cmp_handle(char *cmp_name)
+{
+ unsigned i =0,j=0;
+
+ DEBUG_PRINT("get_cmp_handle \n");
+ for(i=0; i< SIZE_OF_CORE; i++)
+ {
+ if(!strcmp(cmp_name, core[i].name))
+ {
+ for(j=0; j< OMX_COMP_MAX_INST; j++)
+ {
+ if(core[i].inst[j])
+ {
+ DEBUG_PRINT("get_cmp_handle match\n");
+ return core[i].inst[j];
+ }
+ }
+ }
+ }
+ DEBUG_PRINT("get_cmp_handle returning NULL \n");
+ return NULL;
+}
+
+/* ======================================================================
+FUNCTION
+ OMX_DeInit
+
+DESCRIPTION
+ DeInitialize all the the relevant OMX components.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ Error None.
+========================================================================== */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY
+OMX_Deinit()
+{
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ OMX_GetHandle
+
+DESCRIPTION
+ Constructs requested component. Relevant library is loaded if needed.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ Error None if everything goes fine.
+========================================================================== */
+
+ OMX_API OMX_ERRORTYPE OMX_APIENTRY
+OMX_GetHandle(OMX_OUT OMX_HANDLETYPE* handle,
+ OMX_IN OMX_STRING componentName,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_CALLBACKTYPE* callBacks)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ int cmp_index = -1;
+ int hnd_index = -1;
+
+ DEBUG_PRINT("OMXCORE API : Get Handle %x %s %x\n",(unsigned) handle,
+ componentName,
+ (unsigned) appData);
+ pthread_mutex_lock(&lock_core);
+ if(handle)
+ {
+ struct stat sd;
+
+ *handle = NULL;
+
+ cmp_index = get_cmp_index(componentName);
+
+ if(cmp_index >= 0)
+ {
+ DEBUG_PRINT("getting fn pointer\n");
+
+ // dynamically load the so
+ core[cmp_index].fn_ptr =
+ omx_core_load_cmp_library(core[cmp_index].so_lib_name,
+ &core[cmp_index].so_lib_handle);
+
+ if(core[cmp_index].fn_ptr)
+ {
+ // Construct the component requested
+ // Function returns the opaque handle
+ void* pThis = (*(core[cmp_index].fn_ptr))();
+ if(pThis)
+ {
+ void *hComp = NULL;
+ hComp = qc_omx_create_component_wrapper((OMX_PTR)pThis);
+ if((eRet = qc_omx_component_init(hComp, core[cmp_index].name)) !=
+ OMX_ErrorNone)
+ {
+ DEBUG_PRINT("Component not created succesfully\n");
+ pthread_mutex_unlock(&lock_core);
+ return eRet;
+
+ }
+ qc_omx_component_set_callbacks(hComp,callBacks,appData);
+ hnd_index = get_comp_handle_index(componentName);
+ if(hnd_index >= 0)
+ {
+ core[cmp_index].inst[hnd_index]= *handle = (OMX_HANDLETYPE) hComp;
+ }
+ else
+ {
+ DEBUG_PRINT("OMX_GetHandle:NO free slot available to store Component Handle\n");
+ pthread_mutex_unlock(&lock_core);
+ return OMX_ErrorInsufficientResources;
+ }
+ DEBUG_PRINT("Component %x Successfully created\n",(unsigned)*handle);
+ }
+ else
+ {
+ eRet = OMX_ErrorInsufficientResources;
+ DEBUG_PRINT("Component Creation failed\n");
+ }
+ }
+ else
+ {
+ eRet = OMX_ErrorNotImplemented;
+ DEBUG_PRINT("library couldnt return create instance fn\n");
+ }
+
+ }
+ else
+ {
+ eRet = OMX_ErrorNotImplemented;
+ DEBUG_PRINT("ERROR: Already another instance active ;rejecting \n");
+ }
+ }
+ else
+ {
+ eRet = OMX_ErrorBadParameter;
+ DEBUG_PRINT("\n OMX_GetHandle: NULL handle \n");
+ }
+ pthread_mutex_unlock(&lock_core);
+ return eRet;
+}
+/* ======================================================================
+FUNCTION
+ OMX_FreeHandle
+
+DESCRIPTION
+ Destructs the component handles.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ Error None.
+========================================================================== */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY
+OMX_FreeHandle(OMX_IN OMX_HANDLETYPE hComp)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ int err = 0, i = 0;
+ DEBUG_PRINT("OMXCORE API : Free Handle %x\n",(unsigned) hComp);
+
+ // 0. Check that we have an active instance
+ if((i=is_cmp_handle_exists(hComp)) >=0)
+ {
+ // 1. Delete the component
+ if ((eRet = qc_omx_component_deinit(hComp)) == OMX_ErrorNone)
+ {
+ pthread_mutex_lock(&lock_core);
+ /* Unload component library */
+ if( (i < SIZE_OF_CORE) && core[i].so_lib_handle)
+ {
+ if(check_lib_unload(i))
+ {
+ DEBUG_PRINT_ERROR(" Unloading the dynamic library for %s\n",
+ core[i].name);
+ err = dlclose(core[i].so_lib_handle);
+ if(err)
+ {
+ DEBUG_PRINT_ERROR("Error %d in dlclose of lib %s\n",
+ err,core[i].name);
+ }
+ core[i].so_lib_handle = NULL;
+ }
+ }
+ clear_cmp_handle(hComp);
+ pthread_mutex_unlock(&lock_core);
+ }
+ else
+ {
+ DEBUG_PRINT(" OMX_FreeHandle failed on %x\n",(unsigned) hComp);
+ return eRet;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("OMXCORE Warning: Free Handle called with no active instances\n");
+ }
+ return OMX_ErrorNone;
+}
+/* ======================================================================
+FUNCTION
+ OMX_SetupTunnel
+
+DESCRIPTION
+ Not Implemented.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY
+OMX_SetupTunnel(OMX_IN OMX_HANDLETYPE outputComponent,
+ OMX_IN OMX_U32 outputPort,
+ OMX_IN OMX_HANDLETYPE inputComponent,
+ OMX_IN OMX_U32 inputPort)
+{
+ /* Not supported right now */
+ DEBUG_PRINT("OMXCORE API: OMX_SetupTunnel Not implemented \n");
+ return OMX_ErrorNotImplemented;
+}
+/* ======================================================================
+FUNCTION
+ OMX_GetContentPipe
+
+DESCRIPTION
+ Not Implemented.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+OMX_API OMX_ERRORTYPE
+OMX_GetContentPipe(OMX_OUT OMX_HANDLETYPE* pipe,
+ OMX_IN OMX_STRING uri)
+{
+ /* Not supported right now */
+ DEBUG_PRINT("OMXCORE API: OMX_GetContentPipe Not implemented \n");
+ return OMX_ErrorNotImplemented;
+}
+
+/* ======================================================================
+FUNCTION
+ OMX_GetComponentNameEnum
+
+DESCRIPTION
+ Returns the component name associated with the index.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY
+OMX_ComponentNameEnum(OMX_OUT OMX_STRING componentName,
+ OMX_IN OMX_U32 nameLen,
+ OMX_IN OMX_U32 index)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ DEBUG_PRINT("OMXCORE API - OMX_ComponentNameEnum %x %d %d\n",(unsigned) componentName
+ ,(unsigned)nameLen
+ ,(unsigned)index);
+ if(index < SIZE_OF_CORE)
+ {
+ #ifdef _ANDROID_
+ strlcpy(componentName, core[index].name,nameLen);
+ #else
+ strncpy(componentName, core[index].name,nameLen);
+ #endif
+ }
+ else
+ {
+ eRet = OMX_ErrorNoMore;
+ }
+ return eRet;
+}
+
+/* ======================================================================
+FUNCTION
+ OMX_GetComponentsOfRole
+
+DESCRIPTION
+ Returns the component name which can fulfill the roles passed in the
+ argument.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+OMX_API OMX_ERRORTYPE
+OMX_GetComponentsOfRole(OMX_IN OMX_STRING role,
+ OMX_INOUT OMX_U32* numComps,
+ OMX_INOUT OMX_U8** compNames)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ unsigned i,j,namecount=0;
+
+ printf(" Inside OMX_GetComponentsOfRole \n");
+
+ /*If CompNames is NULL then return*/
+ if (compNames == NULL)
+ {
+ if (numComps == NULL)
+ {
+ eRet = OMX_ErrorBadParameter;
+ }
+ else
+ {
+ *numComps = 0;
+ for (i=0; i<SIZE_OF_CORE;i++)
+ {
+ for(j=0; j<OMX_CORE_MAX_CMP_ROLES && core[i].roles[j] ; j++)
+ {
+ if(!strcmp(role,core[i].roles[j]))
+ {
+ (*numComps)++;
+ }
+ }
+ }
+ }
+ return eRet;
+ }
+
+ if(numComps)
+ {
+ namecount = *numComps;
+
+ if (namecount == 0)
+ {
+ return OMX_ErrorBadParameter;
+ }
+
+ *numComps = 0;
+
+ for (i=0; i<SIZE_OF_CORE;i++)
+ {
+ for(j=0; j<OMX_CORE_MAX_CMP_ROLES && core[i].roles[j] ; j++)
+ {
+ if(!strcmp(role,core[i].roles[j]))
+ {
+ #ifdef _ANDROID_
+ strlcpy((char *)compNames[*numComps],core[i].name, OMX_MAX_STRINGNAME_SIZE);
+ #else
+ strncpy((char *)compNames[*numComps],core[i].name, OMX_MAX_STRINGNAME_SIZE);
+ #endif
+ (*numComps)++;
+ break;
+ }
+ }
+ if (*numComps == namecount)
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ eRet = OMX_ErrorBadParameter;
+ }
+
+ printf(" Leaving OMX_GetComponentsOfRole \n");
+ return eRet;
+}
+/* ======================================================================
+FUNCTION
+ OMX_GetRolesOfComponent
+
+DESCRIPTION
+ Returns the primary role of the components supported.
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+OMX_API OMX_ERRORTYPE
+OMX_GetRolesOfComponent(OMX_IN OMX_STRING compName,
+ OMX_INOUT OMX_U32* numRoles,
+ OMX_OUT OMX_U8** roles)
+{
+ /* Not supported right now */
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ unsigned i,j,numofroles = 0;;
+ DEBUG_PRINT("GetRolesOfComponent %s\n",compName);
+
+ if (roles == NULL)
+ {
+ if (numRoles == NULL)
+ {
+ eRet = OMX_ErrorBadParameter;
+ }
+ else
+ {
+ *numRoles = 0;
+ for(i=0; i< SIZE_OF_CORE; i++)
+ {
+ if(!strcmp(compName,core[i].name))
+ {
+ for(j=0; (j<OMX_CORE_MAX_CMP_ROLES) && core[i].roles[j];j++)
+ {
+ (*numRoles)++;
+ }
+ break;
+ }
+ }
+
+ }
+ return eRet;
+ }
+
+ if(numRoles)
+ {
+ if (*numRoles == 0)
+ {
+ return OMX_ErrorBadParameter;
+ }
+
+ numofroles = *numRoles;
+ *numRoles = 0;
+ for(i=0; i< SIZE_OF_CORE; i++)
+ {
+ if(!strcmp(compName,core[i].name))
+ {
+ for(j=0; (j<OMX_CORE_MAX_CMP_ROLES) && core[i].roles[j];j++)
+ {
+ if(roles && roles[*numRoles])
+ {
+ #ifdef _ANDROID_
+ strlcpy((char *)roles[*numRoles],core[i].roles[j],OMX_MAX_STRINGNAME_SIZE);
+ #else
+ strncpy((char *)roles[*numRoles],core[i].roles[j],OMX_MAX_STRINGNAME_SIZE);
+ #endif
+ }
+ (*numRoles)++;
+ if (numofroles == *numRoles)
+ {
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ DEBUG_PRINT("ERROR: Both Roles and numRoles Invalid\n");
+ eRet = OMX_ErrorBadParameter;
+ }
+ return eRet;
+}
+
+OMX_API OMX_BOOL
+OMXConfigParser(
+ OMX_PTR aInputParameters,
+ OMX_PTR aOutputParameters)
+{
+ OMX_BOOL Status = OMX_TRUE;
+ VideoOMXConfigParserOutputs *aOmxOutputParameters;
+ OMXConfigParserInputs *aOmxInputParameters;
+ aOmxOutputParameters = (VideoOMXConfigParserOutputs *)aOutputParameters;
+ aOmxInputParameters = (OMXConfigParserInputs *)aInputParameters;
+
+ aOmxOutputParameters->width = 176; //setting width to QCIF
+ aOmxOutputParameters->height = 144; //setting height to QCIF
+
+ //TODO
+ //Qcom component do not use the level/profile from IL client .They are parsing the first buffer
+ //sent in ETB so for now setting the defalut values . Going farward we can call
+ //QC parser here.
+ if (0 == strcmp(aOmxInputParameters->cComponentRole, (OMX_STRING)"video_decoder.avc"))
+ {
+ aOmxOutputParameters->profile = 66; //minimum supported h264 profile - setting to baseline profile
+ aOmxOutputParameters->level = 0; // minimum supported h264 level
+ }
+ else if ((0 == strcmp(aOmxInputParameters->cComponentRole, (OMX_STRING)"video_decoder.mpeg4")) || (0 == strcmp(aOmxInputParameters ->cComponentRole, (OMX_STRING)"video_decoder.h263")))
+ {
+ aOmxOutputParameters->profile = 8; //minimum supported h263/mpeg4 profile
+ aOmxOutputParameters->level = 0; // minimum supported h263/mpeg4 level
+ }
+
+ return Status;
+}
diff --git a/mm-core/src/common/qc_omx_core.h b/mm-core/src/common/qc_omx_core.h
new file mode 100755
index 00000000..c3ae26a1
--- /dev/null
+++ b/mm-core/src/common/qc_omx_core.h
@@ -0,0 +1,72 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the definitions of the OpenMAX core.
+
+*//*========================================================================*/
+
+#ifndef QC_OMX_CORE_H
+#define QC_OMX_CORE_H
+
+#include "qc_omx_common.h" // OMX API
+#include <string.h>
+
+#define OMX_COMP_MAX_INST 4
+
+typedef struct _omx_core_cb_type
+{
+ char* name;// Component name
+ create_qc_omx_component fn_ptr;// create instance fn ptr
+ void* inst[OMX_COMP_MAX_INST];// Instance handle
+ void* so_lib_handle;// So Library handle
+ char* so_lib_name;// so directory
+ char* roles[OMX_CORE_MAX_CMP_ROLES];// roles played
+}omx_core_cb_type;
+
+typedef struct
+{
+ OMX_U32 width;
+ OMX_U32 height;
+ OMX_U32 profile;
+ OMX_U32 level;
+} VideoOMXConfigParserOutputs;
+
+
+typedef struct
+{
+ OMX_U8* inPtr; //pointer to codec configuration header
+ OMX_U32 inBytes; //length of codec configuration header
+ OMX_STRING cComponentRole; //OMX component codec type
+ OMX_STRING cComponentName; //OMX component name
+} OMXConfigParserInputs;
+
+#endif
+
diff --git a/mm-core/src/default/qc_registry_table.c b/mm-core/src/default/qc_registry_table.c
new file mode 100755
index 00000000..5cf6dd92
--- /dev/null
+++ b/mm-core/src/default/qc_registry_table.c
@@ -0,0 +1,65 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains a dummy registry table for the QCOM's OpenMAX core
+ with placeholders for actual values
+
+*//*========================================================================*/
+
+#include "qc_omx_core.h"
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.xxx.yyy.zzz",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ #ifdef _ANDROID_
+ "abc.so",
+ #else
+ "efg.so.1",
+ #endif
+ {
+ "ijk.lmn"
+ }
+ }
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-core/src/default/qc_registry_table_android.c b/mm-core/src/default/qc_registry_table_android.c
new file mode 100755
index 00000000..118a111d
--- /dev/null
+++ b/mm-core/src/default/qc_registry_table_android.c
@@ -0,0 +1,62 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains a dummy registry table for the QCOM's OpenMAX core
+ with placeholders for actual values
+
+*//*========================================================================*/
+
+
+#include "qc_omx_core.h"
+
+omx_core_cb_type core[] =
+{
+ {
+ "OMX.qcom.xxx.yyy.zzz",
+ NULL, // Create instance function
+ // Unique instance handle
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
+ NULL, // Shared object library handle
+ "abc.so",
+ {
+ "efg.ijk"
+ }
+ }
+};
+
+const unsigned int SIZE_OF_CORE = sizeof(core) / sizeof(omx_core_cb_type);
+
+
diff --git a/mm-video/Android.mk b/mm-video/Android.mk
index 13756a29..2d0a5335 100644..100755
--- a/mm-video/Android.mk
+++ b/mm-video/Android.mk
@@ -1,39 +1,6 @@
-#--------------------------------------------------------------------------
-#Copyright (c) 2009, Code Aurora Forum. All rights reserved.
-
-#Redistribution and use in source and binary forms, with or without
-#modification, are permitted provided that the following conditions are met:
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# * Neither the name of Code Aurora nor
-# the names of its contributors may be used to endorse or promote
-# products derived from this software without specific prior written
-# permission.
-
-#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-#IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-#NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-#CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-#EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-#PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-#OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-#WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-#OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-#ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#--------------------------------------------------------------------------
-
OMX_VIDEO_PATH := $(call my-dir)
include $(CLEAR_VARS)
-ifneq ($(BUILD_TINY_ANDROID),true)
-
-ifeq ($(TARGET_BOARD_PLATFORM),msm7x30)
- include $(OMX_VIDEO_PATH)/vidc/vdec/Android.mk
- include $(OMX_VIDEO_PATH)/vidc/venc/Android.mk
-endif
-
-endif #BUILD_TINY_ANDROID
+include $(OMX_VIDEO_PATH)/vidc/vdec/Android.mk
+include $(OMX_VIDEO_PATH)/vidc/venc/Android.mk
+include $(OMX_VIDEO_PATH)/DivxDrmDecrypt/Android.mk
diff --git a/mm-video/DivxDrmDecrypt/Android.mk b/mm-video/DivxDrmDecrypt/Android.mk
new file mode 100755
index 00000000..26a2f7ad
--- /dev/null
+++ b/mm-video/DivxDrmDecrypt/Android.mk
@@ -0,0 +1,22 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_CFLAGS := \
+ -D_ANDROID_
+
+LOCAL_SRC_FILES:= \
+ src/DivXDrmDecrypt.cpp
+
+LOCAL_C_INCLUDES:= \
+ $(LOCAL_PATH)/inc \
+ $(TARGET_OUT_HEADERS)/mm-core/omxcore
+
+LOCAL_PRELINK_MODULE:= false
+
+LOCAL_MODULE:= libdivxdrmdecrypt
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SHARED_LIBRARIES := liblog libdl
+
+LOCAL_LDLIBS +=
+include $(BUILD_SHARED_LIBRARY)
diff --git a/mm-video/DivxDrmDecrypt/inc/DivXDrmDecrypt.h b/mm-video/DivxDrmDecrypt/inc/DivXDrmDecrypt.h
new file mode 100755
index 00000000..f73ebcd0
--- /dev/null
+++ b/mm-video/DivxDrmDecrypt/inc/DivXDrmDecrypt.h
@@ -0,0 +1,49 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#ifndef __DIVXDRMDECRYPT_H__
+#define __DIVXDRMDECRYPT_H__
+
+#include <OMX_Core.h>
+
+//Abstract base class of API to decrypt DRM content.
+class DivXDrmDecrypt
+{
+public:
+ static DivXDrmDecrypt* Create();
+ virtual OMX_ERRORTYPE Init() = 0;
+ virtual OMX_ERRORTYPE Decrypt(OMX_BUFFERHEADERTYPE* buffer) = 0;
+ inline virtual ~DivXDrmDecrypt() {}
+};
+
+//.so file should provide a function with the name createDivXDrmDecrypt with
+//prototype of DivXDrmDecryptFactory.
+static const char* MEDIA_CREATE_DIVX_DRM_DECRYPT = "createDivXDrmDecrypt";
+typedef DivXDrmDecrypt* (*DivXDrmDecryptFactory)();
+
+#endif //__DIVXDRMDECRYPT_H__
diff --git a/mm-video/DivxDrmDecrypt/src/DivXDrmDecrypt.cpp b/mm-video/DivxDrmDecrypt/src/DivXDrmDecrypt.cpp
new file mode 100755
index 00000000..f723427f
--- /dev/null
+++ b/mm-video/DivxDrmDecrypt/src/DivXDrmDecrypt.cpp
@@ -0,0 +1,98 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#include "DivXDrmDecrypt.h"
+#include <dlfcn.h> // for dlopen/dlclose
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "DivXDrmDecrypt"
+#ifdef _ANDROID_
+#include <utils/Log.h>
+#else
+#include <stdio.h>
+#define ALOGE(fmt, args...) fprintf(stderr, fmt, ##args)
+#endif /* _ANDROID_ */
+
+static const char* DIVX_DRM_SHIM_LIB = "libSHIMDivxDrm.so";
+
+void* getDecryptHandle() {
+ static void* decryptLib = NULL;
+ static bool decryptLibOpened = false;
+
+ if(decryptLibOpened) {
+ return decryptLib;
+ }
+
+ decryptLib = ::dlopen(DIVX_DRM_SHIM_LIB, RTLD_NOW);
+ decryptLibOpened = true;
+
+ if (decryptLib == NULL) {
+ ALOGE("Failed to open DIVX_DRM_SHIM_LIB \n");
+ }
+
+ return decryptLib;
+}
+
+DivXDrmDecryptFactory DrmDecryptFactoryFunction() {
+ static DivXDrmDecryptFactory drmDecryptFactoryFunction = NULL;
+ static bool alreadyTriedToFindFactoryFunction = false;
+
+ if(alreadyTriedToFindFactoryFunction) {
+ return drmDecryptFactoryFunction;
+ }
+
+ void *pDecryptLib = getDecryptHandle();
+ if (pDecryptLib == NULL) {
+ return NULL;
+ }
+
+ drmDecryptFactoryFunction = (DivXDrmDecryptFactory) dlsym(pDecryptLib, MEDIA_CREATE_DIVX_DRM_DECRYPT);
+ alreadyTriedToFindFactoryFunction = true;
+
+ if(!drmDecryptFactoryFunction) {
+ ALOGE(" dlsym for DrmDecrypt factory function failed \n");
+ }
+
+ return drmDecryptFactoryFunction;
+}
+
+
+
+DivXDrmDecrypt* DivXDrmDecrypt::Create() {
+ DivXDrmDecryptFactory drmCreateFunc = DrmDecryptFactoryFunction();
+ if( drmCreateFunc == NULL ) {
+ return NULL;
+ }
+
+ DivXDrmDecrypt* decrypt = drmCreateFunc();
+ if( decrypt == NULL ) {
+ ALOGE(" failed to instantiate DrmDecoder \n");
+ }
+ return decrypt;
+}
+
diff --git a/mm-video/vidc/common/inc/extra_data_handler.h b/mm-video/vidc/common/inc/extra_data_handler.h
new file mode 100755
index 00000000..19e3ca78
--- /dev/null
+++ b/mm-video/vidc/common/inc/extra_data_handler.h
@@ -0,0 +1,103 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#ifndef __EXTRA_DATA_HANDLER_H__
+#define __EXTRA_DATA_HANDLER_H__
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+#include "OMX_QCOMExtns.h"
+#include<linux/msm_vidc_dec.h>
+#include<linux/msm_vidc_enc.h>
+
+
+#ifdef _ANDROID_
+extern "C"{
+#include<utils/Log.h>
+}
+#ifdef ENABLE_DEBUG_LOW
+#define DEBUG_PRINT_LOW ALOGV
+#else
+#define DEBUG_PRINT_LOW
+#endif
+#ifdef ENABLE_DEBUG_HIGH
+#define DEBUG_PRINT_HIGH ALOGV
+#else
+#define DEBUG_PRINT_HIGH
+#endif
+#ifdef ENABLE_DEBUG_ERROR
+#define DEBUG_PRINT_ERROR ALOGE
+#else
+#define DEBUG_PRINT_ERROR
+#endif
+
+#else //_ANDROID_
+#define DEBUG_PRINT_LOW printf
+#define DEBUG_PRINT_HIGH printf
+#define DEBUG_PRINT_ERROR printf
+#endif // _ANDROID_
+
+#define SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT 0x2D
+#define H264_START_CODE 0x01
+#define NAL_TYPE_SEI 0x06
+#define VDEC_OMX_SEI 0x7F000007
+#define FRAME_PACK_SIZE 18
+#define H264_EMULATION_BYTE 0x03
+class extra_data_handler
+{
+public:
+ extra_data_handler();
+ ~extra_data_handler();
+ OMX_U32 parse_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr);
+ OMX_U32 create_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr);
+ OMX_U32 get_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack);
+ OMX_U32 set_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack);
+private:
+ OMX_QCOM_FRAME_PACK_ARRANGEMENT frame_packing_arrangement;
+ OMX_U8 *rbsp_buf;
+ OMX_U32 bit_ptr;
+ OMX_U32 byte_ptr;
+ OMX_U32 pack_sei;
+ OMX_U32 sei_payload_type;
+ OMX_U32 d_u(OMX_U32 num_bits);
+ OMX_U32 d_ue();
+ OMX_U32 parse_frame_pack(OMX_U32 payload_size);
+ OMX_S32 parse_rbsp(OMX_U8 *buf, OMX_U32 len);
+ OMX_S32 parse_sei(OMX_U8 *buffer, OMX_U32 buffer_length);
+ OMX_U32 e_u(OMX_U32 symbol, OMX_U32 num_bits);
+ OMX_U32 e_ue(OMX_U32 symbol);
+ OMX_U32 create_frame_pack();
+ OMX_S32 create_rbsp(OMX_U8 *buf, OMX_U32 nalu_type);
+ OMX_U32 create_sei(OMX_U8 *buffer);
+ OMX_S32 parse_sliceinfo(OMX_BUFFERHEADERTYPE *pBufHdr,
+ OMX_OTHER_EXTRADATATYPE *pExtra);
+};
+
+#endif
diff --git a/mm-video/vidc/common/src/extra_data_handler.cpp b/mm-video/vidc/common/src/extra_data_handler.cpp
new file mode 100755
index 00000000..28f2d959
--- /dev/null
+++ b/mm-video/vidc/common/src/extra_data_handler.cpp
@@ -0,0 +1,478 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+#include "extra_data_handler.h"
+
+extra_data_handler::extra_data_handler()
+{
+ rbsp_buf = (OMX_U8 *) calloc(1,100);
+ memset(&frame_packing_arrangement,0,sizeof(frame_packing_arrangement));
+ frame_packing_arrangement.cancel_flag = 1;
+ pack_sei = false;
+ sei_payload_type = -1;
+}
+
+extra_data_handler::~extra_data_handler()
+{
+ if(rbsp_buf) {
+ free(rbsp_buf);
+ rbsp_buf = NULL;
+ }
+}
+
+OMX_U32 extra_data_handler::d_u(OMX_U32 num_bits)
+{
+ OMX_U32 rem_bits = num_bits, bins = 0, shift = 0;
+
+ while(rem_bits >= bit_ptr) {
+ DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr,
+ byte_ptr, rbsp_buf[byte_ptr]);
+ bins <<= shift;
+ shift = (8-bit_ptr);
+ bins |= ((rbsp_buf[byte_ptr] << shift) & 0xFF) >> shift;
+ rem_bits -= bit_ptr;
+ bit_ptr = 8;
+ byte_ptr ++;
+ }
+ DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr,
+ byte_ptr, rbsp_buf[byte_ptr]);
+
+ if (rem_bits) {
+ bins <<= rem_bits;
+ bins |= ((rbsp_buf[byte_ptr] << (8-bit_ptr)) & 0xFF) >> (8-rem_bits);
+ bit_ptr -= rem_bits;
+ if (bit_ptr == 0) {
+ bit_ptr = 8;
+ byte_ptr++;
+ }
+ }
+ DEBUG_PRINT_LOW("\nIn %s() bit_ptr/byte_ptr :%d/%d/%x", __func__, bit_ptr,
+ byte_ptr, rbsp_buf[byte_ptr]);
+
+ DEBUG_PRINT_LOW("\nIn %s() bin/num_bits : %x/%d", __func__, bins, num_bits);
+ return bins;
+}
+
+OMX_U32 extra_data_handler::d_ue()
+{
+ OMX_S32 lead_zeros = -1;
+ OMX_U32 symbol, bit;
+ do{
+ bit = d_u(1);
+ lead_zeros++;
+ }while (!bit);
+
+ symbol = ((1 << lead_zeros) - 1) + d_u(lead_zeros);
+
+ DEBUG_PRINT_LOW("\nIn %s() symbol : %d", __func__,symbol);
+ return symbol;
+}
+
+OMX_U32 extra_data_handler::parse_frame_pack(OMX_U32 payload_size)
+{
+ frame_packing_arrangement.id = d_ue();
+ frame_packing_arrangement.cancel_flag = d_u(1);
+ if(!frame_packing_arrangement.cancel_flag) {
+ frame_packing_arrangement.type = d_u(7);
+ frame_packing_arrangement.quincunx_sampling_flag = d_u(1);
+ frame_packing_arrangement.content_interpretation_type = d_u(6);
+ frame_packing_arrangement.spatial_flipping_flag = d_u(1);
+ frame_packing_arrangement.frame0_flipped_flag = d_u(1);
+ frame_packing_arrangement.field_views_flag = d_u(1);
+ frame_packing_arrangement.current_frame_is_frame0_flag = d_u(1);
+ frame_packing_arrangement.frame0_self_contained_flag = d_u(1);
+ frame_packing_arrangement.frame1_self_contained_flag = d_u(1);
+
+ if(!frame_packing_arrangement.quincunx_sampling_flag &&
+ frame_packing_arrangement.type != 5) {
+ frame_packing_arrangement.frame0_grid_position_x = d_u(4);
+ frame_packing_arrangement.frame0_grid_position_y = d_u(4);
+ frame_packing_arrangement.frame1_grid_position_x = d_u(4);
+ frame_packing_arrangement.frame1_grid_position_y = d_u(4);
+ }
+ frame_packing_arrangement.reserved_byte = d_u(8);
+ frame_packing_arrangement.repetition_period = d_ue();
+ }
+ frame_packing_arrangement.extension_flag = d_u(1);
+
+ return 1;
+}
+
+OMX_S32 extra_data_handler::parse_rbsp(OMX_U8 *buf, OMX_U32 len)
+{
+ OMX_U32 i = 3, j=0, startcode;
+ OMX_U32 nal_unit_type, nal_ref_idc, forbidden_zero_bit;
+
+ bit_ptr = 8;
+ byte_ptr = 0;
+
+ startcode = buf[0] << 16 | buf[1] <<8 | buf[2];
+
+ if (!startcode) {
+ startcode |= buf[i++];
+ }
+ if(startcode != H264_START_CODE) {
+ DEBUG_PRINT_ERROR("\nERROR: In %s() Start code not found", __func__);
+ return -1;
+ }
+ forbidden_zero_bit = (buf[i] & 0x80) >>7;
+ if(forbidden_zero_bit) {
+ DEBUG_PRINT_ERROR("\nERROR: In %s() Non-zero forbidden bit", __func__);
+ return -1;
+ }
+ nal_ref_idc = (buf[i] & 0x60) >>5;
+ DEBUG_PRINT_LOW("\nIn %s() nal_ref_idc ; %d", __func__, nal_ref_idc);
+
+ nal_unit_type = (buf[i++] & 0x1F);
+
+ while(i<len) {
+ if(!(buf[i] + buf[i+1]) && (buf[i+2] == H264_EMULATION_BYTE) &&
+ (i+2 < len)) {
+ rbsp_buf[j++] = buf[i++];
+ rbsp_buf[j++] = buf[i++];
+ i++;
+ } else
+ rbsp_buf[j++] = buf[i++];
+ }
+ return nal_unit_type;
+}
+OMX_S32 extra_data_handler::parse_sei(OMX_U8 *buffer, OMX_U32 buffer_length)
+{
+ OMX_U32 nal_unit_type, payload_type = 0, payload_size = 0;
+ OMX_U32 marker = 0, pad = 0xFF;
+
+ nal_unit_type = parse_rbsp(buffer, buffer_length);
+
+ if (nal_unit_type != NAL_TYPE_SEI) {
+ DEBUG_PRINT_ERROR("\nERROR: In %s() - Non SEI NAL ", __func__);
+ return -1;
+ } else {
+
+ while(rbsp_buf[byte_ptr] == 0xFF)
+ payload_type += rbsp_buf[byte_ptr++];
+ payload_type += rbsp_buf[byte_ptr++];
+
+ DEBUG_PRINT_LOW("\nIn %s() payload_type : %u", __func__, payload_type);
+
+ while(rbsp_buf[byte_ptr] == 0xFF)
+ payload_size += rbsp_buf[byte_ptr++];
+ payload_size += rbsp_buf[byte_ptr++];
+
+ DEBUG_PRINT_LOW("\nIn %s() payload_size : %u", __func__, payload_size);
+
+ switch(payload_type) {
+ case SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT:
+ DEBUG_PRINT_LOW("\nIn %s() Frame Packing SEI ", __func__);
+ parse_frame_pack(payload_size);
+ break;
+ default:
+ DEBUG_PRINT_LOW("\nINFO: In %s() Not Supported SEI NAL ", __func__);
+ break;
+ }
+ }
+ if(bit_ptr != 8) {
+ marker = d_u(1);
+ if(marker) {
+ if(bit_ptr != 8) {
+ pad = d_u(bit_ptr);
+ if(pad) {
+ DEBUG_PRINT_ERROR("\nERROR: In %s() padding Bits Error in SEI",
+ __func__);
+ return -1;
+ }
+ }
+ } else {
+ DEBUG_PRINT_ERROR("\nERROR: In %s() Marker Bit Error in SEI",
+ __func__);
+ return -1;
+ }
+ }
+ DEBUG_PRINT_LOW("\nIn %s() payload_size : %u/%u", __func__,
+ payload_size, byte_ptr);
+ return 1;
+}
+/*======================================================================
+ Slice Information will be available as below (each line is of 4 bytes)
+ | number of slices |
+ | 1st slice offset |
+ | 1st slice size |
+ | .. |
+ | Nth slice offset |
+ | Nth slice size |
+======================================================================*/
+OMX_S32 extra_data_handler::parse_sliceinfo(
+ OMX_BUFFERHEADERTYPE *pBufHdr, OMX_OTHER_EXTRADATATYPE *pExtra)
+{
+ OMX_U32 slice_offset = 0, slice_size = 0, total_size = 0;
+ OMX_U8 *pBuffer = (OMX_U8 *)pBufHdr->pBuffer;
+ OMX_U32 *data = (OMX_U32 *)pExtra->data;
+ OMX_U32 num_slices = *data;
+ DEBUG_PRINT_HIGH("number of slices = %d", num_slices);
+ if ((4 + num_slices * 8) != (OMX_U32)pExtra->nDataSize) {
+ DEBUG_PRINT_ERROR("unknown error in slice info extradata");
+ return -1;
+ }
+ for (int i = 0; i < num_slices; i++) {
+ slice_offset = (OMX_U32)(*(data + (i*2 + 1)));
+ if ((*(pBuffer + slice_offset + 0) != 0x00) ||
+ (*(pBuffer + slice_offset + 1) != 0x00) ||
+ (*(pBuffer + slice_offset + 2) != 0x00) ||
+ (*(pBuffer + slice_offset + 3) != H264_START_CODE)) {
+ DEBUG_PRINT_ERROR("found 0x%x instead of start code at offset[%d] "
+ "for slice[%d]", (OMX_U32)(*(OMX_U32 *)(pBuffer + slice_offset)),
+ slice_offset, i);
+ return -1;
+ }
+ if (slice_offset != total_size) {
+ DEBUG_PRINT_ERROR("offset of slice number %d is not correct "
+ "or previous slice size is not correct", i);
+ return -1;
+ }
+ slice_size = (OMX_U32)(*(data + (i*2 + 2)));
+ total_size += slice_size;
+ DEBUG_PRINT_HIGH("slice number %d offset/size = %d/%d",
+ i, slice_offset, slice_size);
+ }
+ if (pBufHdr->nFilledLen != total_size) {
+ DEBUG_PRINT_ERROR("frame_size[%d] is not equal to "
+ "total slices size[%d]", pBufHdr->nFilledLen, total_size);
+ return -1;
+ }
+ return 0;
+}
+
+OMX_U32 extra_data_handler::parse_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr)
+{
+ OMX_OTHER_EXTRADATATYPE *extra_data = (OMX_OTHER_EXTRADATATYPE *)
+ ((unsigned)(buf_hdr->pBuffer + buf_hdr->nOffset +
+ buf_hdr->nFilledLen + 3)&(~3));
+
+ DEBUG_PRINT_LOW("\nIn %s() symbol : %u", __func__,buf_hdr->nFlags);
+
+ if (buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
+ while(extra_data && (OMX_U8*)extra_data < (buf_hdr->pBuffer +
+ buf_hdr->nAllocLen) && extra_data->eType != VDEC_EXTRADATA_NONE) {
+ DEBUG_PRINT_LOW("\nExtra data type(%x) Extra data size(%u)",
+ extra_data->eType, extra_data->nDataSize);
+ if (extra_data->eType == VDEC_EXTRADATA_SEI) {
+ parse_sei(extra_data->data, extra_data->nDataSize);
+ }
+ else if (extra_data->eType == VEN_EXTRADATA_QCOMFILLER) {
+ DEBUG_PRINT_HIGH("Extradata Qcom Filler found, skip %d bytes",
+ extra_data->nSize);
+ }
+ else if (extra_data->eType == VEN_EXTRADATA_SLICEINFO) {
+ DEBUG_PRINT_HIGH("Extradata SliceInfo of size %d found, "
+ "parsing it", extra_data->nDataSize);
+ parse_sliceinfo(buf_hdr, extra_data);
+ }
+ extra_data = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) extra_data) +
+ extra_data->nSize);
+ }
+ }
+ return 1;
+}
+
+OMX_U32 extra_data_handler::get_frame_pack_data(
+ OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack)
+{
+ DEBUG_PRINT_LOW("\n%s:%d get frame data", __func__, __LINE__);
+ memcpy(&frame_pack->id,&frame_packing_arrangement.id,
+ FRAME_PACK_SIZE*sizeof(OMX_U32));
+ return 1;
+}
+
+OMX_U32 extra_data_handler::set_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT
+ *frame_pack)
+{
+ DEBUG_PRINT_LOW("\n%s:%d set frame data", __func__, __LINE__);
+ memcpy(&frame_packing_arrangement.id, &frame_pack->id,
+ FRAME_PACK_SIZE*sizeof(OMX_U32));
+ pack_sei = true;
+ sei_payload_type = SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT;
+ return 1;
+}
+
+OMX_U32 extra_data_handler::e_u(OMX_U32 symbol, OMX_U32 num_bits)
+{
+ OMX_U32 rem_bits = num_bits, shift;
+
+ DEBUG_PRINT_LOW("\n%s bin : %x/%d", __func__, symbol, num_bits);
+
+ while(rem_bits >= bit_ptr) {
+ shift = rem_bits - bit_ptr;
+ rbsp_buf[byte_ptr] |= (symbol >> shift);
+ symbol = (symbol << (32 - shift)) >> (32 - shift);
+ rem_bits -= bit_ptr;
+ DEBUG_PRINT_LOW("\n%sstream byte/rem_bits %x/%d", __func__,
+ rbsp_buf[byte_ptr], rem_bits);
+ byte_ptr ++;
+ bit_ptr = 8;
+ }
+
+ if(rem_bits) {
+ shift = bit_ptr - rem_bits;
+ rbsp_buf[byte_ptr] |= (symbol << shift);
+ bit_ptr -= rem_bits;
+ DEBUG_PRINT_LOW("\n%s 2 stream byte/rem_bits %x", __func__,
+ rbsp_buf[byte_ptr], rem_bits);
+ if(bit_ptr == 0) {
+ bit_ptr = 8;
+ byte_ptr++;
+ }
+ }
+ return 1;
+}
+
+OMX_U32 extra_data_handler::e_ue(OMX_U32 symbol)
+{
+ OMX_U32 i, sym_len, sufix_len, info;
+ OMX_U32 nn =(symbol + 1) >> 1;
+
+ DEBUG_PRINT_LOW("\n%s bin : %x", __func__, symbol);
+
+ for(i=0; i < 33 && nn != 0; i++)
+ nn >>= 1;
+
+ sym_len = ((i << 1) + 1);
+ info = symbol + 1 - (1 << i);
+ sufix_len = (1 << (sym_len >>1));
+ info = sufix_len | (info & (sufix_len - 1));
+ e_u(info, sym_len);
+ return 1;
+}
+
+OMX_U32 extra_data_handler::create_frame_pack()
+{
+ e_ue(frame_packing_arrangement.id);
+ e_u(frame_packing_arrangement.cancel_flag, 1);
+ if(!frame_packing_arrangement.cancel_flag) {
+ e_u(frame_packing_arrangement.type, 7);
+ e_u(frame_packing_arrangement.quincunx_sampling_flag, 1);
+ e_u(frame_packing_arrangement.content_interpretation_type, 6);
+ e_u(frame_packing_arrangement.spatial_flipping_flag, 1);
+ e_u(frame_packing_arrangement.frame0_flipped_flag, 1);
+ e_u(frame_packing_arrangement.field_views_flag, 1);
+ e_u(frame_packing_arrangement.current_frame_is_frame0_flag, 1);
+ e_u(frame_packing_arrangement.frame0_self_contained_flag, 1);
+ e_u(frame_packing_arrangement.frame1_self_contained_flag, 1);
+ if(!frame_packing_arrangement.quincunx_sampling_flag &&
+ frame_packing_arrangement.type != 5) {
+ e_u(frame_packing_arrangement.frame0_grid_position_x, 4);
+ e_u(frame_packing_arrangement.frame0_grid_position_y, 4);
+ e_u(frame_packing_arrangement.frame1_grid_position_x, 4);
+ e_u(frame_packing_arrangement.frame1_grid_position_y, 4);
+ }
+ e_u(frame_packing_arrangement.reserved_byte, 8);
+ e_ue(frame_packing_arrangement.repetition_period);
+ }
+ e_u(frame_packing_arrangement.extension_flag, 1);
+ return 1;
+}
+
+OMX_S32 extra_data_handler::create_rbsp(OMX_U8 *buf, OMX_U32 nalu_type)
+{
+ OMX_U32 i, j = 7;
+ for(i = 0;i < 3;i++)
+ *buf++ = 0x00;
+ *buf++ = H264_START_CODE;
+ *buf++ = nalu_type;
+ *buf++ = (sei_payload_type & 0x000000FF);
+ *buf++ = byte_ptr - 1; //payload will contain 1 byte of rbsp_trailing_bits
+ //that shouldn't be taken into account
+
+ for(i = 0;i < byte_ptr ;i += 2) {
+ *buf++ = rbsp_buf[i];
+ j++;
+ if(i+1 < byte_ptr) {
+ *buf++ = rbsp_buf[i+1];
+ j++;
+ if(!(rbsp_buf[i] + rbsp_buf[i+1])) {
+ *buf++ = H264_EMULATION_BYTE;
+ j++;
+ }
+ }
+ }
+
+ DEBUG_PRINT_LOW("\n%s rbsp length %d", __func__, j);
+ return j;
+}
+
+OMX_U32 extra_data_handler::create_sei(OMX_U8 *buffer)
+{
+ OMX_U32 i, ret_val = 0;
+
+ byte_ptr = 0;
+ bit_ptr = 8;
+
+ if(sei_payload_type == SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT) {
+ create_frame_pack();
+
+ if(bit_ptr != 8) {
+ e_u(1,1);
+ if(bit_ptr != 8)
+ e_u(0,bit_ptr);
+ }
+
+ //Payload will have been byte aligned by now,
+ //insert the rbsp trailing bits
+ e_u(1, 1);
+ e_u(0, 7);
+
+ ret_val = create_rbsp(buffer, NAL_TYPE_SEI);
+ }
+
+ pack_sei = false;
+ sei_payload_type = -1;
+
+ return ret_val;
+}
+
+OMX_U32 extra_data_handler::create_extra_data(OMX_BUFFERHEADERTYPE *buf_hdr)
+{
+ OMX_U8 *buffer = (OMX_U8 *) ((unsigned)(buf_hdr->pBuffer +
+ buf_hdr->nOffset + buf_hdr->nFilledLen));
+ OMX_U32 msg_size;
+
+ DEBUG_PRINT_LOW("\n filled_len/orig_len %d/%d", buf_hdr->nFilledLen,
+ buf_hdr->nAllocLen);
+
+ if(buf_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+ DEBUG_PRINT_LOW("\n%s:%d create extra data with config", __func__,
+ __LINE__);
+ if(pack_sei) {
+ msg_size = create_sei(buffer);
+ if( msg_size > 0)
+ buf_hdr->nFilledLen += msg_size;
+ }
+ }
+ DEBUG_PRINT_LOW("\n filled_len/orig_len %d/%d", buf_hdr->nFilledLen,
+ buf_hdr->nAllocLen);
+ return 1;
+}
+
diff --git a/mm-video/vidc/vdec/Android.mk b/mm-video/vidc/vdec/Android.mk
index 42ba3c53..a82a951b 100644..100755
--- a/mm-video/vidc/vdec/Android.mk
+++ b/mm-video/vidc/vdec/Android.mk
@@ -1,30 +1,4 @@
-#--------------------------------------------------------------------------
-#Copyright (c) 2010, Code Aurora Forum. All rights reserved.
-
-#Redistribution and use in source and binary forms, with or without
-#modification, are permitted provided that the following conditions are met:
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# * Neither the name of Code Aurora nor
-# the names of its contributors may be used to endorse or promote
-# products derived from this software without specific prior written
-# permission.
-
-#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-#IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-#NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-#CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-#EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-#PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-#OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-#WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-#OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-#ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#--------------------------------------------------------------------------
+ifneq ($(BUILD_TINY_ANDROID),true)
ROOT_DIR := $(call my-dir)
@@ -35,10 +9,8 @@ LOCAL_PATH:= $(ROOT_DIR)
# Common definitons
# ---------------------------------------------------------------------------------
-libOmxVdec-def := -D__alignx\(x\)=__attribute__\(\(__aligned__\(x\)\)\)
libOmxVdec-def += -D__align=__alignx
libOmxVdec-def += -Dinline=__inline
-libOmxVdec-def += -g -O3
libOmxVdec-def += -DIMAGE_APPS_PROC
libOmxVdec-def += -D_ANDROID_
libOmxVdec-def += -DCDECL
@@ -47,8 +19,30 @@ libOmxVdec-def += -DNO_ARM_CLZ
libOmxVdec-def += -UENABLE_DEBUG_LOW
libOmxVdec-def += -DENABLE_DEBUG_HIGH
libOmxVdec-def += -DENABLE_DEBUG_ERROR
-libOmxVdec-def += -UMULTI_DEC_INST
-libOmxVdec-def += -DMAX_RES_720P
+libOmxVdec-def += -UINPUT_BUFFER_LOG
+libOmxVdec-def += -UOUTPUT_BUFFER_LOG
+ifeq ($(TARGET_BOARD_PLATFORM),msm8660)
+libOmxVdec-def += -DMAX_RES_1080P
+libOmxVdec-def += -DPROCESS_EXTRADATA_IN_OUTPUT_PORT
+libOmxVdec-def += -DTEST_TS_FROM_SEI
+endif
+ifeq ($(TARGET_BOARD_PLATFORM),msm8960)
+libOmxVdec-def += -DMAX_RES_1080P
+libOmxVdec-def += -DMAX_RES_1080P_EBI
+libOmxVdec-def += -DPROCESS_EXTRADATA_IN_OUTPUT_PORT
+endif
+ifeq ($(TARGET_BOARD_PLATFORM),msm8974)
+libOmxVdec-def += -DMAX_RES_1080P
+libOmxVdec-def += -DMAX_RES_1080P_EBI
+libOmxVdec-def += -DPROCESS_EXTRADATA_IN_OUTPUT_PORT
+libOmxVdec-def += -D_COPPER_
+endif
+
+libOmxVdec-def += -D_ANDROID_ICS_
+
+#ifeq ($(TARGET_USES_ION),true)
+libOmxVdec-def += -DUSE_ION
+#endif
# ---------------------------------------------------------------------------------
# Make the Shared library (libOmxVdec)
@@ -57,19 +51,36 @@ libOmxVdec-def += -DMAX_RES_720P
include $(CLEAR_VARS)
LOCAL_PATH:= $(ROOT_DIR)
-libmm-vdec-inc := $(LOCAL_PATH)/inc
-libmm-vdec-inc += $(TARGET_OUT_HEADERS)/mm-core/omxcore
-
-LOCAL_MODULE := libOmxVdec
-LOCAL_CFLAGS := $(libOmxVdec-def)
-LOCAL_C_INCLUDES := $(libmm-vdec-inc)
-
-LOCAL_SHARED_LIBRARIES := liblog libutils libbinder
+libmm-vdec-inc := bionic/libc/include
+libmm-vdec-inc += bionic/libstdc++/include
+libmm-vdec-inc += $(LOCAL_PATH)/inc
+libmm-vdec-inc += $(OMX_VIDEO_PATH)/vidc/common/inc
+libmm-vdec-inc += hardware/qcom/media/mm-core/inc
+#libmm-vdec-inc += bionic/libc/kernel/common/linux
+#DRM include - Interface which loads the DRM library
+libmm-vdec-inc += $(OMX_VIDEO_PATH)/DivxDrmDecrypt/inc
+libmm-vdec-inc += hardware/qcom/display/libgralloc
+libmm-vdec-inc += hardware/qcom/display/libgenlock
+libmm-vdec-inc += frameworks/native/include/media/openmax
+libmm-vdec-inc += frameworks/native/include/media/hardware
+
+LOCAL_MODULE := libOmxVdec
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS := $(libOmxVdec-def)
+LOCAL_C_INCLUDES += $(libmm-vdec-inc)
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_SHARED_LIBRARIES := liblog libutils libbinder libcutils
+
+LOCAL_SHARED_LIBRARIES += libgenlock
+LOCAL_SHARED_LIBRARIES += libdivxdrmdecrypt
LOCAL_SRC_FILES := src/frameparser.cpp
LOCAL_SRC_FILES += src/h264_utils.cpp
+LOCAL_SRC_FILES += src/ts_parser.cpp
+LOCAL_SRC_FILES += src/mp4_utils.cpp
LOCAL_SRC_FILES += src/omx_vdec.cpp
-
+LOCAL_SRC_FILES += ../common/src/extra_data_handler.cpp
include $(BUILD_SHARED_LIBRARY)
# ---------------------------------------------------------------------------------
@@ -77,17 +88,20 @@ include $(BUILD_SHARED_LIBRARY)
# ---------------------------------------------------------------------------------
include $(CLEAR_VARS)
-mm-vdec-test-inc := $(TARGET_OUT_HEADERS)/mm-core/omxcore
-mm-vdec-test-inc += $(LOCAL_PATH)/inc
+mm-vdec-test-inc := hardware/qcom/media/mm-core/inc
+mm-vdec-test-inc += $(LOCAL_PATH)/inc
+#mm-vdec-test-inc += bionic/libc/kernel/common/linux
+
+LOCAL_MODULE := mm-vdec-omx-test
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS := $(libOmxVdec-def)
+LOCAL_C_INCLUDES := $(mm-vdec-test-inc)
-LOCAL_MODULE_TAGS := eng
-LOCAL_MODULE := mm-vdec-omx-test
-LOCAL_CFLAGS := $(libOmxVdec-def)
-LOCAL_C_INCLUDES := $(mm-vdec-test-inc)
-LOCAL_SHARED_LIBRARIES := libutils libOmxCore libOmxVdec libbinder
+LOCAL_PRELINK_MODULE := false
+LOCAL_SHARED_LIBRARIES := libutils libOmxCore libOmxVdec libbinder
-LOCAL_SRC_FILES := src/queue.c
-LOCAL_SRC_FILES += test/omx_vdec_test.cpp
+LOCAL_SRC_FILES := src/queue.c
+LOCAL_SRC_FILES += test/omx_vdec_test.cpp
include $(BUILD_EXECUTABLE)
@@ -96,15 +110,23 @@ include $(BUILD_EXECUTABLE)
# ---------------------------------------------------------------------------------
include $(CLEAR_VARS)
-mm-vdec-drv-test-inc := $(TARGET_OUT_HEADERS)/mm-core/omxcore
-mm-vdec-drv-test-inc += $(LOCAL_PATH)/inc
+mm-vdec-drv-test-inc := hardware/qcom/media/mm-core/inc
+mm-vdec-drv-test-inc += $(LOCAL_PATH)/inc
+#mm-vdec-drv-test-inc += bionic/libc/kernel/common/linux
-LOCAL_MODULE_TAGS := eng
-LOCAL_MODULE := mm-video-driver-test
-LOCAL_CFLAGS := $(libOmxVdec-def)
-LOCAL_C_INCLUDES := $(mm-vdec-drv-test-inc)
+LOCAL_MODULE := mm-video-driver-test
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS := $(libOmxVdec-def)
+LOCAL_C_INCLUDES := $(mm-vdec-drv-test-inc)
+LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES := src/message_queue.c
LOCAL_SRC_FILES += test/decoder_driver_test.c
include $(BUILD_EXECUTABLE)
+
+endif #BUILD_TINY_ANDROID
+
+# ---------------------------------------------------------------------------------
+# END
+# ---------------------------------------------------------------------------------
diff --git a/mm-video/vidc/vdec/inc/Map.h b/mm-video/vidc/vdec/inc/Map.h
index 87cf6de7..a9b7981e 100644..100755
--- a/mm-video/vidc/vdec/inc/Map.h
+++ b/mm-video/vidc/vdec/inc/Map.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/vdec/inc/decoder_driver_test.h b/mm-video/vidc/vdec/inc/decoder_driver_test.h
index c8cbd1d2..dd95e5e1 100644..100755
--- a/mm-video/vidc/vdec/inc/decoder_driver_test.h
+++ b/mm-video/vidc/vdec/inc/decoder_driver_test.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -31,6 +31,7 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
+#include <inttypes.h>
#include <linux/msm_vidc_dec.h>
#include <pthread.h>
#include <semaphore.h>
diff --git a/mm-video/vidc/vdec/inc/frameparser.h b/mm-video/vidc/vdec/inc/frameparser.h
index 4575b093..1e588a39 100644..100755
--- a/mm-video/vidc/vdec/inc/frameparser.h
+++ b/mm-video/vidc/vdec/inc/frameparser.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -33,13 +33,15 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "h264_utils.h"
//#include <stdlib.h>
-
enum codec_type
{
CODEC_TYPE_MPEG4 = 0,
+ CODEC_TYPE_DIVX = 0,
CODEC_TYPE_H263 = 1,
CODEC_TYPE_H264 = 2,
- CODEC_TYPE_VC1 = 3
+ CODEC_TYPE_VC1 = 3,
+ CODEC_TYPE_MPEG2 = 4,
+ CODEC_TYPE_MAX = CODEC_TYPE_MPEG2
};
enum state_start_code_parse
@@ -48,7 +50,8 @@ enum state_start_code_parse
A1,
A2,
A3,
- A4
+ A4,
+ A5
};
enum state_nal_parse
@@ -63,32 +66,36 @@ class frame_parse
public:
H264_Utils *mutils;
int init_start_codes (codec_type codec_type_parse);
- int parse_mpeg4_frame (OMX_BUFFERHEADERTYPE *source,
+ int parse_sc_frame (OMX_BUFFERHEADERTYPE *source,
OMX_BUFFERHEADERTYPE *dest ,
OMX_U32 *partialframe);
int init_nal_length (unsigned int nal_length);
int parse_h264_nallength (OMX_BUFFERHEADERTYPE *source,
OMX_BUFFERHEADERTYPE *dest ,
OMX_U32 *partialframe);
- void flush ();
- void update_metadata (unsigned int time_stamp ,unsigned int flags);
+ void flush ();
frame_parse ();
~frame_parse ();
private:
/*Variables for Start code based Parsing*/
enum state_start_code_parse parse_state;
- unsigned char start_code[4];
- char mask_code[4];
- unsigned char last_byte,prev_one;
+ unsigned char *start_code;
+ unsigned char *mask_code;
+ unsigned char last_byte_h263;
+ unsigned char last_byte;
+ bool header_found;
+ bool skip_frame_boundary;
/*Variables for NAL Length Parsing*/
enum state_nal_parse state_nal;
unsigned int nal_length;
unsigned int accum_length;
unsigned int bytes_tobeparsed;
- unsigned int time_stamp;
- unsigned int flags;
+ /*Functions to support additional start code parsing*/
+ void parse_additional_start_code(OMX_U8 *psource, OMX_U32 *parsed_length);
+ void check_skip_frame_boundary(OMX_U32 *partial_frame);
+ void update_skip_frame();
};
#endif /* FRAMEPARSER_H */
diff --git a/mm-video/vidc/vdec/inc/h264_utils.h b/mm-video/vidc/vdec/inc/h264_utils.h
index 9c28caaf..9a903b1a 100644..100755
--- a/mm-video/vidc/vdec/inc/h264_utils.h
+++ b/mm-video/vidc/vdec/inc/h264_utils.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -47,12 +47,15 @@ This module contains H264 video decoder utilities and helper routines.
#include "Map.h"
#include "qtypes.h"
#include "OMX_Core.h"
+#include "OMX_QCOMExtns.h"
#define STD_MIN(x,y) (((x) < (y)) ? (x) : (y))
#define OMX_CORE_720P_HEIGHT 720
#define OMX_CORE_720P_WIDTH 1280
+#define PANSCAN_HDLR
+
/* =======================================================================
DATA DECLARATIONS
@@ -150,6 +153,8 @@ typedef struct {
// H264ParamNaluSet seq;
//};
+class extra_data_parser;
+
class RbspParser
/******************************************************************************
** This class is used to convert an H.264 NALU (network abstraction layer
@@ -182,10 +187,10 @@ public:
~H264_Utils();
void initialize_frame_checking_environment();
void allocate_rbsp_buffer(uint32 inputBufferSize);
- bool isNewFrame(OMX_IN OMX_U8 *bitstream,
- OMX_IN OMX_U32 bitstream_length,
+ bool isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr,
OMX_IN OMX_U32 size_of_nal_length_field,
OMX_OUT OMX_BOOL &isNewFrame);
+ uint32 nalu_type;
private:
boolean extract_rbsp(OMX_IN OMX_U8 *buffer,
@@ -205,5 +210,270 @@ private:
bool m_au_data;
};
+class perf_metrics
+{
+ public:
+ perf_metrics() :
+ start_time(0),
+ proc_time(0),
+ active(false)
+ {
+ };
+ ~perf_metrics() {};
+ void start();
+ void stop();
+ void end(OMX_U32 units_cntr = 0);
+ void reset();
+ OMX_U64 processing_time_us();
+ private:
+ inline OMX_U64 get_act_time();
+ OMX_U64 start_time;
+ OMX_U64 proc_time;
+ bool active;
+};
+
+#define EMULATION_PREVENTION_THREE_BYTE 0x03
+#define MAX_CPB_COUNT 32
+#define NO_PAN_SCAN_BIT 0x00000100
+#define MAX_PAN_SCAN_RECT 3
+#define VALID_TS(ts) ((ts < LLONG_MAX)? true : false)
+#define NALU_TYPE_VUI (NALU_TYPE_RESERVED + 1)
+
+enum SEI_PAYLOAD_TYPE
+{
+ BUFFERING_PERIOD = 0,
+ PIC_TIMING,
+ PAN_SCAN_RECT,
+ FILLER_PAYLOAD,
+ USER_DATA_REGISTERED_ITU_T_T35,
+ USER_DATA_UNREGISTERED,
+ RECOVERY_POINT,
+ DEC_REF_PIC_MARKING_REPETITION,
+ SPARE_PIC,
+ SCENE_INFO,
+ SUB_SEQ_INFO,
+ SUB_SEQ_LAYER_CHARACTERISTICS,
+ SUB_SEQ_CHARACTERISTICS,
+ FULL_FRAME_FREEZE,
+ FULL_FRAME_FREEZE_RELEASE,
+ FULL_FRAME_SNAPSHOT,
+ PROGRESSIVE_REFINEMENT_SEGMENT_START,
+ PROGRESSIVE_REFINEMENT_SEGMENT_END,
+ SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT = 0x2D
+};
+
+typedef struct
+{
+ OMX_U32 cpb_cnt;
+ OMX_U8 bit_rate_scale;
+ OMX_U8 cpb_size_scale;
+ OMX_U32 bit_rate_value[MAX_CPB_COUNT];
+ OMX_U32 cpb_size_value[MAX_CPB_COUNT];
+ OMX_U8 cbr_flag[MAX_CPB_COUNT];
+ OMX_U8 initial_cpb_removal_delay_length;
+ OMX_U8 cpb_removal_delay_length;
+ OMX_U8 dpb_output_delay_length;
+ OMX_U8 time_offset_length;
+} h264_hrd_param;
+
+typedef struct
+{
+ OMX_U32 aspect_ratio_idc;
+ OMX_U32 aspect_ratio_x;
+ OMX_U32 aspect_ratio_y;
+} h264_aspect_ratio_info;
+
+typedef struct
+{
+ OMX_U8 aspect_ratio_info_present_flag;
+ h264_aspect_ratio_info aspect_ratio_info;
+ OMX_U8 timing_info_present_flag;
+ OMX_U32 num_units_in_tick;
+ OMX_U32 time_scale;
+ OMX_U8 fixed_frame_rate_flag;
+ OMX_U8 nal_hrd_parameters_present_flag;
+ h264_hrd_param nal_hrd_parameters;
+ OMX_U8 vcl_hrd_parameters_present_flag;
+ h264_hrd_param vcl_hrd_parameters;
+ OMX_U8 low_delay_hrd_flag;
+ OMX_U8 pic_struct_present_flag;
+ OMX_S64 fixed_fps_prev_ts;
+} h264_vui_param;
+
+typedef struct
+{
+ OMX_U32 cpb_removal_delay;
+ OMX_U32 dpb_output_delay;
+ OMX_U8 pic_struct;
+ OMX_U32 num_clock_ts;
+ bool clock_ts_flag;
+ OMX_U8 ct_type;
+ OMX_U32 nuit_field_based_flag;
+ OMX_U8 counting_type;
+ OMX_U8 full_timestamp_flag;
+ OMX_U8 discontinuity_flag;
+ OMX_U8 cnt_dropped_flag;
+ OMX_U32 n_frames;
+ OMX_U32 seconds_value;
+ OMX_U32 minutes_value;
+ OMX_U32 hours_value;
+ OMX_S32 time_offset;
+ bool is_valid;
+} h264_sei_pic_timing;
+
+typedef struct
+{
+ OMX_U32 initial_cpb_removal_delay[MAX_CPB_COUNT];
+ OMX_U32 initial_cpb_removal_delay_offset[MAX_CPB_COUNT];
+ OMX_U32 au_cntr;
+ OMX_S64 reference_ts;
+ bool is_valid;
+} h264_sei_buf_period;
+
+typedef struct
+{
+ OMX_U32 rect_id;
+ OMX_U8 rect_cancel_flag;
+ OMX_U32 cnt;
+ OMX_S32 rect_left_offset[MAX_PAN_SCAN_RECT];
+ OMX_S32 rect_right_offset[MAX_PAN_SCAN_RECT];
+ OMX_S32 rect_top_offset[MAX_PAN_SCAN_RECT];
+ OMX_S32 rect_bottom_offset[MAX_PAN_SCAN_RECT];
+ OMX_U32 rect_repetition_period;
+} h264_pan_scan;
+
+#ifdef PANSCAN_HDLR
+template <class NODE_STRUCT>
+class omx_dl_list
+{
+public:
+ omx_dl_list() { head = tail = NULL; } ;
+ ~omx_dl_list() {};
+ void add_multiple(NODE_STRUCT *data_arr, int data_num);
+ NODE_STRUCT *remove_first();
+ NODE_STRUCT *remove_last();
+ void add_last(NODE_STRUCT *data_ptr);
+ NODE_STRUCT *watch_first();
+ NODE_STRUCT *watch_last();
+private:
+ NODE_STRUCT *head, *tail;
+};
+
+class panscan_handler
+{
+public:
+ panscan_handler();
+ ~panscan_handler();
+ bool initialize(int num_data);
+ h264_pan_scan *get_free();
+ h264_pan_scan *get_populated(OMX_S64 frame_ts);
+ void update_last(OMX_S64 frame_ts);
+private:
+ typedef struct PANSCAN_NODE
+ {
+ h264_pan_scan pan_scan_param;
+ OMX_S64 start_ts, end_ts;
+ bool active;
+ PANSCAN_NODE *next, *prev;
+ } PANSCAN_NODE;
+ omx_dl_list<PANSCAN_NODE> panscan_used;
+ omx_dl_list<PANSCAN_NODE> panscan_free;
+ PANSCAN_NODE *panscan_data;
+};
+
+#if 1 // Debug panscan data
+
+#define PRINT_PANSCAN_PARAM(H264_PARAM)
+#define PRINT_PANSCAN_DATA(NODE)
+
+#else
+
+#define PRINT_PANSCAN_PARAM(H264_PARAM) \
+do {\
+ ALOGE("%s(): left_off(%ld) right_off(%ld) top_off(%ld) bottom_off(%ld)",\
+ __FUNCTION__,\
+ (H264_PARAM).rect_left_offset[0],\
+ (H264_PARAM).rect_right_offset[0],\
+ (H264_PARAM).rect_top_offset[0],\
+ (H264_PARAM).rect_bottom_offset[0]);\
+}while(0)
+
+#define PRINT_PANSCAN_DATA(NODE) \
+do {\
+ if (NODE) {\
+ ALOGE("%s(): PANSCAN DATA start_ts(%lld) end_ts(%lld)", __FUNCTION__,\
+ (NODE)->start_ts, (NODE)->end_ts);\
+ PRINT_PANSCAN_PARAM(NODE->pan_scan_param);\
+ }\
+}while(0)
+
+#endif // End debug panscan data
+
+#endif
+
+class h264_stream_parser
+{
+ public:
+ h264_stream_parser();
+ ~h264_stream_parser();
+ void reset();
+ void fill_pan_scan_data(OMX_QCOM_PANSCAN *dest_pan_scan, OMX_S64 timestamp);
+ void fill_aspect_ratio_info(OMX_QCOM_ASPECT_RATIO *dest_aspect_ratio);
+ void parse_nal(OMX_U8* data_ptr, OMX_U32 data_len,
+ OMX_U32 nal_type = NALU_TYPE_UNSPECIFIED,
+ bool enable_emu_sc = true);
+ OMX_S64 process_ts_with_sei_vui(OMX_S64 timestamp);
+ void get_frame_pack_data(OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack);
+ bool is_mbaff();
+ void get_frame_rate(OMX_U32 *frame_rate);
+#ifdef PANSCAN_HDLR
+ void update_panscan_data(OMX_S64 timestamp);
+#endif
+ private:
+ void init_bitstream(OMX_U8* data, OMX_U32 size);
+ OMX_U32 extract_bits(OMX_U32 n);
+ inline bool more_bits();
+ void read_word();
+ OMX_U32 uev();
+ OMX_S32 sev();
+ OMX_S32 iv(OMX_U32 n_bits);
+ void parse_sps();
+ void parse_vui(bool vui_in_extradata = true);
+ void aspect_ratio_info();
+ void hrd_parameters(h264_hrd_param *hrd_param);
+ void parse_sei();
+ void sei_buffering_period();
+ void sei_picture_timing();
+ void sei_pan_scan();
+ void scaling_list(OMX_U32 size_of_scaling_list);
+
+ void print_pan_data(h264_pan_scan *pan_scan_param);
+ void print_frame_pack();
+
+ OMX_U32 get_nal_unit_type(OMX_U32 *nal_unit_type);
+ OMX_S64 calculate_buf_period_ts(OMX_S64 timestamp);
+ OMX_S64 calculate_fixed_fps_ts(OMX_S64 timestamp, OMX_U32 DeltaTfiDivisor);
+ void parse_frame_pack();
+
+ OMX_U32 curr_32_bit;
+ OMX_U32 bits_read;
+ OMX_U32 zero_cntr;
+ OMX_U32 emulation_code_skip_cntr;
+ OMX_U8* bitstream;
+ OMX_U32 bitstream_bytes;
+ OMX_U32 frame_rate;
+ bool emulation_sc_enabled;
+
+ h264_vui_param vui_param;
+ h264_sei_buf_period sei_buf_period;
+ h264_sei_pic_timing sei_pic_timing;
+#ifdef PANSCAN_HDLR
+ panscan_handler *panscan_hdl;
+#else
+ h264_pan_scan panscan_param;
+#endif
+ OMX_QCOM_FRAME_PACK_ARRANGEMENT frame_packing_arrangement;
+ bool mbaff_flag;
+};
#endif /* H264_UTILS_H */
diff --git a/mm-video/vidc/vdec/inc/message_queue.h b/mm-video/vidc/vdec/inc/message_queue.h
index e9edadb8..7e157248 100644..100755
--- a/mm-video/vidc/vdec/inc/message_queue.h
+++ b/mm-video/vidc/vdec/inc/message_queue.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/vdec/inc/mp4_utils.h b/mm-video/vidc/vdec/inc/mp4_utils.h
new file mode 100755
index 00000000..1a08d982
--- /dev/null
+++ b/mm-video/vidc/vdec/inc/mp4_utils.h
@@ -0,0 +1,172 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef MP4_UTILS_H
+#define MP4_UTILS_H
+#include "OMX_Core.h"
+#include "OMX_QCOMExtns.h"
+typedef signed long long int64;
+typedef unsigned long int uint32; /* Unsigned 32 bit value */
+typedef unsigned short uint16; /* Unsigned 16 bit value */
+typedef unsigned char uint8; /* Unsigned 8 bit value */
+
+typedef signed long int int32; /* Signed 32 bit value */
+typedef signed short int16; /* Signed 16 bit value */
+typedef signed char int8; /* Signed 8 bit value */
+
+typedef unsigned char byte; /* Unsigned 8 bit value type. */
+#define SIMPLE_PROFILE_LEVEL0 0x08
+#define SIMPLE_PROFILE_LEVEL1 0x01
+#define SIMPLE_PROFILE_LEVEL2 0x02
+#define SIMPLE_PROFILE_LEVEL3 0x03
+#define SIMPLE_PROFILE_LEVEL4A 0x04
+#define SIMPLE_PROFILE_LEVEL5 0x05
+#define SIMPLE_PROFILE_LEVEL6 0x06
+#define SIMPLE_PROFILE_LEVEL0B 0x09
+
+#define SIMPLE_SCALABLE_PROFILE_LEVEL0 0x10
+#define SIMPLE_SCALABLE_PROFILE_LEVEL1 0x11
+#define SIMPLE_SCALABLE_PROFILE_LEVEL2 0x12
+
+#define SIMPLE_SCALABLE_PROFILE_LEVEL0 0x10
+#define SIMPLE_SCALABLE_PROFILE_LEVEL1 0x11
+#define SIMPLE_SCALABLE_PROFILE_LEVEL2 0x12
+#define ADVANCED_SIMPLE_PROFILE_LEVEL0 0xF0
+#define ADVANCED_SIMPLE_PROFILE_LEVEL1 0xF1
+#define ADVANCED_SIMPLE_PROFILE_LEVEL2 0xF2
+#define ADVANCED_SIMPLE_PROFILE_LEVEL3 0xF3
+#define ADVANCED_SIMPLE_PROFILE_LEVEL4 0xF4
+#define ADVANCED_SIMPLE_PROFILE_LEVEL5 0xF5
+
+#define VISUAL_OBJECT_SEQUENCE_START_CODE 0x000001B0
+#define MP4ERROR_SUCCESS 0
+
+#define VIDEO_OBJECT_LAYER_START_CODE_MASK 0xFFFFFFF0
+#define VIDEO_OBJECT_LAYER_START_CODE 0x00000120
+#define VOP_START_CODE_MASK 0xFFFFFFFF
+#define VOP_START_CODE 0x000001B6
+#define GOV_START_CODE 0x000001B3
+#define SHORT_HEADER_MASK 0xFFFFFC00
+#define SHORT_HEADER_START_MARKER 0x00008000
+#define SHORT_HEADER_START_CODE 0x00008000
+#define SPARK1_START_CODE 0x00008400
+#define MPEG4_SHAPE_RECTANGULAR 0x00
+#define EXTENDED_PAR 0xF
+#define SHORT_VIDEO_START_MARKER 0x20
+#define MP4_INVALID_VOL_PARAM (0x0001) // unsupported VOL parameter
+#define MP4ERROR_UNSUPPORTED_UFEP -1068
+#define MP4ERROR_UNSUPPORTED_SOURCE_FORMAT -1069
+#define MASK(x) (0xFFFFFFFF >> (32 - (x)))
+#define VISUAL_OBJECT_TYPE_VIDEO_ID 0x1
+#define VISUAL_OBJECT_START_CODE 0x000001B5
+#define VIDEO_OBJECT_START_CODE_MASK 0xFFFFFFE0
+#define VIDEO_OBJECT_START_CODE 0x00000100
+
+#define RESERVED_OBJECT_TYPE 0x0
+#define SIMPLE_OBJECT_TYPE 0x1
+#define SIMPLE_SCALABLE_OBJECT_TYPE 0x2
+#define CORE_OBJECT_TYPE 0x3
+#define MAIN_OBJECT_TYPE 0x4
+#define N_BIT_OBJECT_TYPE 0x5
+#define BASIC_ANIMATED_2D_TEXTURE 0x6
+#define ANIMATED_2D_MESH 0x7
+#define ADVANCED_SIMPLE 0x11
+
+
+#define SIMPLE_L1_MAX_VBVBUFFERSIZE 10 /* VBV Max Buffer size=10 (p. 498) */
+#define SIMPLE_L1_MAX_BITRATE 160 /* is is 64kpbs or 160 400bits/sec units */
+#define SIMPLE_L2_MAX_VBVBUFFERSIZE 40 /* VBV Max Buffer size = 40 */
+#define SIMPLE_L2_MAX_BITRATE 320 /* 320 400bps units = 128kpbs */
+#define SIMPLE_L3_MAX_VBVBUFFERSIZE 40 /* VBV Max Buffer size = 40 */
+#define SIMPLE_L3_MAX_BITRATE 960 /* 960 400bps units = 384kpbs */
+
+/* The MP4 decoder currently supports Simple Profile@L3 */
+#define MAX_VBVBUFFERSIZE (SIMPLE_L3_MAX_VBVBUFFERSIZE)
+#define MAX_BITRATE (SIMPLE_L3_MAX_BITRATE)
+
+#define MAX_QUANTPRECISION 9
+#define MIN_QUANTPRECISION 3
+
+#define MP4_VGA_WIDTH 640
+#define MP4_VGA_HEIGHT 480
+#define MP4_WVGA_WIDTH 800
+#define MP4_WVGA_HEIGHT 480
+#define MP4_720P_WIDTH 1280
+#define MP4_720P_HEIGHT 720
+
+#define MP4_MAX_DECODE_WIDTH MP4_720P_WIDTH
+#define MP4_MAX_DECODE_HEIGHT MP4_720P_HEIGHT
+
+typedef struct {
+ unsigned char *data;
+ unsigned long int numBytes;
+} mp4StreamType;
+
+#define MAX_FRAMES_IN_CHUNK 10
+#define VOP_START_CODE 0x000001B6
+#define VOL_START_CODE 0x000001B0
+
+typedef enum VOPTYPE
+{
+ NO_VOP = -1, // bitstream contains no VOP.
+ MPEG4_I_VOP = 0, // bitstream contains an MPEG4 I-VOP
+ MPEG4_P_VOP = 1, // bitstream contains an MPEG4 P-VOP
+ MPEG4_B_VOP = 2, // bitstream contains an MPEG4 B-VOP
+ MPEG4_S_VOP = 3, // bitstream contains an MPEG4 S-VOP
+} VOP_TYPE;
+
+typedef struct
+{
+ uint32 timestamp_increment;
+ uint32 offset;
+ uint32 size;
+ VOP_TYPE vopType;
+} mp4_frame_info_type;
+
+void mp4_fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
+ OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
+class MP4_Utils {
+private:
+ struct posInfoType {
+ uint8 *bytePtr;
+ uint8 bitPos;
+ };
+
+ posInfoType m_posInfo;
+ byte *m_dataBeginPtr;
+ unsigned int vop_time_resolution;
+ bool vop_time_found;
+ uint16 m_SrcWidth, m_SrcHeight; // Dimensions of the source clip
+public:
+ MP4_Utils();
+ ~MP4_Utils();
+ int16 populateHeightNWidthFromShortHeader(mp4StreamType * psBits);
+ bool parseHeader(mp4StreamType * psBits);
+ static uint32 read_bit_field(posInfoType * posPtr, uint32 size);
+ bool is_notcodec_vop(unsigned char *pbuffer, unsigned int len);
+};
+#endif
diff --git a/mm-video/vidc/vdec/inc/omx_vdec.h b/mm-video/vidc/vdec/inc/omx_vdec.h
index aec4b09e..ba84362b 100644..100755
--- a/mm-video/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video/vidc/vdec/inc/omx_vdec.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -40,16 +40,33 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Include Files
//////////////////////////////////////////////////////////////////////////////
-#include<stdlib.h>
-
+#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <cstddef>
+
+static ptrdiff_t x;
#ifdef _ANDROID_
+#ifdef USE_ION
+#include <ion_msm.h>
+#endif
#include <binder/MemoryHeapBase.h>
+#include <ui/ANativeObjectBase.h>
extern "C"{
#include<utils/Log.h>
}
-//#define LOG_TAG "OMX-VDEC-720P"
+#include <linux/videodev2.h>
+#include <poll.h>
+#define TIMEOUT 5000
+#ifdef MAX_RES_720P
+#define LOG_TAG "OMX-VDEC-720P"
+#elif MAX_RES_1080P
+#define LOG_TAG "OMX-VDEC-1080P"
+#else
+#define LOG_TAG "OMX-VDEC"
+#endif
#ifdef ENABLE_DEBUG_LOW
#define DEBUG_PRINT_LOW ALOGE
#else
@@ -65,29 +82,56 @@ extern "C"{
#else
#define DEBUG_PRINT_ERROR
#endif
+
+#else //_ANDROID_
+#define DEBUG_PRINT_LOW printf
+#define DEBUG_PRINT_HIGH printf
+#define DEBUG_PRINT_ERROR printf
#endif // _ANDROID_
+#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
+#include <media/hardware/HardwareAPI.h>
+#endif
+
+#include <unistd.h>
+
+#if defined (_ANDROID_ICS_)
+#include <gralloc_priv.h>
+#endif
+
#include <pthread.h>
#ifndef PC_DEBUG
#include <semaphore.h>
#endif
#include "OMX_Core.h"
#include "OMX_QCOMExtns.h"
-//#include "vdec.h"
#include "qc_omx_component.h"
-//#include "Map.h"
-//#include "OmxUtils.h"
#include <linux/msm_vidc_dec.h>
#include "frameparser.h"
+#ifdef MAX_RES_1080P
+#include "mp4_utils.h"
+#endif
#include <linux/android_pmem.h>
+#include "extra_data_handler.h"
+#include "ts_parser.h"
extern "C" {
OMX_API void * get_omx_component_factory_fn(void);
}
-
#ifdef _ANDROID_
using namespace android;
+#ifdef USE_ION
+ class VideoHeap : public MemoryHeapBase
+ {
+ public:
+ VideoHeap(int devicefd, size_t size, void* base,struct ion_handle *handle,int mapfd);
+ virtual ~VideoHeap() {}
+ private:
+ int m_ion_device_fd;
+ struct ion_handle *m_ion_handle;
+ };
+#else
// local pmem heap object
class VideoHeap : public MemoryHeapBase
{
@@ -95,6 +139,7 @@ extern "C" {
VideoHeap(int fd, size_t size, void* base);
virtual ~VideoHeap() {}
};
+#endif
#endif // _ANDROID_
//////////////////////////////////////////////////////////////////////////////
// Module specific globals
@@ -129,15 +174,6 @@ extern "C" {
#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
& BITMASK_FLAG(mIndex)) == 0x0)
-#define OMX_VIDEO_DEC_NUM_INPUT_BUFFERS 2
-#define OMX_VIDEO_DEC_NUM_OUTPUT_BUFFERS 2
-
-#ifdef FEATURE_QTV_WVGA_ENABLE
-#define OMX_VIDEO_DEC_INPUT_BUFFER_SIZE (256*1024)
-#else
-#define OMX_VIDEO_DEC_INPUT_BUFFER_SIZE (128*1024)
-#endif
-
#define OMX_CORE_CONTROL_CMDQ_SIZE 100
#define OMX_CORE_QCIF_HEIGHT 144
#define OMX_CORE_QCIF_WIDTH 176
@@ -146,22 +182,76 @@ extern "C" {
#define OMX_CORE_WVGA_HEIGHT 480
#define OMX_CORE_WVGA_WIDTH 800
+#define DESC_BUFFER_SIZE (8192 * 16)
+
+#ifdef _ANDROID_
+#define MAX_NUM_INPUT_OUTPUT_BUFFERS 32
+#endif
+
+#define OMX_FRAMEINFO_EXTRADATA 0x00010000
+#define OMX_INTERLACE_EXTRADATA 0x00020000
+#define OMX_TIMEINFO_EXTRADATA 0x00040000
+#define OMX_PORTDEF_EXTRADATA 0x00080000
+#define DRIVER_EXTRADATA_MASK 0x0000FFFF
+
+#define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
+ sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
+#define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
+ sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
+#define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
+ sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
+
+// Define next macro with required values to enable default extradata,
+// VDEC_EXTRADATA_MB_ERROR_MAP
+// OMX_INTERLACE_EXTRADATA
+// OMX_FRAMEINFO_EXTRADATA
+// OMX_TIMEINFO_EXTRADATA
+
+//#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
+
+enum port_indexes
+{
+ OMX_CORE_INPUT_PORT_INDEX =0,
+ OMX_CORE_OUTPUT_PORT_INDEX =1
+};
+#ifdef USE_ION
+struct vdec_ion
+{
+ int ion_device_fd;
+ struct ion_fd_data fd_ion_data;
+ struct ion_allocation_data ion_alloc_data;
+};
+#endif
struct video_driver_context
{
int video_driver_fd;
enum vdec_codec decoder_format;
enum vdec_output_fromat output_format;
- struct vdec_picsize video_resoultion;
- struct vdec_allocatorproperty input_buffer;
- struct vdec_allocatorproperty output_buffer;
+ enum vdec_interlaced_format interlace;
+ enum vdec_output_order picture_order;
+ struct vdec_picsize video_resolution;
+ struct vdec_allocatorproperty ip_buf;
+ struct vdec_allocatorproperty op_buf;
struct vdec_bufferpayload *ptr_inputbuffer;
struct vdec_bufferpayload *ptr_outputbuffer;
struct vdec_output_frameinfo *ptr_respbuffer;
+#ifdef USE_ION
+ struct vdec_ion *ip_buf_ion_info;
+ struct vdec_ion *op_buf_ion_info;
+ struct vdec_ion h264_mv;
+#endif
+ struct vdec_framerate frame_rate;
+ unsigned extradata;
+ bool timestamp_adjust;
char kind[128];
+ bool idr_only_decoding;
+ unsigned disable_dmx;
};
-class OmxUtils;
+#ifdef _ANDROID_
+class DivXDrmDecrypt;
+#endif //_ANDROID_
// OMX video decoder class
class omx_vdec: public qc_omx_component
@@ -274,16 +364,21 @@ public:
OMX_U32 bytes,
OMX_U8 *buffer);
+ OMX_ERRORTYPE use_input_heap_buffers(
+ OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_U32 port,
+ OMX_PTR appData,
+ OMX_U32 bytes,
+ OMX_U8* buffer);
OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE hComp,
OMX_BUFFERHEADERTYPE **bufferHdr,
OMX_U32 port,
OMX_PTR appData,
void * eglImage);
-
-
-
- struct video_driver_context driver_context;
+ void complete_pending_buffer_done_cbs();
+ struct video_driver_context drv_ctx;
int m_pipe_in;
int m_pipe_out;
pthread_t msg_thread_id;
@@ -313,8 +408,9 @@ private:
OMX_COMPONENT_OUTPUT_FLUSH_PENDING =0x9,
OMX_COMPONENT_INPUT_FLUSH_PENDING =0xA,
OMX_COMPONENT_PAUSE_PENDING =0xB,
- OMX_COMPONENT_EXECUTE_PENDING =0xC
-
+ OMX_COMPONENT_EXECUTE_PENDING =0xC,
+ OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
+ OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE
};
// Deferred callback identifiers
@@ -346,13 +442,11 @@ private:
OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
- OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12
- };
-
- enum port_indexes
- {
- OMX_CORE_INPUT_PORT_INDEX =0,
- OMX_CORE_OUTPUT_PORT_INDEX =1
+ OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
+ OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
+ OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
+ OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
+ OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
};
enum vc1_profile_type
@@ -361,6 +455,15 @@ private:
VC1_AP = 2
};
+#ifdef _COPPER_
+ enum v4l2_ports
+ {
+ CAPTURE_PORT,
+ OUTPUT_PORT,
+ MAX_PORT
+ };
+#endif
+
struct omx_event
{
unsigned param1;
@@ -384,16 +487,41 @@ private:
};
- OMX_ERRORTYPE omx_vdec_check_port_settings(bool *port_setting_changed);
- OMX_ERRORTYPE omx_vdec_validate_port_param(int height, int width);
+#ifdef _ANDROID_
+ struct ts_entry
+ {
+ OMX_TICKS timestamp;
+ bool valid;
+ };
+
+ struct ts_arr_list
+ {
+ ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
+ ts_arr_list();
+ ~ts_arr_list();
+ bool insert_ts(OMX_TICKS ts);
+ bool pop_min_ts(OMX_TICKS &ts);
+ bool reset_ts_list();
+ };
+#endif
+
+ struct desc_buffer_hdr
+ {
+ OMX_U8 *buf_addr;
+ OMX_U32 desc_data_size;
+ };
bool allocate_done(void);
bool allocate_input_done(void);
bool allocate_output_done(void);
OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+ OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
+ OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
+ void free_output_buffer_header();
+ void free_input_buffer_header();
OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE hComp,
OMX_BUFFERHEADERTYPE **bufferHdr,
@@ -413,24 +541,24 @@ private:
OMX_U32 port,OMX_PTR appData,
OMX_U32 bytes);
- OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
- OMX_BUFFERHEADERTYPE **bufferHdr,
- OMX_U32 port,
- OMX_PTR appData,
- OMX_U32 bytes,
- OMX_U8 *buffer);
-
OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
OMX_BUFFERHEADERTYPE **bufferHdr,
OMX_U32 port,
OMX_PTR appData,
OMX_U32 bytes,
OMX_U8 *buffer);
+#ifdef MAX_RES_720P
+ OMX_ERRORTYPE get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
+#endif
+#ifdef MAX_RES_1080P
+ OMX_ERRORTYPE get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
+#endif
+ OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
+ OMX_ERRORTYPE allocate_output_headers();
bool execute_omx_flush(OMX_U32);
- bool execute_output_flush(OMX_U32);
- bool execute_input_flush(OMX_U32);
- bool register_output_buffers();
+ bool execute_output_flush();
+ bool execute_input_flush();
OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
OMX_BUFFERHEADERTYPE * buffer);
@@ -454,9 +582,43 @@ private:
bool release_output_done();
bool release_input_done();
+ OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
+ OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
+ OMX_ERRORTYPE start_port_reconfig();
+ OMX_ERRORTYPE update_picture_resolution();
+ void stream_off();
+ void adjust_timestamp(OMX_S64 &act_timestamp);
+ void set_frame_rate(OMX_S64 act_timestamp);
+ void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
+ OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
+ void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+ void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+ OMX_U32 interlaced_format_type);
+ void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+ OMX_U32 num_conceal_mb,
+ OMX_U32 picture_type,
+ OMX_S64 timestamp,
+ OMX_U32 frame_rate,
+ struct vdec_aspectratioinfo *aspect_ratio_info);
+ void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
+ OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
+ void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+ OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
+ void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
+ void insert_demux_addr_offset(OMX_U32 address_offset);
+ void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
+ OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
+ OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
OMX_U32 alignment);
+#ifdef USE_ION
+ int 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);
+ void free_ion_memory(struct vdec_ion *buf_ion_info);
+#endif
+
OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE hComp,
OMX_COMMANDTYPE cmd,
@@ -477,16 +639,34 @@ private:
return x;
}
+#ifdef MAX_RES_1080P
+ OMX_ERRORTYPE vdec_alloc_h264_mv();
+ void vdec_dealloc_h264_mv();
+#endif
+
inline void omx_report_error ()
{
- DEBUG_PRINT_ERROR("\nERROR: Sending OMX_EventError to Client");
if (m_cb.EventHandler && !m_error_propogated)
{
+ ALOGE("\nERROR: Sending OMX_EventError to Client");
m_error_propogated = true;
m_cb.EventHandler(&m_cmp,m_app_data,
OMX_EventError,OMX_ErrorHardware,0,NULL);
}
}
+#ifdef _ANDROID_
+ OMX_ERRORTYPE createDivxDrmContext();
+#endif //_ANDROID_
+#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
+ OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
+#endif
+#if defined (_ANDROID_ICS_)
+ struct nativebuffer{
+ native_handle_t *nativehandle;
+ int inuse;
+ };
+ nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
+#endif
//*************************************************************
@@ -504,7 +684,6 @@ private:
OMX_PTR m_app_data;
// Application callbacks
OMX_CALLBACKTYPE m_cb;
- OMX_COLOR_FORMATTYPE m_color_format;
OMX_PRIORITYMGMTTYPE m_priority_mgm ;
OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
// fill this buffer queue
@@ -516,60 +695,49 @@ private:
OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
// Output memory pointer
OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
+ // number of input bitstream error frame count
+ unsigned int m_inp_err_count;
+#ifdef _ANDROID_
+ // Timestamp list
+ ts_arr_list m_timestamp_list;
+#endif
bool input_flush_progress;
bool output_flush_progress;
bool input_use_buffer;
bool output_use_buffer;
+ bool ouput_egl_buffers;
+ OMX_BOOL m_use_output_pmem;
+ OMX_BOOL m_out_mem_region_smi;
+ OMX_BOOL m_out_pvt_entry_pmem;
+
int pending_input_buffers;
int pending_output_buffers;
- int m_ineos_reached;
- int m_outeos_pending;
- int m_outeos_reached;
// bitmask array size for output side
unsigned int m_out_bm_count;
- // Number of Output Buffers
- unsigned int m_out_buf_count;
- unsigned int m_out_buf_count_min;
- unsigned int m_out_buf_size;
- // Number of Input Buffers
- unsigned int m_inp_buf_count;
- unsigned int m_inp_buf_count_min;
- // Size of Input Buffers
- unsigned int m_inp_buf_size;
// bitmask array size for input side
unsigned int m_inp_bm_count;
//Input port Populated
OMX_BOOL m_inp_bPopulated;
//Output port Populated
OMX_BOOL m_out_bPopulated;
- //Height
- unsigned int m_height;
- // Width
- unsigned int m_width;
- unsigned int stride;
- unsigned int scan_lines;
- // Storage of HxW during dynamic port reconfig
- unsigned int m_port_height;
- unsigned int m_port_width;
-
- unsigned int m_crop_x;
- unsigned int m_crop_y;
- unsigned int m_crop_dx;
- unsigned int m_crop_dy;
// encapsulate the waiting states.
unsigned int m_flags;
#ifdef _ANDROID_
// Heap pointer to frame buffers
- sp<MemoryHeapBase> m_heap_ptr;
+ struct vidc_heap
+ {
+ sp<MemoryHeapBase> video_heap_ptr;
+ };
+ struct vidc_heap *m_heap_ptr;
+ unsigned int m_heap_count;
#endif //_ANDROID_
// store I/P PORT state
OMX_BOOL m_inp_bEnabled;
// store O/P PORT state
OMX_BOOL m_out_bEnabled;
- // to know whether Event Port Settings change has been triggered or not.
- bool m_event_port_settings_sent;
+ OMX_U32 m_in_alloc_cnt;
OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE];
// Platform specific details
OMX_QCOM_PLATFORM_PRIVATE_LIST *m_platform_list;
@@ -598,18 +766,88 @@ private:
int first_frame;
unsigned char *first_buffer;
int first_frame_size;
- unsigned int mp4h263_flags;
- unsigned int mp4h263_timestamp;
- bool set_seq_header_done;
- bool gate_output_buffers;
- bool gate_input_buffers;
- bool sent_first_frame;
- unsigned int m_out_buf_count_recon;
- unsigned int m_out_buf_count_min_recon;
- unsigned int m_out_buf_size_recon;
unsigned char m_hwdevice_name[80];
FILE *m_device_file_ptr;
enum vc1_profile_type m_vc1_profile;
+ OMX_S64 h264_last_au_ts;
+ OMX_U32 h264_last_au_flags;
+ OMX_U32 m_demux_offsets[8192];
+ OMX_U32 m_demux_entries;
+
+ OMX_S64 prev_ts;
+ bool rst_prev_ts;
+ OMX_U32 frm_int;
+
+ struct vdec_allocatorproperty op_buf_rcnfg;
+ bool in_reconfig;
+ OMX_NATIVE_WINDOWTYPE m_display_id;
+ h264_stream_parser *h264_parser;
+ OMX_U32 client_extradata;
+#ifdef _ANDROID_
+ bool m_debug_timestamp;
+ bool perf_flag;
+ OMX_U32 proc_frms, latency;
+ perf_metrics fps_metrics;
+ perf_metrics dec_time;
+ bool m_enable_android_native_buffers;
+ bool m_use_android_native_buffers;
+ bool m_debug_extradata;
+ bool m_debug_concealedmb;
+#endif
+#ifdef MAX_RES_1080P
+ MP4_Utils mp4_headerparser;
+#endif
+
+ struct h264_mv_buffer{
+ unsigned char* buffer;
+ int size;
+ int count;
+ int pmem_fd;
+ int offset;
+ };
+ h264_mv_buffer h264_mv_buff;
+ extra_data_handler extra_data_handle;
+#ifdef _ANDROID_
+ DivXDrmDecrypt* iDivXDrmDecrypt;
+#endif //_ANDROID_
+ OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
+ omx_time_stamp_reorder time_stamp_dts;
+ desc_buffer_hdr *m_desc_buffer_ptr;
+ bool secure_mode;
+ OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
+ bool codec_config_flag;
+#ifdef _COPPER_
+ int capture_capability;
+ int output_capability;
+ bool streaming[MAX_PORT];
+#endif
};
+#ifdef _COPPER_
+enum instance_state {
+ MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
+ MSM_VIDC_CORE_INIT,
+ MSM_VIDC_CORE_INIT_DONE,
+ MSM_VIDC_OPEN,
+ MSM_VIDC_OPEN_DONE,
+ MSM_VIDC_LOAD_RESOURCES,
+ MSM_VIDC_LOAD_RESOURCES_DONE,
+ MSM_VIDC_START,
+ MSM_VIDC_START_DONE,
+ MSM_VIDC_STOP,
+ MSM_VIDC_STOP_DONE,
+ MSM_VIDC_RELEASE_RESOURCES,
+ MSM_VIDC_RELEASE_RESOURCES_DONE,
+ MSM_VIDC_CLOSE,
+ MSM_VIDC_CLOSE_DONE,
+ MSM_VIDC_CORE_UNINIT,
+};
+
+enum vidc_resposes_id {
+ MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
+ MSM_VIDC_DECODER_EVENT_CHANGE,
+};
+
+#endif // _COPPER_
+
#endif // __OMX_VDEC_H__
diff --git a/mm-video/vidc/vdec/inc/qtypes.h b/mm-video/vidc/vdec/inc/qtypes.h
index 8fc7a866..3cff46eb 100644..100755
--- a/mm-video/vidc/vdec/inc/qtypes.h
+++ b/mm-video/vidc/vdec/inc/qtypes.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/vdec/inc/queue.h b/mm-video/vidc/vdec/inc/queue.h
index 2a7d331e..195d9b20 100644..100755
--- a/mm-video/vidc/vdec/inc/queue.h
+++ b/mm-video/vidc/vdec/inc/queue.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/vdec/inc/ts_parser.h b/mm-video/vidc/vdec/inc/ts_parser.h
new file mode 100755
index 00000000..3e030432
--- /dev/null
+++ b/mm-video/vidc/vdec/inc/ts_parser.h
@@ -0,0 +1,88 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef __DTSPARSER_H
+#define __DTSPARSER_H
+
+#include "OMX_Core.h"
+#include "OMX_QCOMExtns.h"
+#include "qc_omx_component.h"
+
+#include<stdlib.h>
+
+#include <stdio.h>
+#include <inttypes.h>
+
+#ifdef _ANDROID_
+extern "C"{
+#include<utils/Log.h>
+}
+#else
+#define ALOGE(fmt, args...) fprintf(stderr, fmt, ##args)
+#endif /* _ANDROID_ */
+
+class omx_time_stamp_reorder {
+public:
+ omx_time_stamp_reorder();
+ ~omx_time_stamp_reorder();
+ void set_timestamp_reorder_mode(bool flag);
+ void enable_debug_print(bool flag);
+ bool insert_timestamp(OMX_BUFFERHEADERTYPE *header);
+ bool get_next_timestamp(OMX_BUFFERHEADERTYPE *header, bool is_interlaced);
+ bool remove_time_stamp(OMX_TICKS ts, bool is_interlaced);
+ void flush_timestamp();
+
+private:
+ #define TIME_SZ 64
+ typedef struct timestamp {
+ OMX_TICKS timestamps;
+ bool in_use;
+ }timestamp;
+ typedef struct time_stamp_list {
+ timestamp input_timestamps[TIME_SZ];
+ time_stamp_list *next;
+ time_stamp_list *prev;
+ unsigned int entries_filled;
+ }time_stamp_list;
+ bool error;
+ time_stamp_list *phead,*pcurrent;
+ bool get_current_list();
+ bool add_new_list();
+ bool update_head();
+ void delete_list();
+ void handle_error()
+ {
+ ALOGE("Error handler called for TS Parser");
+ if (error)
+ return;
+ error = true;
+ delete_list();
+ }
+ bool reorder_ts;
+ bool print_debug;
+};
+#endif
diff --git a/mm-video/vidc/vdec/src/frameparser.cpp b/mm-video/vidc/vdec/src/frameparser.cpp
index 46ad9e88..5ca324b8 100644..100755
--- a/mm-video/vidc/vdec/src/frameparser.cpp
+++ b/mm-video/vidc/vdec/src/frameparser.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -25,6 +25,23 @@ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------*/
+#include <stdio.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/time.h>
+#include <sys/poll.h>
+#include <stdint.h>
+
#include "frameparser.h"
#include "omx_vdec.h"
@@ -43,22 +60,24 @@ static unsigned char MPEG4_mask_code[4] = {0xFF,0xFF,0xFF,0xFF};
static unsigned char H263_start_code[4] = {0x00,0x00,0x80,0x00};
static unsigned char H263_mask_code[4] = {0xFF,0xFF,0xFC,0x00};
-static unsigned char VC1_AP_start_code[4] = {0x00,0x00,0x01,0x0D};
-static unsigned char VC1_AP_mask_code[4] = {0xFF,0xFF,0xFF,0xFF};
+static unsigned char VC1_AP_start_code[4] = {0x00,0x00,0x01,0x0C};
+static unsigned char VC1_AP_mask_code[4] = {0xFF,0xFF,0xFF,0xFC};
+
+static unsigned char MPEG2_start_code[4] = {0x00, 0x00, 0x01, 0x00};
+static unsigned char MPEG2_mask_code[4] = {0xFF, 0xFF, 0xFF, 0xFF};
-frame_parse::frame_parse():mutils(NULL),
- parse_state(A0),
- last_byte(0),
- prev_one(0),
+frame_parse::frame_parse():parse_state(A0),
+ last_byte_h263(0),
state_nal(NAL_LENGTH_ACC),
nal_length(0),
accum_length(0),
bytes_tobeparsed(0),
- time_stamp (0),
- flags (0)
+ mutils(NULL),
+ start_code(NULL),
+ mask_code(NULL),
+ header_found(false),
+ skip_frame_boundary(false)
{
- memset (start_code,0,sizeof (start_code));
- memset (mask_code,0,sizeof (mask_code));
}
frame_parse::~frame_parse ()
@@ -72,7 +91,7 @@ frame_parse::~frame_parse ()
int frame_parse::init_start_codes (codec_type codec_type_parse)
{
/*Check if Codec Type is proper and we are in proper state*/
- if (codec_type_parse > CODEC_TYPE_VC1 || parse_state != A0)
+ if (codec_type_parse > CODEC_TYPE_MAX || parse_state != A0)
{
return -1;
}
@@ -80,22 +99,26 @@ int frame_parse::init_start_codes (codec_type codec_type_parse)
switch (codec_type_parse)
{
case CODEC_TYPE_MPEG4:
- memcpy (start_code,MPEG4_start_code,4);
- memcpy (mask_code,MPEG4_mask_code,4);
+ start_code = MPEG4_start_code;
+ mask_code = MPEG4_mask_code;
break;
case CODEC_TYPE_H263:
- memcpy (start_code,H263_start_code,4);
- memcpy (mask_code,H263_mask_code,4);
+ start_code = H263_start_code;
+ mask_code = H263_mask_code;
break;
case CODEC_TYPE_H264:
- memcpy (start_code,H264_start_code,4);
- memcpy (mask_code,H264_mask_code,4);
+ start_code = H264_start_code;
+ mask_code = H264_mask_code;
break;
case CODEC_TYPE_VC1:
- memcpy (start_code,VC1_AP_start_code,4);
- memcpy (mask_code,VC1_AP_mask_code,4);
+ start_code = VC1_AP_start_code;
+ mask_code = VC1_AP_mask_code;
break;
- }
+ case CODEC_TYPE_MPEG2:
+ start_code = MPEG2_start_code;
+ mask_code = MPEG2_mask_code;
+ break;
+ }
return 1;
}
@@ -111,11 +134,11 @@ int frame_parse::init_nal_length (unsigned int nal_len)
return 1;
}
-int frame_parse::parse_mpeg4_frame ( OMX_BUFFERHEADERTYPE *source,
+int frame_parse::parse_sc_frame ( OMX_BUFFERHEADERTYPE *source,
OMX_BUFFERHEADERTYPE *dest ,
OMX_U32 *partialframe)
{
- OMX_U8 *pdest = NULL,*psource = NULL;
+ OMX_U8 *pdest = NULL,*psource = NULL, match_found = FALSE, is_byte_match = 0;
OMX_U32 dest_len =0, source_len = 0, temp_len = 0;
OMX_U32 parsed_length = 0,i=0;
int residue_byte = 0;
@@ -131,49 +154,72 @@ int frame_parse::parse_mpeg4_frame ( OMX_BUFFERHEADERTYPE *source,
pdest = dest->pBuffer + (dest->nFilledLen + dest->nOffset);
source_len = source->nFilledLen;
- /*Need Minimum of 4 for destination to copy atleast Start code*/
- if (dest_len < 4 || source_len == 0)
+ /*Need Minimum Start Code size for destination to copy atleast Start code*/
+ if ((start_code == H263_start_code && dest_len < 3) ||
+ (start_code != H263_start_code && dest_len < 4) || (source_len == 0))
{
- DEBUG_PRINT_LOW("\n Dest_len %d source_len %d",dest_len,source_len);
+ DEBUG_PRINT_LOW("\n FrameParser: dest_len %d source_len %d",dest_len,source_len);
if (source_len == 0 && (source->nFlags & 0x01))
{
- DEBUG_PRINT_LOW("\n EOS condition Inform Client that it is complete frame");
+ DEBUG_PRINT_LOW("\n FrameParser: EOS rxd!! Notify it as a complete frame");
*partialframe = 0;
return 1;
}
- DEBUG_PRINT_LOW("\n Error in Parsing bitstream");
+ DEBUG_PRINT_LOW("\n FrameParser: Bitstream Parsing error");
return -1;
}
/*Check if State of the previous find is a Start code*/
- if (parse_state == A4)
+ if (parse_state == A4 || parse_state == A5)
{
/*Check for minimun size should be 4*/
- dest->nFlags = flags;
- dest->nTimeStamp = time_stamp;
- update_metadata(source->nTimeStamp,source->nFlags);
- memcpy (pdest,start_code,4);
- pdest [2] = prev_one;
- pdest [3] = last_byte;
- dest->nFilledLen += 4;
- pdest += 4;
+ dest->nFlags = source->nFlags;
+ dest->nTimeStamp = source->nTimeStamp;
+
+ if(start_code == H263_start_code)
+ {
+ memcpy (pdest,start_code,2);
+ pdest[2] = last_byte_h263;
+ dest->nFilledLen += 3;
+ pdest += 3;
+ }
+ else
+ {
+ memcpy (pdest,start_code,4);
+ if (start_code == VC1_AP_start_code
+ || start_code == MPEG4_start_code
+ || start_code == MPEG2_start_code)
+ {
+ pdest[3] = last_byte;
+ update_skip_frame();
+ }
+ dest->nFilledLen += 4;
+ pdest += 4;
+ }
parse_state = A0;
}
/*Entry State Machine*/
while ( source->nFilledLen > 0 && parse_state != A0
- && parse_state != A4 && dest_len > 0
+ && parse_state != A4 && parse_state != A5 && dest_len > 0
)
{
//printf ("\n In the Entry Loop");
switch (parse_state)
{
- case A3:
+ case A3:
+ parse_additional_start_code(psource,&parsed_length);
+ if (parse_state == A4) {
+ source->nFilledLen--;
+ source->nOffset++;
+ psource++;
+ break;
+ }
/*If fourth Byte is matching then start code is found*/
if ((*psource & mask_code [3]) == start_code [3])
{
- last_byte = *psource;
parse_state = A4;
+ last_byte = *psource;
source->nFilledLen--;
source->nOffset++;
psource++;
@@ -204,32 +250,58 @@ int frame_parse::parse_mpeg4_frame ( OMX_BUFFERHEADERTYPE *source,
}
break;
- case A2:
- if ((*psource & mask_code [2]) == start_code [2])
- {
- prev_one = *psource;
- parse_state = A3;
- source->nFilledLen--;
- source->nOffset++;
- psource++;
- }
- else if ( start_code [1] == start_code [0])
- {
- parse_state = A1;
- memcpy (pdest,start_code,1);
- dest->nFilledLen +=1;
- dest_len--;
- pdest++;
- }
- else
- {
- parse_state = A0;
- memcpy (pdest,start_code,2);
- dest->nFilledLen +=2;
- dest_len -= 2;
- pdest += 2;
- }
- break;
+ case A2:
+ is_byte_match = ((*psource & mask_code [2]) == start_code [2]);
+ match_found = FALSE;
+
+ if (start_code == H263_start_code)
+ {
+ if (is_byte_match)
+ {
+ last_byte_h263 = *psource;
+ parse_state = A5;
+ match_found = TRUE;
+ }
+ }
+ else if (start_code == H264_start_code &&
+ (*psource & mask_code [3]) == start_code [3])
+ {
+ parse_state = A5;
+ match_found = TRUE;
+ }
+ else
+ {
+ if (is_byte_match)
+ {
+ parse_state = A3;
+ match_found = TRUE;
+ }
+ }
+
+ if (match_found)
+ {
+ source->nFilledLen--;
+ source->nOffset++;
+ psource++;
+ }
+ else if (start_code [1] == start_code [0])
+ {
+ parse_state = A1;
+ memcpy (pdest,start_code,1);
+ dest->nFilledLen +=1;
+ dest_len--;
+ pdest++;
+ }
+ else
+ {
+ parse_state = A0;
+ memcpy (pdest,start_code,2);
+ dest->nFilledLen +=2;
+ dest_len -= 2;
+ pdest += 2;
+ }
+
+ break;
case A1:
if ((*psource & mask_code [1]) == start_code [1])
@@ -255,10 +327,11 @@ int frame_parse::parse_mpeg4_frame ( OMX_BUFFERHEADERTYPE *source,
dest_len = dest->nAllocLen - (dest->nFilledLen + dest->nOffset);
}
- if (parse_state == A4)
+ if (parse_state == A4 || parse_state == A5)
{
*partialframe = 0;
- DEBUG_PRINT_LOW("\n Nal Found length is %d",dest->nFilledLen);
+ check_skip_frame_boundary(partialframe);
+ DEBUG_PRINT_LOW("\n FrameParser: Parsed Len = %d", dest->nFilledLen);
return 1;
}
@@ -303,22 +376,51 @@ int frame_parse::parse_mpeg4_frame ( OMX_BUFFERHEADERTYPE *source,
}
break;
case A2:
- if ((psource [parsed_length] & mask_code [2]) == start_code [2])
+ is_byte_match = ((psource[parsed_length] & mask_code [2]) == start_code [2]);
+ match_found = FALSE;
+
+ if (start_code == H263_start_code)
{
- prev_one = psource [parsed_length];
- parsed_length++;
- parse_state = A3;
+ if (is_byte_match)
+ {
+ last_byte_h263 = psource[parsed_length];
+ parse_state = A5;
+ match_found = TRUE;
+ }
+ }
+ else if (start_code == H264_start_code &&
+ (psource[parsed_length] & mask_code [3]) == start_code [3])
+ {
+ parse_state = A5;
+ match_found = TRUE;
+ }
+ else
+ {
+ if(is_byte_match)
+ {
+ parse_state = A3;
+ match_found = TRUE;
+ }
+ }
+
+ if (match_found)
+ {
+ parsed_length++;
}
else if (start_code [1] == start_code [0])
{
- parse_state = A1;
+ parse_state = A1;
}
else
{
- parse_state = A0;
+ parse_state = A0;
}
+
break;
case A3:
+ parse_additional_start_code(psource,&parsed_length);
+ if (parse_state == A4) break;
+
if ((psource [parsed_length] & mask_code [3]) == start_code [3])
{
last_byte = psource [parsed_length];
@@ -338,12 +440,10 @@ int frame_parse::parse_mpeg4_frame ( OMX_BUFFERHEADERTYPE *source,
parse_state = A0;
}
break;
- default:
- break;
}
/*Found the code break*/
- if (parse_state == A4)
+ if (parse_state == A4 || parse_state == A5)
{
break;
}
@@ -353,8 +453,18 @@ int frame_parse::parse_mpeg4_frame ( OMX_BUFFERHEADERTYPE *source,
psource = source->pBuffer + source->nOffset;
switch (parse_state)
{
+ case A5:
+ *partialframe = 0;
+ check_skip_frame_boundary(partialframe);
+ if (parsed_length > 3)
+ {
+ memcpy (pdest,psource,(parsed_length-3));
+ dest->nFilledLen += (parsed_length-3);
+ }
+ break;
case A4:
*partialframe = 0;
+ check_skip_frame_boundary(partialframe);
if (parsed_length > 4)
{
memcpy (pdest,psource,(parsed_length-4));
@@ -418,8 +528,8 @@ int frame_parse::parse_h264_nallength (OMX_BUFFERHEADERTYPE *source,
if (dest_len < 4 || source_len == 0 || nal_length == 0)
{
- DEBUG_PRINT_LOW("\n Destination %d source %d nal length %d",\
- dest_len,source_len,nal_length);
+ DEBUG_PRINT_LOW("\n FrameParser: NAL Parsing Error! dest_len %d "
+ "source_len %d nal_length %d", dest_len, source_len, nal_length);
return -1;
}
*partialframe = 1;
@@ -462,6 +572,9 @@ int frame_parse::parse_h264_nallength (OMX_BUFFERHEADERTYPE *source,
psource = source->pBuffer + source->nOffset;
pdest = dest->pBuffer + (dest->nFilledLen + dest->nOffset);
+ dest->nTimeStamp = source->nTimeStamp;
+ dest->nFlags = source->nFlags;
+
/*Already in Parsing state go ahead and copy*/
if(state_nal == NAL_PARSING && temp_len > 0)
{
@@ -499,10 +612,57 @@ void frame_parse::flush ()
state_nal = NAL_LENGTH_ACC;
accum_length = 0;
bytes_tobeparsed = 0;
+ header_found = false;
+ skip_frame_boundary = false;
}
-void frame_parse::update_metadata (unsigned int ts ,unsigned int flgs)
+void frame_parse::parse_additional_start_code(OMX_U8 *psource,
+ OMX_U32 *parsed_length)
{
- time_stamp = ts;
- flags = flgs;
+
+ if (((start_code == MPEG4_start_code) ||
+ (start_code == MPEG2_start_code)) &&
+ psource &&
+ parsed_length)
+ {
+ OMX_U32 index = *parsed_length;
+ if ((start_code == MPEG4_start_code &&
+ (psource [index] & 0xF0) == 0x20) ||
+ (start_code == MPEG2_start_code &&
+ psource [index] == 0xB3))
+ {
+ if (header_found)
+ {
+ last_byte = psource [index];
+ index++;
+ parse_state = A4;
+ } else
+ header_found = true;
+ }
+ *parsed_length = index;
+ }
+}
+
+void frame_parse::check_skip_frame_boundary(OMX_U32 *partialframe)
+{
+ if ((start_code == MPEG4_start_code ||
+ start_code == MPEG2_start_code) &&
+ partialframe) {
+
+ *partialframe = 1;
+ if (!skip_frame_boundary)
+ *partialframe = 0;
+ skip_frame_boundary = false;
+ }
+}
+
+void frame_parse::update_skip_frame()
+{
+ if (((start_code == MPEG4_start_code) &&
+ ((last_byte & 0xF0) == 0x20)) ||
+ ((start_code == MPEG2_start_code) &&
+ (last_byte == 0xB3))) {
+
+ skip_frame_boundary = true;
+ }
}
diff --git a/mm-video/vidc/vdec/src/h264_utils.cpp b/mm-video/vidc/vdec/src/h264_utils.cpp
index ff9f0804..554aa0b4 100644..100755
--- a/mm-video/vidc/vdec/src/h264_utils.cpp
+++ b/mm-video/vidc/vdec/src/h264_utils.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -49,6 +49,11 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "omx_vdec.h"
#include <string.h>
#include <stdlib.h>
+#include <limits.h>
+#include <sys/time.h>
+#ifdef _ANDROID_
+#include <cutils/properties.h>
+#endif
/* =======================================================================
@@ -66,7 +71,6 @@ and other items needed by this module.
#define MAX_SUPPORTED_LEVEL 32
-
RbspParser::RbspParser (const uint8 *_begin, const uint8 *_end)
: begin (_begin), end(_end), pos (- 1), bit (0),
cursor (0xFFFFFF), advanceNeeded (true)
@@ -98,7 +102,7 @@ void RbspParser::advance ()
* I don't see a problem here
*/
//throw false;
- DEBUG_PRINT_LOW("H264Parser-->NEED TO THROW THE EXCEPTION...\n");
+ ALOGV("H264Parser-->NEED TO THROW THE EXCEPTION...\n");
}
cursor <<= 8;
//cursor |= static_cast<uint32> (*pos);
@@ -253,8 +257,6 @@ boolean H264_Utils::extract_rbsp(OMX_IN OMX_U8 *buffer,
boolean eRet = true;
boolean start_code = (size_of_nal_length_field==0)?true:false;
- DEBUG_PRINT_LOW("extract_rbsp\n");
-
if(start_code) {
// Search start_code_prefix_one_3bytes (0x000001)
coef2 = buffer[pos++];
@@ -262,7 +264,7 @@ boolean H264_Utils::extract_rbsp(OMX_IN OMX_U8 *buffer,
do {
if(pos >= buffer_length)
{
- DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
+ ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
return false;
}
@@ -283,28 +285,29 @@ boolean H264_Utils::extract_rbsp(OMX_IN OMX_U8 *buffer,
}
if (nal_len >= buffer_length)
{
- DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
+ ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
return false;
}
}
if (nal_len > buffer_length)
{
- DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
+ ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
return false;
}
if(pos + 1 > (nal_len + sizeofNalLengthField))
{
- DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
+ ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
return false;
}
if (nal_unit->forbidden_zero_bit = (buffer[pos] & 0x80))
{
- DEBUG_PRINT_ERROR("ERROR: In %s() - line %d", __func__, __LINE__);
+ ALOGE("ERROR: In %s() - line %d", __func__, __LINE__);
}
nal_unit->nal_ref_idc = (buffer[pos] & 0x60) >> 5;
nal_unit->nalu_type = buffer[pos++] & 0x1f;
- DEBUG_PRINT_LOW("\n@#@# Pos = %x NalType = %x buflen = %d",pos-1,nal_unit->nalu_type,buffer_length);
+ ALOGV("\n@#@# Pos = %x NalType = %x buflen = %d",
+ pos-1, nal_unit->nalu_type, buffer_length);
*rbsp_length = 0;
@@ -365,34 +368,37 @@ RETURN VALUE:
SIDE EFFECTS:
None.
===========================================================================*/
-bool H264_Utils::isNewFrame(OMX_IN OMX_U8 *buffer,
- OMX_IN OMX_U32 buffer_length,
+bool H264_Utils::isNewFrame(OMX_BUFFERHEADERTYPE *p_buf_hdr,
OMX_IN OMX_U32 size_of_nal_length_field,
OMX_OUT OMX_BOOL &isNewFrame)
{
NALU nal_unit;
uint16 first_mb_in_slice = 0;
uint32 numBytesInRBSP = 0;
+ OMX_IN OMX_U8 *buffer = p_buf_hdr->pBuffer;
+ OMX_IN OMX_U32 buffer_length = p_buf_hdr->nFilledLen;
bool eRet = true;
- DEBUG_PRINT_LOW("get_h264_nal_type %p nal_length %d nal_length_field %d\n",
- buffer, buffer_length, size_of_nal_length_field);
+ ALOGV("isNewFrame: buffer %p buffer_length %d "
+ "size_of_nal_length_field %d\n", buffer, buffer_length,
+ size_of_nal_length_field);
if ( false == extract_rbsp(buffer, buffer_length, size_of_nal_length_field,
m_rbspBytes, &numBytesInRBSP, &nal_unit) )
{
- DEBUG_PRINT_ERROR("ERROR: In %s() - extract_rbsp() failed", __func__);
+ ALOGE("ERROR: In %s() - extract_rbsp() failed", __func__);
isNewFrame = OMX_FALSE;
eRet = false;
}
else
{
+ nalu_type = nal_unit.nalu_type;
switch (nal_unit.nalu_type)
{
case NALU_TYPE_IDR:
case NALU_TYPE_NON_IDR:
{
- DEBUG_PRINT_LOW("\n Found a AU Boundary %d ",nal_unit.nalu_type);
+ ALOGV("\n AU Boundary with NAL type %d ",nal_unit.nalu_type);
if (m_forceToStichNextNAL)
{
isNewFrame = OMX_FALSE;
@@ -407,7 +413,7 @@ bool H264_Utils::isNewFrame(OMX_IN OMX_U8 *buffer,
/*( ((m_prv_nalu.nalu_type == NALU_TYPE_IDR) && (nal_unit.nalu_type == NALU_TYPE_IDR)) && (slice.idr_pic_id != slice.prv_idr_pic_id) ) || */
( (m_prv_nalu.nalu_type != nal_unit.nalu_type ) && ((m_prv_nalu.nalu_type == NALU_TYPE_IDR) || (nal_unit.nalu_type == NALU_TYPE_IDR)) ) )
{
- //DEBUG_PRINT_LOW("Found a New Frame due to NALU_TYPE_IDR/NALU_TYPE_NON_IDR");
+ //ALOGV("Found a New Frame due to NALU_TYPE_IDR/NALU_TYPE_NON_IDR");
isNewFrame = OMX_TRUE;
}
else
@@ -422,11 +428,8 @@ bool H264_Utils::isNewFrame(OMX_IN OMX_U8 *buffer,
case NALU_TYPE_SPS:
case NALU_TYPE_PPS:
case NALU_TYPE_SEI:
- case NALU_TYPE_UNSPECIFIED:
- case NALU_TYPE_EOSEQ:
- case NALU_TYPE_EOSTREAM:
{
- DEBUG_PRINT_LOW("\n Non AU boundary NAL %d",nal_unit.nalu_type);
+ ALOGV("\n Non-AU boundary with NAL type %d", nal_unit.nalu_type);
if(m_au_data)
{
isNewFrame = OMX_TRUE;
@@ -441,6 +444,9 @@ bool H264_Utils::isNewFrame(OMX_IN OMX_U8 *buffer,
break;
}
case NALU_TYPE_ACCESS_DELIM:
+ case NALU_TYPE_UNSPECIFIED:
+ case NALU_TYPE_EOSEQ:
+ case NALU_TYPE_EOSTREAM:
default:
{
isNewFrame = OMX_FALSE;
@@ -450,6 +456,1237 @@ bool H264_Utils::isNewFrame(OMX_IN OMX_U8 *buffer,
} // end of switch
} // end of if
m_prv_nalu = nal_unit;
- DEBUG_PRINT_LOW("get_h264_nal_type - newFrame value %d\n",isNewFrame);
+ ALOGV("get_h264_nal_type - newFrame value %d\n",isNewFrame);
return eRet;
}
+
+void perf_metrics::start()
+{
+ if (!active)
+ {
+ start_time = get_act_time();
+ active = true;
+ }
+}
+
+void perf_metrics::stop()
+{
+ OMX_U64 stop_time = get_act_time();
+ if (active)
+ {
+ proc_time += (stop_time - start_time);
+ active = false;
+ }
+}
+
+void perf_metrics::end(OMX_U32 units_cntr)
+{
+ stop();
+ ALOGV("--> Processing time : [%.2f] Sec", (float)proc_time / 1e6);
+ if (units_cntr)
+ {
+ ALOGV("--> Avrg proc time : [%.2f] mSec", proc_time / (float)(units_cntr * 1e3));
+ }
+}
+
+void perf_metrics::reset()
+{
+ start_time = 0;
+ proc_time = 0;
+ active = false;
+}
+
+OMX_U64 perf_metrics::get_act_time()
+{
+ struct timeval act_time = {0, 0};
+ gettimeofday(&act_time, NULL);
+ return (act_time.tv_usec + act_time.tv_sec * 1e6);
+}
+
+OMX_U64 perf_metrics::processing_time_us()
+{
+ return proc_time;
+}
+
+h264_stream_parser::h264_stream_parser()
+{
+ reset();
+#ifdef PANSCAN_HDLR
+ panscan_hdl = new panscan_handler();
+ if (!panscan_hdl)
+ {
+ ALOGE("ERROR: Panscan hdl was not allocated!");
+ }
+ else if (!panscan_hdl->initialize(10))
+ {
+ ALOGE("ERROR: Allocating memory for panscan!");
+ delete panscan_hdl;
+ panscan_hdl = NULL;
+ }
+#else
+ memset(&panscan_param, 0, sizeof(panscan_param));
+ panscan_param.rect_id = NO_PAN_SCAN_BIT;
+#endif
+}
+
+h264_stream_parser::~h264_stream_parser()
+{
+#ifdef PANSCAN_HDLR
+ if (panscan_hdl)
+ {
+ delete panscan_hdl;
+ panscan_hdl = NULL;
+ }
+#endif
+}
+
+void h264_stream_parser::reset()
+{
+ curr_32_bit = 0;
+ bits_read = 0;
+ zero_cntr = 0;
+ emulation_code_skip_cntr = 0;
+ emulation_sc_enabled = true;
+ bitstream = NULL;
+ bitstream_bytes = 0;
+ memset(&vui_param, 0, sizeof(vui_param));
+ vui_param.fixed_fps_prev_ts = LLONG_MAX;
+ memset(&sei_buf_period, 0, sizeof(sei_buf_period));
+ memset(&sei_pic_timing, 0, sizeof(sei_pic_timing));
+ memset(&frame_packing_arrangement,0,sizeof(frame_packing_arrangement));
+ frame_packing_arrangement.cancel_flag = 1;
+ mbaff_flag = 0;
+}
+
+void h264_stream_parser::init_bitstream(OMX_U8* data, OMX_U32 size)
+{
+ bitstream = data;
+ bitstream_bytes = size;
+ curr_32_bit = 0;
+ bits_read = 0;
+ zero_cntr = 0;
+ emulation_code_skip_cntr = 0;
+}
+
+void h264_stream_parser::parse_vui(bool vui_in_extradata)
+{
+ OMX_U32 value = 0;
+ ALOGV("parse_vui: IN");
+ if (vui_in_extradata)
+ while (!extract_bits(1) && more_bits()); // Discard VUI enable flag
+ if (!more_bits())
+ return;
+
+ vui_param.aspect_ratio_info_present_flag = extract_bits(1); //aspect_ratio_info_present_flag
+ if (vui_param.aspect_ratio_info_present_flag)
+ {
+ ALOGV("Aspect Ratio Info present!");
+ aspect_ratio_info();
+ }
+
+ if (extract_bits(1)) //overscan_info_present_flag
+ extract_bits(1); //overscan_appropriate_flag
+ if (extract_bits(1)) //video_signal_type_present_flag
+ {
+ extract_bits(3); //video_format
+ extract_bits(1); //video_full_range_flag
+ if (extract_bits(1)) //colour_description_present_flag
+ {
+ extract_bits(8); //colour_primaries
+ extract_bits(8); //transfer_characteristics
+ extract_bits(8); //matrix_coefficients
+ }
+ }
+ if (extract_bits(1)) //chroma_location_info_present_flag
+ {
+ uev(); //chroma_sample_loc_type_top_field
+ uev(); //chroma_sample_loc_type_bottom_field
+ }
+ vui_param.timing_info_present_flag = extract_bits(1);
+ if (vui_param.timing_info_present_flag)
+ {
+ vui_param.num_units_in_tick = extract_bits(32);
+ vui_param.time_scale = extract_bits(32);
+ vui_param.fixed_frame_rate_flag = extract_bits(1);
+ ALOGV("Timing info present in VUI!");
+ ALOGV(" num units in tick : %u", vui_param.num_units_in_tick);
+ ALOGV(" time scale : %u", vui_param.time_scale);
+ ALOGV(" fixed frame rate : %u", vui_param.fixed_frame_rate_flag);
+ }
+ vui_param.nal_hrd_parameters_present_flag = extract_bits(1);
+ if (vui_param.nal_hrd_parameters_present_flag)
+ {
+ ALOGV("nal hrd params present!");
+ hrd_parameters(&vui_param.nal_hrd_parameters);
+ }
+ vui_param.vcl_hrd_parameters_present_flag = extract_bits(1);
+ if (vui_param.vcl_hrd_parameters_present_flag)
+ {
+ ALOGV("vcl hrd params present!");
+ hrd_parameters(&vui_param.vcl_hrd_parameters);
+ }
+ if (vui_param.nal_hrd_parameters_present_flag ||
+ vui_param.vcl_hrd_parameters_present_flag)
+ vui_param.low_delay_hrd_flag = extract_bits(1);
+ vui_param.pic_struct_present_flag = extract_bits(1);
+ ALOGV("pic_struct_present_flag : %u", vui_param.pic_struct_present_flag);
+ if (extract_bits(1)) //bitstream_restriction_flag
+ {
+ extract_bits(1); //motion_vectors_over_pic_boundaries_flag
+ uev(); //max_bytes_per_pic_denom
+ uev(); //max_bits_per_mb_denom
+ uev(); //log2_max_mv_length_vertical
+ uev(); //log2_max_mv_length_horizontal
+ uev(); //num_reorder_frames
+ uev(); //max_dec_frame_buffering
+ }
+ ALOGV("parse_vui: OUT");
+}
+
+void h264_stream_parser::aspect_ratio_info()
+{
+ ALOGV("aspect_ratio_info: IN");
+ OMX_U32 aspect_ratio_idc = 0;
+ OMX_U32 aspect_ratio_x = 0;
+ OMX_U32 aspect_ratio_y = 0;
+ aspect_ratio_idc = extract_bits(8); //aspect_ratio_idc
+ switch (aspect_ratio_idc)
+ {
+ case 1:
+ aspect_ratio_x = 1;
+ aspect_ratio_y = 1;
+ break;
+ case 2:
+ aspect_ratio_x = 12;
+ aspect_ratio_y = 11;
+ break;
+ case 3:
+ aspect_ratio_x = 10;
+ aspect_ratio_y = 11;
+ break;
+ case 4:
+ aspect_ratio_x = 16;
+ aspect_ratio_y = 11;
+ break;
+ case 5:
+ aspect_ratio_x = 40;
+ aspect_ratio_y = 33;
+ break;
+ case 6:
+ aspect_ratio_x = 24;
+ aspect_ratio_y = 11;
+ break;
+ case 7:
+ aspect_ratio_x = 20;
+ aspect_ratio_y = 11;
+ break;
+ case 8:
+ aspect_ratio_x = 32;
+ aspect_ratio_y = 11;
+ break;
+ case 9:
+ aspect_ratio_x = 80;
+ aspect_ratio_y = 33;
+ break;
+ case 10:
+ aspect_ratio_x = 18;
+ aspect_ratio_y = 11;
+ break;
+ case 11:
+ aspect_ratio_x = 15;
+ aspect_ratio_y = 11;
+ break;
+ case 12:
+ aspect_ratio_x = 64;
+ aspect_ratio_y = 33;
+ break;
+ case 13:
+ aspect_ratio_x = 160;
+ aspect_ratio_y = 99;
+ break;
+ case 14:
+ aspect_ratio_x = 4;
+ aspect_ratio_y = 3;
+ break;
+ case 15:
+ aspect_ratio_x = 3;
+ aspect_ratio_y = 2;
+ break;
+ case 16:
+ aspect_ratio_x = 2;
+ aspect_ratio_y = 1;
+ break;
+ case 255:
+ aspect_ratio_x = extract_bits(16); //sar_width
+ aspect_ratio_y = extract_bits(16); //sar_height
+ break;
+ default:
+ ALOGV("-->aspect_ratio_idc: Reserved Value ");
+ break;
+ }
+ ALOGV("-->aspect_ratio_idc : %u", aspect_ratio_idc);
+ ALOGV("-->aspect_ratio_x : %u", aspect_ratio_x);
+ ALOGV("-->aspect_ratio_y : %u", aspect_ratio_y);
+ vui_param.aspect_ratio_info.aspect_ratio_idc = aspect_ratio_idc;
+ vui_param.aspect_ratio_info.aspect_ratio_x = aspect_ratio_x;
+ vui_param.aspect_ratio_info.aspect_ratio_y = aspect_ratio_y;
+ ALOGV("aspect_ratio_info: OUT");
+}
+
+void h264_stream_parser::hrd_parameters(h264_hrd_param *hrd_param)
+{
+ int idx;
+ ALOGV("hrd_parameters: IN");
+ hrd_param->cpb_cnt = uev() + 1;
+ hrd_param->bit_rate_scale = extract_bits(4);
+ hrd_param->cpb_size_scale = extract_bits(4);
+ ALOGV("-->cpb_cnt : %u", hrd_param->cpb_cnt);
+ ALOGV("-->bit_rate_scale : %u", hrd_param->bit_rate_scale);
+ ALOGV("-->cpb_size_scale : %u", hrd_param->cpb_size_scale);
+ if (hrd_param->cpb_cnt > MAX_CPB_COUNT)
+ {
+ ALOGV("ERROR: Invalid hrd_param->cpb_cnt [%u]!", hrd_param->cpb_cnt);
+ return;
+ }
+ for (idx = 0; idx < hrd_param->cpb_cnt && more_bits(); idx++)
+ {
+ hrd_param->bit_rate_value[idx] = uev() + 1;
+ hrd_param->cpb_size_value[idx] = uev() + 1;
+ hrd_param->cbr_flag[idx] = extract_bits(1);
+ ALOGV("-->bit_rate_value [%d] : %u", idx, hrd_param->bit_rate_value[idx]);
+ ALOGV("-->cpb_size_value [%d] : %u", idx, hrd_param->cpb_size_value[idx]);
+ ALOGV("-->cbr_flag [%d] : %u", idx, hrd_param->cbr_flag[idx]);
+ }
+ hrd_param->initial_cpb_removal_delay_length = extract_bits(5) + 1;
+ hrd_param->cpb_removal_delay_length = extract_bits(5) + 1;
+ hrd_param->dpb_output_delay_length = extract_bits(5) + 1;
+ hrd_param->time_offset_length = extract_bits(5);
+ ALOGV("-->initial_cpb_removal_delay_length : %u", hrd_param->initial_cpb_removal_delay_length);
+ ALOGV("-->cpb_removal_delay_length : %u", hrd_param->cpb_removal_delay_length);
+ ALOGV("-->dpb_output_delay_length : %u", hrd_param->dpb_output_delay_length);
+ ALOGV("-->time_offset_length : %u", hrd_param->time_offset_length);
+ ALOGV("hrd_parameters: OUT");
+}
+
+void h264_stream_parser::parse_sei()
+{
+ OMX_U32 value = 0, processed_bytes = 0;
+ OMX_U8 *sei_msg_start = bitstream;
+ OMX_U32 sei_unit_size = bitstream_bytes;
+ ALOGV("@@parse_sei: IN sei_unit_size(%u)", sei_unit_size);
+ while ((processed_bytes + 2) < sei_unit_size && more_bits())
+ {
+ init_bitstream(sei_msg_start + processed_bytes, sei_unit_size - processed_bytes);
+ ALOGV("-->NALU_TYPE_SEI");
+ OMX_U32 payload_type = 0, payload_size = 0, aux = 0;
+ do {
+ value = extract_bits(8);
+ payload_type += value;
+ processed_bytes++;
+ } while (value == 0xFF);
+ ALOGV("-->payload_type : %u", payload_type);
+ do {
+ value = extract_bits(8);
+ payload_size += value;
+ processed_bytes++;
+ } while (value == 0xFF);
+ ALOGV("-->payload_size : %u", payload_size);
+ if (payload_size > 0)
+ {
+ switch (payload_type)
+ {
+ case BUFFERING_PERIOD:
+ sei_buffering_period();
+ break;
+ case PIC_TIMING:
+ sei_picture_timing();
+ break;
+ case PAN_SCAN_RECT:
+ sei_pan_scan();
+ break;
+ case SEI_PAYLOAD_FRAME_PACKING_ARRANGEMENT:
+ parse_frame_pack();
+ break;
+ default:
+ ALOGV("-->SEI payload type [%u] not implemented! size[%u]", payload_type, payload_size);
+ }
+ }
+ processed_bytes += (payload_size + emulation_code_skip_cntr);
+ ALOGV("-->SEI processed_bytes[%u]", processed_bytes);
+ }
+ ALOGV("@@parse_sei: OUT");
+}
+
+void h264_stream_parser::sei_buffering_period()
+{
+ int idx;
+ OMX_U32 value = 0;
+ h264_hrd_param *hrd_param = NULL;
+ ALOGV("@@sei_buffering_period: IN");
+ value = uev(); // seq_parameter_set_id
+ ALOGV("-->seq_parameter_set_id : %u", value);
+ if (value > 31)
+ {
+ ALOGV("ERROR: Invalid seq_parameter_set_id [%u]!", value);
+ return;
+ }
+ sei_buf_period.is_valid = false;
+ if (vui_param.nal_hrd_parameters_present_flag)
+ {
+ hrd_param = &vui_param.nal_hrd_parameters;
+ if (hrd_param->cpb_cnt > MAX_CPB_COUNT)
+ {
+ ALOGV("ERROR: Invalid hrd_param->cpb_cnt [%u]!", hrd_param->cpb_cnt);
+ return;
+ }
+ for (idx = 0; idx < hrd_param->cpb_cnt ; idx++)
+ {
+ sei_buf_period.is_valid = true;
+ sei_buf_period.initial_cpb_removal_delay[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
+ sei_buf_period.initial_cpb_removal_delay_offset[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
+ ALOGV("-->initial_cpb_removal_delay : %u", sei_buf_period.initial_cpb_removal_delay[idx]);
+ ALOGV("-->initial_cpb_removal_delay_offset : %u", sei_buf_period.initial_cpb_removal_delay_offset[idx]);
+ }
+ }
+ if (vui_param.vcl_hrd_parameters_present_flag)
+ {
+ hrd_param = &vui_param.vcl_hrd_parameters;
+ if (hrd_param->cpb_cnt > MAX_CPB_COUNT)
+ {
+ ALOGV("ERROR: Invalid hrd_param->cpb_cnt [%u]!", hrd_param->cpb_cnt);
+ return;
+ }
+ for (idx = 0; idx < hrd_param->cpb_cnt ; idx++)
+ {
+ sei_buf_period.is_valid = true;
+ sei_buf_period.initial_cpb_removal_delay[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
+ sei_buf_period.initial_cpb_removal_delay_offset[idx] = extract_bits(hrd_param->initial_cpb_removal_delay_length);
+ ALOGV("-->initial_cpb_removal_delay : %u", sei_buf_period.initial_cpb_removal_delay[idx]);
+ ALOGV("-->initial_cpb_removal_delay_offset : %u", sei_buf_period.initial_cpb_removal_delay_offset[idx]);
+ }
+ }
+ sei_buf_period.au_cntr = 0;
+ ALOGV("@@sei_buffering_period: OUT");
+}
+
+void h264_stream_parser::sei_picture_timing()
+{
+ ALOGV("@@sei_picture_timing: IN");
+ OMX_U32 time_offset_len = 0, cpb_removal_len = 24, dpb_output_len = 24;
+ OMX_U8 cbr_flag = 0;
+ sei_pic_timing.is_valid = true;
+ if (vui_param.nal_hrd_parameters_present_flag)
+ {
+ cpb_removal_len = vui_param.nal_hrd_parameters.cpb_removal_delay_length;
+ dpb_output_len = vui_param.nal_hrd_parameters.dpb_output_delay_length;
+ time_offset_len = vui_param.nal_hrd_parameters.time_offset_length;
+ cbr_flag = vui_param.nal_hrd_parameters.cbr_flag[0];
+ }
+ else if (vui_param.vcl_hrd_parameters_present_flag)
+ {
+ cpb_removal_len = vui_param.vcl_hrd_parameters.cpb_removal_delay_length;
+ dpb_output_len = vui_param.vcl_hrd_parameters.dpb_output_delay_length;
+ time_offset_len = vui_param.vcl_hrd_parameters.time_offset_length;
+ cbr_flag = vui_param.vcl_hrd_parameters.cbr_flag[0];
+ }
+ sei_pic_timing.cpb_removal_delay = extract_bits(cpb_removal_len);
+ sei_pic_timing.dpb_output_delay = extract_bits(dpb_output_len);
+ ALOGV("-->cpb_removal_len : %u", cpb_removal_len);
+ ALOGV("-->dpb_output_len : %u", dpb_output_len);
+ ALOGV("-->cpb_removal_delay : %u", sei_pic_timing.cpb_removal_delay);
+ ALOGV("-->dpb_output_delay : %u", sei_pic_timing.dpb_output_delay);
+ if (vui_param.pic_struct_present_flag)
+ {
+ sei_pic_timing.pic_struct = extract_bits(4);
+ sei_pic_timing.num_clock_ts = 0;
+ switch (sei_pic_timing.pic_struct)
+ {
+ case 0: case 1: case 2: sei_pic_timing.num_clock_ts = 1; break;
+ case 3: case 4: case 7: sei_pic_timing.num_clock_ts = 2; break;
+ case 5: case 6: case 8: sei_pic_timing.num_clock_ts = 3; break;
+ default:
+ ALOGE("sei_picture_timing: pic_struct invalid!");
+ }
+ ALOGV("-->num_clock_ts : %u", sei_pic_timing.num_clock_ts);
+ for (int i = 0; i < sei_pic_timing.num_clock_ts && more_bits(); i++)
+ {
+ sei_pic_timing.clock_ts_flag = extract_bits(1);
+ if(sei_pic_timing.clock_ts_flag)
+ {
+ ALOGV("-->clock_timestamp present!");
+ sei_pic_timing.ct_type = extract_bits(2);
+ sei_pic_timing.nuit_field_based_flag = extract_bits(1);
+ sei_pic_timing.counting_type = extract_bits(5);
+ sei_pic_timing.full_timestamp_flag = extract_bits(1);
+ sei_pic_timing.discontinuity_flag = extract_bits(1);
+ sei_pic_timing.cnt_dropped_flag = extract_bits(1);
+ sei_pic_timing.n_frames = extract_bits(8);
+ ALOGV("-->f_timestamp_flg : %u", sei_pic_timing.full_timestamp_flag);
+ ALOGV("-->n_frames : %u", sei_pic_timing.n_frames);
+ sei_pic_timing.seconds_value = 0;
+ sei_pic_timing.minutes_value = 0;
+ sei_pic_timing.hours_value = 0;
+ if (sei_pic_timing.full_timestamp_flag)
+ {
+ sei_pic_timing.seconds_value = extract_bits(6);
+ sei_pic_timing.minutes_value = extract_bits(6);
+ sei_pic_timing.hours_value = extract_bits(5);
+ }
+ else if (extract_bits(1))
+ {
+ ALOGV("-->seconds_flag enabled!");
+ sei_pic_timing.seconds_value = extract_bits(6);
+ if (extract_bits(1))
+ {
+ ALOGV("-->minutes_flag enabled!");
+ sei_pic_timing.minutes_value = extract_bits(6);
+ if (extract_bits(1))
+ {
+ ALOGV("-->hours_flag enabled!");
+ sei_pic_timing.hours_value = extract_bits(5);
+ }
+ }
+ }
+ sei_pic_timing.time_offset = 0;
+ if (time_offset_len > 0)
+ sei_pic_timing.time_offset = iv(time_offset_len);
+ ALOGV("-->seconds_value : %u", sei_pic_timing.seconds_value);
+ ALOGV("-->minutes_value : %u", sei_pic_timing.minutes_value);
+ ALOGV("-->hours_value : %u", sei_pic_timing.hours_value);
+ ALOGV("-->time_offset : %d", sei_pic_timing.time_offset);
+ }
+ }
+ }
+ ALOGV("@@sei_picture_timing: OUT");
+}
+
+void h264_stream_parser::sei_pan_scan()
+{
+#ifdef _ANDROID_
+ char property_value[PROPERTY_VALUE_MAX] = {0};
+ OMX_S32 enable_panscan_log = 0;
+ property_get("vidc.dec.debug.panframedata", property_value, "0");
+ enable_panscan_log = atoi(property_value);
+#endif
+#ifdef PANSCAN_HDLR
+ h264_pan_scan *pan_scan_param = panscan_hdl->get_free();
+#else
+ h264_pan_scan *pan_scan_param = &panscan_param;
+#endif
+
+ if (!pan_scan_param)
+ {
+ ALOGE("sei_pan_scan: ERROR: Invalid pointer!");
+ return;
+ }
+
+ pan_scan_param->rect_id = uev();
+ if (pan_scan_param->rect_id > 0xFF)
+ {
+ ALOGE("sei_pan_scan: ERROR: Invalid rect_id[%u]!", pan_scan_param->rect_id);
+ pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
+ return;
+ }
+
+ pan_scan_param->rect_cancel_flag = extract_bits(1);
+
+ if (pan_scan_param->rect_cancel_flag)
+ pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
+ else
+ {
+ pan_scan_param->cnt = uev() + 1;
+ if (pan_scan_param->cnt > MAX_PAN_SCAN_RECT)
+ {
+ ALOGE("sei_pan_scan: ERROR: Invalid num of rect [%u]!", pan_scan_param->cnt);
+ pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
+ return;
+ }
+
+ for (int i = 0; i < pan_scan_param->cnt; i++)
+ {
+ pan_scan_param->rect_left_offset[i] = sev();
+ pan_scan_param->rect_right_offset[i] = sev();
+ pan_scan_param->rect_top_offset[i] = sev();
+ pan_scan_param->rect_bottom_offset[i] = sev();
+
+ }
+ pan_scan_param->rect_repetition_period = uev();
+#ifdef PANSCAN_HDLR
+ if (pan_scan_param->rect_repetition_period > 1)
+ // Repetition period is decreased by 2 each time panscan data is used
+ pan_scan_param->rect_repetition_period *= 2;
+#endif
+#ifdef _ANDROID_
+ if (enable_panscan_log)
+ {
+ print_pan_data(pan_scan_param);
+ }
+#endif
+ }
+}
+
+void h264_stream_parser::print_pan_data(h264_pan_scan *pan_scan_param)
+{
+ ALOGV("@@print_pan_data: IN");
+
+ ALOGV("-->rect_id : %u", pan_scan_param->rect_id);
+ ALOGV("-->rect_cancel_flag : %u", pan_scan_param->rect_cancel_flag);
+
+ ALOGV("-->cnt : %u", pan_scan_param->cnt);
+
+ for (int i = 0; i < pan_scan_param->cnt; i++)
+ {
+ ALOGV("-->rect_left_offset : %d", pan_scan_param->rect_left_offset[i]);
+ ALOGV("-->rect_right_offset : %d", pan_scan_param->rect_right_offset[i]);
+ ALOGV("-->rect_top_offset : %d", pan_scan_param->rect_top_offset[i]);
+ ALOGV("-->rect_bottom_offset : %d", pan_scan_param->rect_bottom_offset[i]);
+ }
+ ALOGV("-->repetition_period : %u", pan_scan_param->rect_repetition_period);
+
+ ALOGV("@@print_pan_data: OUT");
+}
+
+void h264_stream_parser::parse_sps()
+{
+ OMX_U32 value = 0, scaling_matrix_limit;
+ ALOGV("@@parse_sps: IN");
+ value = extract_bits(8); //profile_idc
+ extract_bits(8); //constraint flags and reserved bits
+ extract_bits(8); //level_idc
+ uev(); //sps id
+ if (value == 100 || value == 110 || value == 122 || value == 244 ||
+ value == 44 || value == 83 || value == 86 || value == 118)
+ {
+ if (uev() == 3) //chroma_format_idc
+ {
+ extract_bits(1); //separate_colour_plane_flag
+ scaling_matrix_limit = 12;
+ }
+ else
+ scaling_matrix_limit = 12;
+ uev(); //bit_depth_luma_minus8
+ uev(); //bit_depth_chroma_minus8
+ extract_bits(1); //qpprime_y_zero_transform_bypass_flag
+ if (extract_bits(1)) //seq_scaling_matrix_present_flag
+ for (int i = 0; i < scaling_matrix_limit && more_bits(); i++)
+ {
+ if (extract_bits(1)) ////seq_scaling_list_present_flag[ i ]
+ if (i < 6)
+ scaling_list(16);
+ else
+ scaling_list(64);
+ }
+ }
+ uev(); //log2_max_frame_num_minus4
+ value = uev(); //pic_order_cnt_type
+ if (value == 0)
+ uev(); //log2_max_pic_order_cnt_lsb_minus4
+ else if (value == 1)
+ {
+ extract_bits(1); //delta_pic_order_always_zero_flag
+ sev(); //offset_for_non_ref_pic
+ sev(); //offset_for_top_to_bottom_field
+ value = uev(); // num_ref_frames_in_pic_order_cnt_cycle
+ for (int i = 0; i < value; i++)
+ sev(); //offset_for_ref_frame[ i ]
+ }
+ uev(); //max_num_ref_frames
+ extract_bits(1); //gaps_in_frame_num_value_allowed_flag
+ value = uev(); //pic_width_in_mbs_minus1
+ value = uev(); //pic_height_in_map_units_minus1
+ if (!extract_bits(1)) //frame_mbs_only_flag
+ mbaff_flag = extract_bits(1); //mb_adaptive_frame_field_flag
+ extract_bits(1); //direct_8x8_inference_flag
+ if (extract_bits(1)) //frame_cropping_flag
+ {
+ uev(); //frame_crop_left_offset
+ uev(); //frame_crop_right_offset
+ uev(); //frame_crop_top_offset
+ uev(); //frame_crop_bottom_offset
+ }
+ if (extract_bits(1)) //vui_parameters_present_flag
+ parse_vui(false);
+ ALOGV("@@parse_sps: OUT");
+}
+
+void h264_stream_parser::scaling_list(OMX_U32 size_of_scaling_list)
+{
+ OMX_S32 last_scale = 8, next_scale = 8, delta_scale;
+ for (int j = 0; j < size_of_scaling_list; j++)
+ {
+ if (next_scale != 0)
+ {
+ delta_scale = sev();
+ next_scale = (last_scale + delta_scale + 256) % 256;
+ }
+ last_scale = (next_scale == 0)? last_scale : next_scale;
+ }
+}
+
+OMX_U32 h264_stream_parser::extract_bits(OMX_U32 n)
+{
+ OMX_U32 value = 0;
+ if (n > 32)
+ {
+ ALOGE("ERROR: extract_bits limit to 32 bits!");
+ return value;
+ }
+ value = curr_32_bit >> (32 - n);
+ if (bits_read < n)
+ {
+ n -= bits_read;
+ read_word();
+ value |= (curr_32_bit >> (32 - n));
+ if (bits_read < n)
+ {
+ ALOGV("ERROR: extract_bits underflow!");
+ value >>= (n - bits_read);
+ n = bits_read;
+ }
+ }
+ bits_read -= n;
+ curr_32_bit <<= n;
+ return value;
+}
+
+void h264_stream_parser::read_word()
+{
+ curr_32_bit = 0;
+ bits_read = 0;
+ while (bitstream_bytes && bits_read < 32)
+ {
+ if (*bitstream == EMULATION_PREVENTION_THREE_BYTE &&
+ zero_cntr >= 2 && emulation_sc_enabled)
+ {
+ ALOGV("EMULATION_PREVENTION_THREE_BYTE: Skip 0x03 byte aligned!");
+ emulation_code_skip_cntr++;
+ }
+ else
+ {
+ curr_32_bit <<= 8;
+ curr_32_bit |= *bitstream;
+ bits_read += 8;
+ }
+ if (*bitstream == 0)
+ zero_cntr++;
+ else
+ zero_cntr = 0;
+ bitstream++;
+ bitstream_bytes--;
+ }
+ curr_32_bit <<= (32 - bits_read);
+}
+
+OMX_U32 h264_stream_parser::uev()
+{
+ OMX_U32 lead_zero_bits = 0, code_num = 0;
+ while(!extract_bits(1) && more_bits())
+ lead_zero_bits++;
+ code_num = lead_zero_bits == 0 ? 0 :
+ (1 << lead_zero_bits) - 1 + extract_bits(lead_zero_bits);
+ return code_num;
+}
+
+bool h264_stream_parser::more_bits()
+{
+ return (bitstream_bytes > 0 || bits_read > 0);
+}
+
+OMX_S32 h264_stream_parser::sev()
+{
+ OMX_U32 code_num = uev();
+ OMX_S32 ret;
+ ret = (code_num + 1) >> 1;
+ return ((code_num & 1) ? ret : -ret);
+}
+
+OMX_S32 h264_stream_parser::iv(OMX_U32 n_bits)
+{
+ OMX_U32 code_num = extract_bits(n_bits);
+ OMX_S32 ret = (code_num >> (n_bits - 1))? (-1)*(~(code_num & ~(0x1 << (n_bits - 1))) + 1) : code_num;
+ return ret;
+}
+
+OMX_U32 h264_stream_parser::get_nal_unit_type(OMX_U32 *nal_unit_type)
+{
+ OMX_U32 value = 0, consumed_bytes = 3;
+ *nal_unit_type = NALU_TYPE_UNSPECIFIED;
+ ALOGV("-->get_nal_unit_type: IN");
+ value = extract_bits(24);
+ while (value != 0x00000001 && more_bits())
+ {
+ value <<= 8;
+ value |= extract_bits(8);
+ consumed_bytes++;
+ }
+ if (value != 0x00000001)
+ {
+ ALOGE("ERROR in get_nal_unit_type: Start code not found!");
+ }
+ else
+ {
+ if (extract_bits(1)) // forbidden_zero_bit
+ {
+ ALOGE("WARNING: forbidden_zero_bit should be zero!");
+ }
+ value = extract_bits(2);
+ ALOGV("-->nal_ref_idc : %x", value);
+ *nal_unit_type = extract_bits(5);
+ ALOGV("-->nal_unit_type : %x", *nal_unit_type);
+ consumed_bytes++;
+ if (consumed_bytes > 5)
+ {
+ ALOGE("-->WARNING: Startcode was found after the first 4 bytes!");
+ }
+ }
+ ALOGV("-->get_nal_unit_type: OUT");
+ return consumed_bytes;
+}
+
+OMX_S64 h264_stream_parser::calculate_buf_period_ts(OMX_S64 timestamp)
+{
+ OMX_S64 clock_ts = timestamp;
+ ALOGV("calculate_ts(): IN");
+ if (sei_buf_period.au_cntr == 0)
+ clock_ts = sei_buf_period.reference_ts = timestamp;
+ else if (sei_pic_timing.is_valid && VALID_TS(sei_buf_period.reference_ts))
+ {
+ clock_ts = sei_buf_period.reference_ts + sei_pic_timing.cpb_removal_delay *
+ 1e6 * vui_param.num_units_in_tick / vui_param.time_scale;
+ }
+ sei_buf_period.au_cntr++;
+ ALOGV("calculate_ts(): OUT");
+ return clock_ts;
+}
+
+OMX_S64 h264_stream_parser::calculate_fixed_fps_ts(OMX_S64 timestamp, OMX_U32 DeltaTfiDivisor)
+{
+ if (VALID_TS(timestamp))
+ vui_param.fixed_fps_prev_ts = timestamp;
+ else if (VALID_TS(vui_param.fixed_fps_prev_ts))
+ vui_param.fixed_fps_prev_ts += DeltaTfiDivisor * 1e6 *
+ vui_param.num_units_in_tick / vui_param.time_scale;
+ return vui_param.fixed_fps_prev_ts;
+}
+
+void h264_stream_parser::parse_frame_pack()
+{
+#ifdef _ANDROID_
+ char property_value[PROPERTY_VALUE_MAX] = {0};
+ OMX_S32 enable_framepack_log = 0;
+
+ property_get("vidc.dec.debug.panframedata", property_value, "0");
+ enable_framepack_log = atoi(property_value);
+#endif
+ ALOGV("\n%s:%d parse_frame_pack", __func__, __LINE__);
+
+ frame_packing_arrangement.id = uev();
+
+ frame_packing_arrangement.cancel_flag = extract_bits(1);
+ if(!frame_packing_arrangement.cancel_flag) {
+ frame_packing_arrangement.type = extract_bits(7);
+ frame_packing_arrangement.quincunx_sampling_flag = extract_bits(1);
+ frame_packing_arrangement.content_interpretation_type = extract_bits(6);
+ frame_packing_arrangement.spatial_flipping_flag = extract_bits(1);
+ frame_packing_arrangement.frame0_flipped_flag = extract_bits(1);
+ frame_packing_arrangement.field_views_flag = extract_bits(1);
+ frame_packing_arrangement.current_frame_is_frame0_flag = extract_bits(1);
+ frame_packing_arrangement.frame0_self_contained_flag = extract_bits(1);
+ frame_packing_arrangement.frame1_self_contained_flag = extract_bits(1);
+
+ if(!frame_packing_arrangement.quincunx_sampling_flag &&
+ frame_packing_arrangement.type != 5) {
+ frame_packing_arrangement.frame0_grid_position_x = extract_bits(4);
+ frame_packing_arrangement.frame0_grid_position_y = extract_bits(4);
+ frame_packing_arrangement.frame1_grid_position_x = extract_bits(4);
+ frame_packing_arrangement.frame1_grid_position_y = extract_bits(4);
+ }
+ frame_packing_arrangement.reserved_byte = extract_bits(8);
+ frame_packing_arrangement.repetition_period = uev();
+ }
+ frame_packing_arrangement.extension_flag = extract_bits(1);
+
+#ifdef _ANDROID_
+ if (enable_framepack_log)
+ {
+ print_frame_pack();
+ }
+#endif
+}
+
+void h264_stream_parser::print_frame_pack()
+{
+ ALOGV("\n ## frame_packing_arrangement.id = %u", frame_packing_arrangement.id);
+ ALOGV("\n ## frame_packing_arrangement.cancel_flag = %u",
+ frame_packing_arrangement.cancel_flag);
+ if(!frame_packing_arrangement.cancel_flag)
+ {
+ ALOGV("\n ## frame_packing_arrangement.type = %u",
+ frame_packing_arrangement.type);
+ ALOGV("\n ## frame_packing_arrangement.quincunx_sampling_flag = %u",
+ frame_packing_arrangement.quincunx_sampling_flag);
+ ALOGV("\n ## frame_packing_arrangement.content_interpretation_type = %u",
+ frame_packing_arrangement.content_interpretation_type);
+ ALOGV("\n ## frame_packing_arrangement.spatial_flipping_flag = %u",
+ frame_packing_arrangement.spatial_flipping_flag);
+ ALOGV("\n ## frame_packing_arrangement.frame0_flipped_flag = %u",
+ frame_packing_arrangement.frame0_flipped_flag);
+ ALOGV("\n ## frame_packing_arrangement.field_views_flag = %u",
+ frame_packing_arrangement.field_views_flag);
+ ALOGV("\n ## frame_packing_arrangement.current_frame_is_frame0_flag = %u",
+ frame_packing_arrangement.current_frame_is_frame0_flag);
+ ALOGV("\n ## frame_packing_arrangement.frame0_self_contained_flag = %u",
+ frame_packing_arrangement.frame0_self_contained_flag);
+ ALOGV("\n ## frame_packing_arrangement.frame1_self_contained_flag = %u",
+ frame_packing_arrangement.frame1_self_contained_flag);
+ ALOGV("\n ## frame_packing_arrangement.reserved_byte = %u",
+ frame_packing_arrangement.reserved_byte);
+ ALOGV("\n ## frame_packing_arrangement.repetition_period = %u",
+ frame_packing_arrangement.repetition_period);
+ ALOGV("\n ## frame_packing_arrangement.extension_flag = %u",
+ frame_packing_arrangement.extension_flag);
+ }
+}
+/* API'S EXPOSED TO OMX COMPONENT */
+
+void h264_stream_parser::get_frame_pack_data(
+ OMX_QCOM_FRAME_PACK_ARRANGEMENT *frame_pack)
+{
+ ALOGV("\n%s:%d get frame data", __func__, __LINE__);
+ memcpy(&frame_pack->id,&frame_packing_arrangement.id,
+ FRAME_PACK_SIZE*sizeof(OMX_U32));
+ return;
+}
+
+
+bool h264_stream_parser::is_mbaff()
+{
+ ALOGV("\n%s:%d MBAFF flag=%d", __func__, __LINE__,mbaff_flag);
+ return mbaff_flag;
+}
+
+void h264_stream_parser::get_frame_rate(OMX_U32 *frame_rate)
+{
+ if (vui_param.num_units_in_tick != 0)
+ *frame_rate = vui_param.time_scale / (2 * vui_param.num_units_in_tick);
+}
+
+void h264_stream_parser::parse_nal(OMX_U8* data_ptr, OMX_U32 data_len, OMX_U32 nal_type, bool enable_emu_sc)
+{
+ OMX_U32 nal_unit_type = NALU_TYPE_UNSPECIFIED, cons_bytes = 0;
+ ALOGV("parse_nal(): IN nal_type(%lu)", nal_type);
+ if (!data_len)
+ return;
+ init_bitstream(data_ptr, data_len);
+ emulation_sc_enabled = enable_emu_sc;
+ if (nal_type != NALU_TYPE_VUI)
+ {
+ cons_bytes = get_nal_unit_type(&nal_unit_type);
+ if (nal_type != nal_unit_type && nal_type != NALU_TYPE_UNSPECIFIED)
+ {
+ ALOGV("Unexpected nal_type(%x) expected(%x)", nal_unit_type, nal_type);
+ return;
+ }
+ }
+ switch (nal_type)
+ {
+ case NALU_TYPE_SPS:
+ if (more_bits())
+ parse_sps();
+#ifdef PANSCAN_HDLR
+ panscan_hdl->get_free();
+#endif
+ break;
+ case NALU_TYPE_SEI:
+ init_bitstream(data_ptr + cons_bytes, data_len - cons_bytes);
+ parse_sei();
+ break;
+ case NALU_TYPE_VUI:
+ parse_vui(true);
+ break;
+ default:
+ ALOGV("nal_unit_type received : %lu", nal_type);
+ }
+ ALOGV("parse_nal(): OUT");
+}
+
+#ifdef PANSCAN_HDLR
+void h264_stream_parser::update_panscan_data(OMX_S64 timestamp)
+{
+ panscan_hdl->update_last(timestamp);
+}
+#endif
+
+void h264_stream_parser::fill_aspect_ratio_info(OMX_QCOM_ASPECT_RATIO *dest_aspect_ratio)
+{
+ if(dest_aspect_ratio && vui_param.aspect_ratio_info_present_flag)
+ {
+ dest_aspect_ratio->aspectRatioX = vui_param.aspect_ratio_info.aspect_ratio_x;
+ dest_aspect_ratio->aspectRatioY = vui_param.aspect_ratio_info.aspect_ratio_y;
+ }
+}
+
+void h264_stream_parser::fill_pan_scan_data(OMX_QCOM_PANSCAN *dest_pan_scan, OMX_S64 timestamp)
+{
+#ifdef PANSCAN_HDLR
+ h264_pan_scan *pan_scan_param = panscan_hdl->get_populated(timestamp);
+#else
+ h264_pan_scan *pan_scan_param = &panscan_param;
+#endif
+ if (pan_scan_param)
+ if (!(pan_scan_param->rect_id & NO_PAN_SCAN_BIT))
+ {
+ PRINT_PANSCAN_PARAM(*pan_scan_param);
+ dest_pan_scan->numWindows = pan_scan_param->cnt;
+ for (int i = 0; i < dest_pan_scan->numWindows; i++)
+ {
+ dest_pan_scan->window[i].x = pan_scan_param->rect_left_offset[i];
+ dest_pan_scan->window[i].y = pan_scan_param->rect_top_offset[i];
+ dest_pan_scan->window[i].dx = pan_scan_param->rect_right_offset[i];
+ dest_pan_scan->window[i].dy = pan_scan_param->rect_bottom_offset[i];
+ }
+#ifndef PANSCAN_HDLR
+ if (pan_scan_param->rect_repetition_period == 0)
+ pan_scan_param->rect_id = NO_PAN_SCAN_BIT;
+ else if (pan_scan_param->rect_repetition_period > 1)
+ pan_scan_param->rect_repetition_period =
+ (pan_scan_param->rect_repetition_period == 2)? 0 :
+ (pan_scan_param->rect_repetition_period - 1);
+#endif
+ }
+ else
+ pan_scan_param->rect_repetition_period = 0;
+}
+
+OMX_S64 h264_stream_parser::process_ts_with_sei_vui(OMX_S64 timestamp)
+{
+ bool clock_ts_flag = false;
+ OMX_S64 clock_ts = timestamp;
+ OMX_U32 deltaTfiDivisor = 2;
+ if (vui_param.timing_info_present_flag)
+ {
+ if (vui_param.pic_struct_present_flag)
+ {
+ if(sei_pic_timing.clock_ts_flag)
+ {
+ clock_ts = ((sei_pic_timing.hours_value * 60 + sei_pic_timing.minutes_value) * 60 + sei_pic_timing.seconds_value) * 1e6 +
+ (sei_pic_timing.n_frames * (vui_param.num_units_in_tick * (1 + sei_pic_timing.nuit_field_based_flag)) + sei_pic_timing.time_offset) *
+ 1e6 / vui_param.time_scale;
+ ALOGV("-->CLOCK TIMESTAMP : %lld", clock_ts);
+ clock_ts_flag = true;
+ }
+ if (vui_param.fixed_frame_rate_flag)
+ {
+ switch (sei_pic_timing.pic_struct)
+ {
+ case 1: case 2: deltaTfiDivisor = 1; break;
+ case 0: case 3: case 4: deltaTfiDivisor = 2; break;
+ case 5: case 6: deltaTfiDivisor = 3; break;
+ case 7: deltaTfiDivisor = 4; break;
+ case 8: deltaTfiDivisor = 6; break;
+ default:
+ ALOGE("process_ts_with_sei_vui: pic_struct invalid!");
+ }
+ }
+ }
+ if (!clock_ts_flag)
+ {
+ if (vui_param.fixed_frame_rate_flag)
+ clock_ts = calculate_fixed_fps_ts(timestamp, deltaTfiDivisor);
+ else if (sei_buf_period.is_valid)
+ clock_ts = calculate_buf_period_ts(timestamp);
+ }
+ }
+ else
+ {
+ ALOGV("NO TIMING information present in VUI!");
+ }
+ sei_pic_timing.is_valid = false; // SEI data is valid only for current frame
+ return clock_ts;
+}
+
+#ifdef PANSCAN_HDLR
+
+panscan_handler::panscan_handler() : panscan_data(NULL) {}
+
+panscan_handler::~panscan_handler()
+{
+ if (panscan_data)
+ {
+ free(panscan_data);
+ panscan_data = NULL;
+ }
+}
+
+bool panscan_handler::initialize(int num_data)
+{
+ bool ret = false;
+ if (!panscan_data)
+ {
+ panscan_data = (PANSCAN_NODE *) malloc (sizeof(PANSCAN_NODE) * num_data);
+ if (panscan_data)
+ {
+ panscan_free.add_multiple(panscan_data, num_data);
+ ret = true;
+ }
+ }
+ else
+ {
+ ALOGE("ERROR: Old panscan memory must be freed to allocate new");
+ }
+ return ret;
+}
+
+h264_pan_scan *panscan_handler::get_free()
+{
+ h264_pan_scan *data = NULL;
+ PANSCAN_NODE *panscan_node = panscan_used.watch_last();
+ panscan_node = (!panscan_node || VALID_TS(panscan_node->start_ts))?
+ panscan_free.remove_first() :
+ panscan_used.remove_last();
+ if (panscan_node)
+ {
+ panscan_node->start_ts = LLONG_MAX;
+ panscan_node->end_ts = LLONG_MAX;
+ panscan_node->pan_scan_param.rect_id = NO_PAN_SCAN_BIT;
+ panscan_node->active = false;
+ panscan_used.add_last(panscan_node);
+ data = &panscan_node->pan_scan_param;
+ }
+ return data;
+}
+
+h264_pan_scan *panscan_handler::get_populated(OMX_S64 frame_ts)
+{
+ h264_pan_scan *data = NULL;
+ PANSCAN_NODE *panscan_node = panscan_used.watch_first();
+ while (panscan_node && !data)
+ {
+ if (VALID_TS(panscan_node->start_ts))
+ {
+ if (panscan_node->active && frame_ts < panscan_node->start_ts)
+ panscan_node->start_ts = frame_ts;
+ if (frame_ts >= panscan_node->start_ts)
+ if (frame_ts < panscan_node->end_ts)
+ {
+ data = &panscan_node->pan_scan_param;
+ panscan_node->active = true;
+ }
+ else
+ {
+ panscan_free.add_last(panscan_used.remove_first());
+ panscan_node = panscan_used.watch_first();
+ }
+ else
+ // Finish search if current timestamp has not reached
+ // start timestamp of first panscan data.
+ panscan_node = NULL;
+ }
+ else
+ {
+ // Only one panscan data is stored for clips
+ // with invalid timestamps in every frame
+ data = &panscan_node->pan_scan_param;
+ panscan_node->active = true;
+ }
+ }
+ if (data)
+ if (data->rect_repetition_period == 0)
+ panscan_free.add_last(panscan_used.remove_first());
+ else if (data->rect_repetition_period > 1)
+ data->rect_repetition_period -= 2;
+ PRINT_PANSCAN_DATA(panscan_node);
+ return data;
+}
+
+void panscan_handler::update_last(OMX_S64 frame_ts)
+{
+ PANSCAN_NODE *panscan_node = panscan_used.watch_last();
+ if (panscan_node && !VALID_TS(panscan_node->start_ts))
+ {
+ panscan_node->start_ts = frame_ts;
+ PRINT_PANSCAN_DATA(panscan_node);
+ if (panscan_node->prev)
+ {
+ if (frame_ts < panscan_node->prev->end_ts)
+ panscan_node->prev->end_ts = frame_ts;
+ else if (!VALID_TS(frame_ts))
+ panscan_node->prev->pan_scan_param.rect_repetition_period = 0;
+ PRINT_PANSCAN_DATA(panscan_node->prev);
+ }
+ }
+}
+
+template <class NODE_STRUCT>
+void omx_dl_list<NODE_STRUCT>::add_multiple(NODE_STRUCT *data_arr, int data_num)
+{
+ for (int idx = 0; idx < data_num; idx++)
+ add_last(&data_arr[idx]);
+}
+
+template <class NODE_STRUCT>
+NODE_STRUCT *omx_dl_list<NODE_STRUCT>::remove_first()
+{
+ NODE_STRUCT *data = head;
+ if (head)
+ {
+ if (head->next)
+ {
+ head = head->next;
+ head->prev = NULL;
+ }
+ else
+ head = tail = NULL;
+ data->next = data->prev = NULL;
+ }
+ return data;
+}
+
+template <class NODE_STRUCT>
+NODE_STRUCT *omx_dl_list<NODE_STRUCT>::remove_last()
+{
+ NODE_STRUCT *data = tail;
+ if (tail)
+ {
+ if (tail->prev)
+ {
+ tail = tail->prev;
+ tail->next = NULL;
+ }
+ else
+ head = tail = NULL;
+ data->next = data->prev = NULL;
+ }
+ return data;
+}
+
+template <class NODE_STRUCT>
+void omx_dl_list<NODE_STRUCT>::add_last(NODE_STRUCT* data_ptr)
+{
+ if (data_ptr)
+ {
+ data_ptr->next = NULL;
+ data_ptr->prev = tail;
+ if (tail)
+ {
+ tail->next = data_ptr;
+ tail = data_ptr;
+ }
+ else
+ head = tail = data_ptr;
+ }
+}
+
+template <class NODE_STRUCT>
+NODE_STRUCT* omx_dl_list<NODE_STRUCT>::watch_first()
+{
+ return head;
+}
+
+template <class NODE_STRUCT>
+NODE_STRUCT* omx_dl_list<NODE_STRUCT>::watch_last()
+{
+ return tail;
+}
+
+#endif
diff --git a/mm-video/vidc/vdec/src/message_queue.c b/mm-video/vidc/vdec/src/message_queue.c
index 50b6ada0..8cfa9fe4 100644..100755
--- a/mm-video/vidc/vdec/src/message_queue.c
+++ b/mm-video/vidc/vdec/src/message_queue.c
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -117,6 +117,8 @@ int queue_post_cmdq ( void* queuecontext,
if ((ptr_q->write_comq + 1) % ptr_q->commandq_size == ptr_q->read_comq)
{
printf("\n QUEUE is FULL");
+ /* Unlock the mutex to release the critical section */
+ pthread_mutex_unlock(&ptr_q->mutex);
return 0;
}
else
@@ -154,6 +156,8 @@ int queue_post_dataq ( void *queuecontext,
if ((ptr_q->write_dataq + 1) % ptr_q->dataq_size == ptr_q->read_dataq)
{
printf("\n QUEUE is FULL");
+ /* Unlock the mutex to release the critical section */
+ pthread_mutex_unlock(&ptr_q->mutex);
return 0;
}
else
diff --git a/mm-video/vidc/vdec/src/mp4_utils.cpp b/mm-video/vidc/vdec/src/mp4_utils.cpp
new file mode 100755
index 00000000..54666e60
--- /dev/null
+++ b/mm-video/vidc/vdec/src/mp4_utils.cpp
@@ -0,0 +1,331 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include "mp4_utils.h"
+#include "omx_vdec.h"
+# include <stdio.h>
+
+MP4_Utils::MP4_Utils()
+{
+ m_SrcWidth = 0;
+ m_SrcHeight = 0;
+ vop_time_resolution = 0;
+ vop_time_found = false;
+
+}
+MP4_Utils::~MP4_Utils()
+{
+}
+
+uint32 MP4_Utils::read_bit_field(posInfoType * posPtr, uint32 size) {
+ uint8 *bits = &posPtr->bytePtr[0];
+ uint32 bitBuf =
+ (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3];
+
+ uint32 value = (bitBuf >> (32 - posPtr->bitPos - size)) & MASK(size);
+
+ /* Update the offset in preparation for next field */
+ posPtr->bitPos += size;
+
+ while (posPtr->bitPos >= 8) {
+ posPtr->bitPos -= 8;
+ posPtr->bytePtr++;
+ }
+ return value;
+}
+static uint8 *find_code
+ (uint8 * bytePtr, uint32 size, uint32 codeMask, uint32 referenceCode) {
+ uint32 code = 0xFFFFFFFF;
+ for (uint32 i = 0; i < size; i++) {
+ code <<= 8;
+ code |= *bytePtr++;
+
+ if ((code & codeMask) == referenceCode) {
+ return bytePtr;
+ }
+ }
+
+ DEBUG_PRINT_LOW("Unable to find code 0x%x\n", referenceCode);
+ return NULL;
+}
+bool MP4_Utils::parseHeader(mp4StreamType * psBits) {
+ uint32 profile_and_level_indication = 0;
+ uint8 VerID = 1; /* default value */
+ long hxw = 0;
+
+ m_posInfo.bitPos = 0;
+ m_posInfo.bytePtr = psBits->data;
+ m_dataBeginPtr = psBits->data;
+
+ m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4,
+ MASK(32),VOP_START_CODE);
+ if(m_posInfo.bytePtr) {
+ return false;
+ }
+
+ m_posInfo.bitPos = 0;
+ m_posInfo.bytePtr = psBits->data;
+ m_dataBeginPtr = psBits->data;
+ m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,4,
+ MASK(32),GOV_START_CODE);
+ if(m_posInfo.bytePtr) {
+ return false;
+ }
+
+ m_posInfo.bitPos = 0;
+ m_posInfo.bytePtr = psBits->data;
+ m_dataBeginPtr = psBits->data;
+ /* parsing Visual Object Seqence(VOS) header */
+ m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,
+ psBits->numBytes,
+ MASK(32),
+ VISUAL_OBJECT_SEQUENCE_START_CODE);
+ if ( m_posInfo.bytePtr == NULL ){
+ m_posInfo.bitPos = 0;
+ m_posInfo.bytePtr = psBits->data;
+ }
+ else {
+ uint32 profile_and_level_indication = read_bit_field (&m_posInfo, 8);
+ }
+ /* parsing Visual Object(VO) header*/
+ /* note: for now, we skip over the user_data */
+ m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes,
+ MASK(32),VISUAL_OBJECT_START_CODE);
+ if(m_posInfo.bytePtr == NULL) {
+ m_posInfo.bitPos = 0;
+ m_posInfo.bytePtr = psBits->data;
+ }
+ else {
+ uint32 is_visual_object_identifier = read_bit_field (&m_posInfo, 1);
+ if ( is_visual_object_identifier ) {
+ /* visual_object_verid*/
+ read_bit_field (&m_posInfo, 4);
+ /* visual_object_priority*/
+ read_bit_field (&m_posInfo, 3);
+ }
+
+ /* visual_object_type*/
+ uint32 visual_object_type = read_bit_field (&m_posInfo, 4);
+ if ( visual_object_type != VISUAL_OBJECT_TYPE_VIDEO_ID ) {
+ return false;
+ }
+ /* skipping video_signal_type params*/
+ /*parsing Video Object header*/
+ m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,psBits->numBytes,
+ VIDEO_OBJECT_START_CODE_MASK,VIDEO_OBJECT_START_CODE);
+ if ( m_posInfo.bytePtr == NULL ) {
+ return false;
+ }
+ }
+
+ /* parsing Video Object Layer(VOL) header */
+ m_posInfo.bitPos = 0;
+ m_posInfo.bytePtr = find_code(m_posInfo.bytePtr,
+ psBits->numBytes,
+ VIDEO_OBJECT_LAYER_START_CODE_MASK,
+ VIDEO_OBJECT_LAYER_START_CODE);
+ if ( m_posInfo.bytePtr == NULL ) {
+ m_posInfo.bitPos = 0;
+ m_posInfo.bytePtr = psBits->data;
+ }
+
+ // 1 -> random accessible VOL
+ read_bit_field(&m_posInfo, 1);
+
+ uint32 video_object_type_indication = read_bit_field (&m_posInfo, 8);
+ if ( (video_object_type_indication != SIMPLE_OBJECT_TYPE) &&
+ (video_object_type_indication != SIMPLE_SCALABLE_OBJECT_TYPE) &&
+ (video_object_type_indication != CORE_OBJECT_TYPE) &&
+ (video_object_type_indication != ADVANCED_SIMPLE) &&
+ (video_object_type_indication != RESERVED_OBJECT_TYPE) &&
+ (video_object_type_indication != MAIN_OBJECT_TYPE)) {
+ return false;
+ }
+ /* is_object_layer_identifier*/
+ uint32 is_object_layer_identifier = read_bit_field (&m_posInfo, 1);
+ if (is_object_layer_identifier) {
+ uint32 video_object_layer_verid = read_bit_field (&m_posInfo, 4);
+ uint32 video_object_layer_priority = read_bit_field (&m_posInfo, 3);
+ VerID = (unsigned char)video_object_layer_verid;
+ }
+
+ /* aspect_ratio_info*/
+ uint32 aspect_ratio_info = read_bit_field (&m_posInfo, 4);
+ if ( aspect_ratio_info == EXTENDED_PAR ) {
+ /* par_width*/
+ read_bit_field (&m_posInfo, 8);
+ /* par_height*/
+ read_bit_field (&m_posInfo, 8);
+ }
+ /* vol_control_parameters */
+ uint32 vol_control_parameters = read_bit_field (&m_posInfo, 1);
+ if ( vol_control_parameters ) {
+ /* chroma_format*/
+ uint32 chroma_format = read_bit_field (&m_posInfo, 2);
+ if ( chroma_format != 1 ) {
+ return false;
+ }
+ /* low_delay*/
+ uint32 low_delay = read_bit_field (&m_posInfo, 1);
+ /* vbv_parameters (annex D)*/
+ uint32 vbv_parameters = read_bit_field (&m_posInfo, 1);
+ if ( vbv_parameters ) {
+ /* first_half_bitrate*/
+ uint32 first_half_bitrate = read_bit_field (&m_posInfo, 15);
+ uint32 marker_bit = read_bit_field (&m_posInfo, 1);
+ if ( marker_bit != 1) {
+ return false;
+ }
+ /* latter_half_bitrate*/
+ uint32 latter_half_bitrate = read_bit_field (&m_posInfo, 15);
+ marker_bit = read_bit_field (&m_posInfo, 1);
+ if ( marker_bit != 1) {
+ return false;
+ }
+ uint32 VBVPeakBitRate = (first_half_bitrate << 15) + latter_half_bitrate;
+ /* first_half_vbv_buffer_size*/
+ uint32 first_half_vbv_buffer_size = read_bit_field (&m_posInfo, 15);
+ marker_bit = read_bit_field (&m_posInfo, 1);
+ if ( marker_bit != 1) {
+ return false;
+ }
+ /* latter_half_vbv_buffer_size*/
+ uint32 latter_half_vbv_buffer_size = read_bit_field (&m_posInfo, 3);
+ uint32 VBVBufferSize = (first_half_vbv_buffer_size << 3) + latter_half_vbv_buffer_size;
+ /* first_half_vbv_occupancy*/
+ uint32 first_half_vbv_occupancy = read_bit_field (&m_posInfo, 11);
+ marker_bit = read_bit_field (&m_posInfo, 1);
+ if ( marker_bit != 1) {
+ return false;
+ }
+ /* latter_half_vbv_occupancy*/
+ uint32 latter_half_vbv_occupancy = read_bit_field (&m_posInfo, 15);
+ marker_bit = read_bit_field (&m_posInfo, 1);
+ if ( marker_bit != 1) {
+ return false;
+ }
+ }/* vbv_parameters*/
+ }/*vol_control_parameters*/
+
+ /* video_object_layer_shape*/
+ uint32 video_object_layer_shape = read_bit_field (&m_posInfo, 2);
+ uint8 VOLShape = (unsigned char)video_object_layer_shape;
+ if ( VOLShape != MPEG4_SHAPE_RECTANGULAR ) {
+ return false;
+ }
+ /* marker_bit*/
+ uint32 marker_bit = read_bit_field (&m_posInfo, 1);
+ if ( marker_bit != 1 ) {
+ return false;
+ }
+ /* vop_time_increment_resolution*/
+ uint32 vop_time_increment_resolution = read_bit_field (&m_posInfo, 16);
+ vop_time_resolution = vop_time_increment_resolution;
+ vop_time_found = true;
+ return true;
+}
+
+bool MP4_Utils::is_notcodec_vop(unsigned char *pbuffer, unsigned int len)
+{
+ unsigned int index = 4,vop_bits=0;
+ unsigned int temp = vop_time_resolution - 1;
+ unsigned char vop_type=0,modulo_bit=0,not_coded=0;
+ if (!vop_time_found || !pbuffer || len < 5) {
+ return false;
+ }
+ if((pbuffer[0] == 0) && (pbuffer[1] == 0) && (pbuffer[2] == 1) && (pbuffer[3] == 0xB6)){
+ while(temp) {
+ vop_bits++;
+ temp >>= 1;
+ }
+ vop_type = (pbuffer[index] & 0xc0) >> 6;
+ unsigned bits_parsed = 2;
+ do {
+ modulo_bit = pbuffer[index] & (1 << (7-bits_parsed));
+ bits_parsed++;
+ index += bits_parsed/8;
+ bits_parsed = bits_parsed %8;
+ if(index >= len) {
+ return false;
+ }
+ }while(modulo_bit);
+ bits_parsed++; //skip marker bit
+ bits_parsed += vop_bits + 1;//Vop bit & Marker bits
+ index += bits_parsed/8;
+ if(index >= len) {
+ return false;
+ }
+ bits_parsed = bits_parsed % 8;
+ not_coded = pbuffer[index] & (1 << (7 - bits_parsed));
+ if(!not_coded){
+ return true;
+ }
+ }
+ return false;
+}
+
+void mp4_fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
+ OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
+{
+ switch(aspect_ratio_info->aspect_ratio) {
+ case 1 :
+ frame_info->aspectRatio.aspectRatioX = 1;
+ frame_info->aspectRatio.aspectRatioY = 1;
+ break;
+
+ case 2 :
+ frame_info->aspectRatio.aspectRatioX = 12;
+ frame_info->aspectRatio.aspectRatioY = 11;
+ break;
+
+ case 3 :
+ frame_info->aspectRatio.aspectRatioX = 10;
+ frame_info->aspectRatio.aspectRatioY = 11;
+ break;
+
+ case 4 :
+ frame_info->aspectRatio.aspectRatioX = 16;
+ frame_info->aspectRatio.aspectRatioY = 11;
+ break;
+
+ case 5 :
+ frame_info->aspectRatio.aspectRatioX = 40;
+ frame_info->aspectRatio.aspectRatioY = 33;
+ break;
+
+ case 15:
+ frame_info->aspectRatio.aspectRatioX =
+ aspect_ratio_info->par_width;
+ frame_info->aspectRatio.aspectRatioY =
+ aspect_ratio_info->par_height;
+ break;
+
+ default:
+ ALOGE(" Incorrect aspect_ratio = %d",
+ aspect_ratio_info->aspect_ratio);
+ }
+}
diff --git a/mm-video/vidc/vdec/src/omx_vdec.cpp b/mm-video/vidc/vdec/src/omx_vdec.cpp
index fbfe853b..8a914d99 100644..100755
--- a/mm-video/vidc/vdec/src/omx_vdec.cpp
+++ b/mm-video/vidc/vdec/src/omx_vdec.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -41,24 +41,63 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string.h>
#include <pthread.h>
+#include <sys/prctl.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include "omx_vdec.h"
#include <fcntl.h>
+#include <limits.h>
-#define BITSTREAM_LOG 0
+#ifndef _ANDROID_
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#endif //_ANDROID_
-#if BITSTREAM_LOG
-FILE *outputBufferFile1;
-char filename [] = "/data/input-bitstream.m4v";
+#ifdef _ANDROID_
+#include <cutils/properties.h>
+#undef USE_EGL_IMAGE_GPU
+#endif
+
+#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
+#include <gralloc_priv.h>
+#endif
+
+#if defined (_ANDROID_ICS_)
+#include <genlock.h>
+#endif
+
+#ifdef _ANDROID_
+#include "DivXDrmDecrypt.h"
+#endif //_ANDROID_
+
+#ifdef USE_EGL_IMAGE_GPU
+#include <EGL/egl.h>
+#include <EGL/eglQCOM.h>
+#define EGL_BUFFER_HANDLE_QCOM 0x4F00
+#define EGL_BUFFER_OFFSET_QCOM 0x4F01
#endif
-#define H264_SUPPORTED_WIDTH (480)
-#define H264_SUPPORTED_HEIGHT (368)
+#ifdef INPUT_BUFFER_LOG
+#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0"
+#define INPUT_BUFFER_FILE_NAME_LEN 30
+FILE *inputBufferFile1;
+char inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0";
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+FILE *outputBufferFile1;
+char outputfilename [] = "/data/output.yuv";
+#endif
+#ifdef OUTPUT_EXTRADATA_LOG
+FILE *outputExtradataFile;
+char ouputextradatafilename [] = "/data/extradata";
+#endif
-#define MPEG4_SUPPORTED_WIDTH (480)
-#define MPEG4_SUPPORTED_HEIGHT (368)
+#define DEFAULT_FPS 30
+#define MAX_NUM_SPS 32
+#define MAX_NUM_PPS 256
+#define MAX_INPUT_ERROR (MAX_NUM_SPS + MAX_NUM_PPS)
+#define MAX_SUPPORTED_FPS 120
#define VC1_SP_MP_START_CODE 0xC5000000
#define VC1_SP_MP_START_CODE_MASK 0xFF000000
@@ -76,43 +115,68 @@ char filename [] = "/data/input-bitstream.m4v";
#define VC1_STRUCT_B_POS 24
#define VC1_SEQ_LAYER_SIZE 36
+#ifdef USE_ION
+ #define MEM_DEVICE "/dev/ion"
+ #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
+#elif MAX_RES_720P
+#define MEM_DEVICE "/dev/pmem_adsp"
+#elif MAX_RES_1080P_EBI
+#define MEM_DEVICE "/dev/pmem_adsp"
+#elif MAX_RES_1080P
+#define MEM_DEVICE "/dev/pmem_smipool"
+#endif
+
+/*
#ifdef _ANDROID_
extern "C"{
#include<utils/Log.h>
}
#endif//_ANDROID_
+*/
+
+#undef DEBUG_PRINT_LOW
+#undef DEBUG_PRINT_HIGH
+#undef DEBUG_PRINT_ERROR
-#define DEBUG_PRINT(...) printf(__VA_ARGS__)
-#define DEBUG_PRINT_ERROR(...) printf(__VA_ARGS__)
-#define DEBUG_PRINT_LOW(...) printf(__VA_ARGS__)
+#define DEBUG_PRINT_LOW ALOGV
+#define DEBUG_PRINT_HIGH ALOGV
+#define DEBUG_PRINT_ERROR ALOGE
+
+#ifndef _ANDROID_
+#include <glib.h>
+#define strlcpy g_strlcpy
+#endif
+#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } }
+#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); }
void* async_message_thread (void *input)
{
struct vdec_ioctl_msg ioctl_msg;
struct vdec_msginfo vdec_msg;
omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
-
+ int error_code = 0;
DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
+ prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
while (1)
{
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = (void*)&vdec_msg;
-
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&vdec_msg;
/*Wait for a message from the video decoder driver*/
- if (ioctl ( omx->driver_context.video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,
- (void*)&ioctl_msg) < 0)
+ error_code = ioctl ( omx->drv_ctx.video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,
+ (void*)&ioctl_msg);
+ if (error_code == -512) // ERESTARTSYS
+ {
+ DEBUG_PRINT_ERROR("\n ERESTARTSYS received in ioctl read next msg!");
+ }
+ else if (error_code < 0)
{
DEBUG_PRINT_ERROR("\n Error in ioctl read next msg");
break;
- }
- else
+ } /*Call Instance specific process function*/
+ else if (omx->async_message_process(input,&vdec_msg) < 0)
{
- /*Call Instance specific process function*/
- if (omx->async_message_process(input,&vdec_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\nERROR:Wrong ioctl message");
- }
+ DEBUG_PRINT_ERROR("\nERROR:Wrong ioctl message");
}
}
DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
@@ -126,6 +190,7 @@ void* message_thread(void *input)
int n;
DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
+ prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
while (1)
{
@@ -224,6 +289,107 @@ unsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
return m_q[m_read].id;
}
+#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) );
+}
+omx_vdec::ts_arr_list::~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;
+
+ //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;
+}
+
+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;
+
+ 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 (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;
+
+}
+
+
+bool omx_vdec::ts_arr_list::reset_ts_list()
+{
+ 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;
+}
+#endif
+
// factory function executed by the core to create instances
void *get_omx_component_factory_fn(void)
{
@@ -231,13 +397,23 @@ void *get_omx_component_factory_fn(void)
}
#ifdef _ANDROID_
+#ifdef USE_ION
+VideoHeap::VideoHeap(int devicefd, size_t size, void* base,
+ struct ion_handle *handle, int ionMapfd)
+{
+ m_ion_device_fd = devicefd;
+ m_ion_handle = handle;
+ MemoryHeapBase::init(ionMapfd, base, size, 0, MEM_DEVICE);
+ //ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
+}
+#else
VideoHeap::VideoHeap(int fd, size_t size, void* base)
{
// dup file descriptor, map once, use pmem
- init(dup(fd), base, size, 0 , "/dev/pmem_adsp");
+ init(dup(fd), base, size, 0 , MEM_DEVICE);
}
+#endif
#endif // _ANDROID_
-
/* ======================================================================
FUNCTION
omx_vdec::omx_vdec
@@ -253,40 +429,25 @@ RETURN VALUE
========================================================================== */
omx_vdec::omx_vdec(): m_state(OMX_StateInvalid),
m_app_data(NULL),
- m_color_format(OMX_COLOR_FormatYUV420Planar),
m_inp_mem_ptr(NULL),
m_out_mem_ptr(NULL),
+ m_phdr_pmem_ptr(NULL),
pending_input_buffers(0),
pending_output_buffers(0),
m_out_bm_count(0),
- m_out_buf_count(0),
- m_inp_buf_count(OMX_VIDEO_DEC_NUM_INPUT_BUFFERS),
- m_inp_buf_size(OMX_VIDEO_DEC_INPUT_BUFFER_SIZE),
m_inp_bm_count(0),
m_inp_bPopulated(OMX_FALSE),
m_out_bPopulated(OMX_FALSE),
- m_height(0),
- m_width(0),
- m_port_height(0),
- m_port_width(0),
- m_crop_x(0),
- m_crop_y(0),
- m_crop_dx(0),
- m_crop_dy(0),
m_flags(0),
m_inp_bEnabled(OMX_TRUE),
m_out_bEnabled(OMX_TRUE),
- m_event_port_settings_sent(false),
- input_flush_progress (false),
- output_flush_progress (false),
m_platform_list(NULL),
m_platform_entry(NULL),
m_pmem_info(NULL),
+ output_flush_progress (false),
+ input_flush_progress (false),
input_use_buffer (false),
output_use_buffer (false),
- m_ineos_reached (0),
- m_outeos_pending (0),
- m_outeos_reached (0),
arbitrary_bytes (true),
psource_frame (NULL),
pdest_frame (NULL),
@@ -295,33 +456,93 @@ omx_vdec::omx_vdec(): m_state(OMX_StateInvalid),
codec_type_parse ((codec_type)0),
first_frame_meta (true),
frame_count (0),
- nal_count (0),
nal_length(0),
+ nal_count (0),
look_ahead_nal (false),
first_frame(0),
first_buffer(NULL),
first_frame_size (0),
- set_seq_header_done(false),
- gate_output_buffers(true),
- gate_input_buffers(false),
- stride(0),
- sent_first_frame(false),
m_error_propogated(false),
- scan_lines(0),
m_device_file_ptr(NULL),
- m_vc1_profile((vc1_profile_type)0)
+ m_vc1_profile((vc1_profile_type)0),
+ prev_ts(LLONG_MAX),
+ rst_prev_ts(true),
+ frm_int(0),
+ m_in_alloc_cnt(0),
+ m_display_id(NULL),
+ ouput_egl_buffers(false),
+ h264_parser(NULL),
+ client_extradata(0),
+ h264_last_au_ts(LLONG_MAX),
+ h264_last_au_flags(0),
+ m_inp_err_count(0),
+#ifdef _ANDROID_
+ m_heap_ptr(NULL),
+ m_heap_count(0),
+ m_enable_android_native_buffers(OMX_FALSE),
+ m_use_android_native_buffers(OMX_FALSE),
+#endif
+ in_reconfig(false),
+ m_use_output_pmem(OMX_FALSE),
+ m_out_mem_region_smi(OMX_FALSE),
+ m_out_pvt_entry_pmem(OMX_FALSE),
+ secure_mode(false)
+#ifdef _ANDROID_
+ ,iDivXDrmDecrypt(NULL)
+#endif
+ ,m_desc_buffer_ptr(NULL)
+ ,m_extradata(NULL)
{
/* Assumption is that , to begin with , we have all the frames with decoder */
- DEBUG_PRINT_HIGH("\n In OMX vdec Constuctor");
+ 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;
+ }
+ property_value[0] = NULL;
+ 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] = NULL;
+ 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);
+
+#endif
memset(&m_cmp,0,sizeof(m_cmp));
memset(&m_cb,0,sizeof(m_cb));
- memset (&driver_context,0,sizeof(driver_context));
+ memset (&drv_ctx,0,sizeof(drv_ctx));
memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
- driver_context.video_driver_fd = -1;
+ memset(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty));
+ memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+ m_demux_entries = 0;
+#ifdef _ANDROID_ICS_
+ memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+#endif
+ drv_ctx.timestamp_adjust = false;
+ drv_ctx.video_driver_fd = -1;
m_vendor_config.pData = NULL;
pthread_mutex_init(&m_lock, NULL);
sem_init(&m_cmd_lock,0,0);
+#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);
+#endif
}
@@ -341,19 +562,25 @@ RETURN VALUE
omx_vdec::~omx_vdec()
{
m_pmem_info = NULL;
- m_port_width = m_port_height = 0;
- DEBUG_PRINT_HIGH("\n In OMX vdec Destructor");
+ 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("\n Waiting on OMX Msg Thread exit");
+ DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
pthread_join(msg_thread_id,NULL);
- DEBUG_PRINT_HIGH("\n Waiting on OMX Async Thread exit");
+ DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
pthread_join(async_thread_id,NULL);
pthread_mutex_destroy(&m_lock);
sem_destroy(&m_cmd_lock);
- DEBUG_PRINT_HIGH("\n Exit OMX vdec Destructor");
+#ifdef _ANDROID_
+ if (perf_flag)
+ {
+ DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
+ dec_time.end();
+ }
+#endif /* _ANDROID_ */
+ DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
}
/* ======================================================================
@@ -401,7 +628,7 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
pThis->m_cmd_q.pop_entry(&p1,&p2,&ident);
}
- if (qsize == 0 && !pThis->gate_output_buffers)
+ if (qsize == 0 && pThis->m_state != OMX_StatePause)
{
qsize = pThis->m_ftb_q.m_size;
if (qsize)
@@ -410,7 +637,7 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
}
}
- if (qsize == 0)
+ if (qsize == 0 && pThis->m_state != OMX_StatePause)
{
qsize = pThis->m_etb_q.m_size;
if (qsize)
@@ -447,7 +674,7 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
}
- else if (p2 == (unsigned)OMX_ErrorHardware)
+ else if (p2 == OMX_ErrorHardware)
{
pThis->omx_report_error();
}
@@ -460,10 +687,26 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
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 && pThis->in_reconfig)
+ {
+ pThis->in_reconfig = false;
+ pThis->drv_ctx.op_buf = pThis->op_buf_rcnfg;
+ OMX_ERRORTYPE eRet = pThis->set_buffer_req(&pThis->drv_ctx.op_buf);
+ 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 );
- //TODO: Check if output port is one that got disabled
- pThis->gate_output_buffers = false;
break;
case OMX_CommandPortEnable:
DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
@@ -516,124 +759,182 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
case OMX_COMPONENT_GENERATE_EBD:
- if (p2 != VDEC_S_SUCCESS)
+ 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->arbitrary_bytes && 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,
+ 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 ();
- }
+ {
+ DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
+ pThis->omx_report_error ();
}
break;
case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
- DEBUG_PRINT_HIGH("\n Flush i/p Port complete");
- pThis->input_flush_progress = false;
- DEBUG_PRINT_LOW("\n Input flush done pending input %d",
- pThis->pending_input_buffers);
-
- if (pThis->m_cb.EventHandler)
+ DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
+ if (!pThis->input_flush_progress)
{
- if (p2 != VDEC_S_SUCCESS)
- {
- DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
- pThis->omx_report_error ();
- }
- else
+ DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
+ }
+ else
+ {
+ pThis->execute_input_flush();
+ if (pThis->m_cb.EventHandler)
{
- /*Check if we need generate event for Flush done*/
- if(BITMASK_PRESENT(&pThis->m_flags,
- OMX_COMPONENT_INPUT_FLUSH_PENDING))
+ if (p2 != VDEC_S_SUCCESS)
{
- 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 );
+ DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
+ pThis->omx_report_error ();
}
- if (BITMASK_PRESENT(&pThis->m_flags,
- OMX_COMPONENT_IDLE_PENDING))
+ else
{
- if (!pThis->output_flush_progress)
+ /*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))
{
- DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
- if (ioctl (pThis->driver_context.video_driver_fd,
- VDEC_IOCTL_CMD_STOP,NULL ) < 0)
- {
- DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
- pThis->omx_report_error ();
- }
+ if (!pThis->output_flush_progress)
+ {
+ DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
+ if (ioctl (pThis->drv_ctx.video_driver_fd,
+ VDEC_IOCTL_CMD_STOP,NULL ) < 0)
+ {
+ DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
+ pThis->omx_report_error ();
+ }
+ }
}
}
}
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
}
-
break;
case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
- DEBUG_PRINT_HIGH("\n Flush o/p Port complete");
- pThis->output_flush_progress = false;
- DEBUG_PRINT_LOW("\n Output flush done pending buf %d",pThis->pending_output_buffers);
-
- if (pThis->m_cb.EventHandler)
- {
- if (p2 != VDEC_S_SUCCESS)
+ DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
+ if (!pThis->output_flush_progress)
{
- DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
- pThis->omx_report_error ();
+ DEBUG_PRINT_ERROR("\n WARNING: Unexpected flush from driver");
}
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_IDLE_PENDING))
+ pThis->execute_output_flush();
+ if (pThis->m_cb.EventHandler)
{
- if (!pThis->input_flush_progress)
+ if (p2 != VDEC_S_SUCCESS)
{
- DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
- if (ioctl (pThis->driver_context.video_driver_fd,
- VDEC_IOCTL_CMD_STOP,NULL ) < 0)
+ 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_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
- pThis->omx_report_error ();
+ 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->input_flush_progress)
+ {
+ DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
+ if (ioctl (pThis->drv_ctx.video_driver_fd,
+ VDEC_IOCTL_CMD_STOP,NULL ) < 0)
+ {
+ DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
+ pThis->omx_report_error ();
+ }
+ }
}
}
}
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
}
- }
- break;
+ break;
case OMX_COMPONENT_GENERATE_START_DONE:
DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
@@ -661,7 +962,7 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
else if (BITMASK_PRESENT(&pThis->m_flags,
OMX_COMPONENT_PAUSE_PENDING))
{
- if (ioctl (pThis->driver_context.video_driver_fd,
+ if (ioctl (pThis->drv_ctx.video_driver_fd,
VDEC_IOCTL_CMD_PAUSE,NULL ) < 0)
{
DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
@@ -687,6 +988,7 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
}
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");
@@ -699,6 +1001,10 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
}
}
}
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
break;
@@ -725,6 +1031,10 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
}
}
}
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
+ }
break;
@@ -739,6 +1049,7 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
}
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");
@@ -747,33 +1058,87 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
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_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 (pThis->start_port_reconfig() != OMX_ErrorNone)
+ pThis->omx_report_error();
+ else
+ {
+ if (pThis->in_reconfig)
+ {
+ if (pThis->m_cb.EventHandler) {
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventPortSettingsChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, 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_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);
- if(!pThis->gate_output_buffers)
- {
- qsize = pThis->m_cmd_q.m_size + pThis->m_ftb_q.m_size +\
- pThis->m_etb_q.m_size;
- }
- else
- {
- qsize = pThis->m_cmd_q.m_size + pThis->m_etb_q.m_size;
- }
+ 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);
@@ -808,149 +1173,222 @@ OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
unsigned int alignment = 0,buffer_size = 0;
int fds[2];
int r;
- bool is_fluid = false;
-
- if (!m_device_file_ptr) {
- int bytes_read = 0,count = 0;
- unsigned min_size;
- m_device_file_ptr = fopen("/sys/devices/system/soc/soc0/hw_platform","rb");
- if (m_device_file_ptr) {
- (void)fgets((char *)m_hwdevice_name,sizeof(m_hwdevice_name),m_device_file_ptr);
- DEBUG_PRINT_HIGH ("\n Name of the device is %s",m_hwdevice_name);
- min_size = strnlen((const char *)m_hwdevice_name,sizeof(m_hwdevice_name));
- if (strlen("Fluid") < min_size) {
- min_size = strnlen("Fluid",sizeof("Fluid"));
- }
- if (!strncmp("Fluid",(const char *)m_hwdevice_name,min_size)) {
- is_fluid = true;
- }
- fclose (m_device_file_ptr);
- } else {
- DEBUG_PRINT_HIGH("\n Could not open hw_platform file");
- }
+ OMX_STRING device_name = "/dev/msm_vidc_dec";
+
+ if(!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)){
+ secure_mode = true;
+ arbitrary_bytes = false;
+ role = "OMX.qcom.video.decoder.avc";
+ device_name = "/dev/msm_vidc_dec_sec";
}
+ DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Start of New Playback : role = %s : DEVICE = %s",
+ role, device_name);
- DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Start of New Playback");
- driver_context.video_driver_fd = open ("/dev/msm_vidc_dec",\
- O_RDWR|O_NONBLOCK);
+ drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
- DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d",
- driver_context.video_driver_fd);
+ DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open returned fd %d, errno %d",
+ drv_ctx.video_driver_fd, errno);
- if(driver_context.video_driver_fd == 0){
- driver_context.video_driver_fd = open ("/dev/msm_vidc_dec",\
- O_RDWR|O_NONBLOCK);
+ if(drv_ctx.video_driver_fd == 0){
+ drv_ctx.video_driver_fd = open(device_name, O_RDWR | O_NONBLOCK);
}
- if(driver_context.video_driver_fd < 0)
+ if(drv_ctx.video_driver_fd < 0)
{
- DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure\n");
- return OMX_ErrorInsufficientResources;
- }
-
-#ifndef MULTI_DEC_INST
- unsigned int instance_count = 0;
- if (!is_fluid) {
- ioctl_msg.outputparam = &instance_count;
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_GET_NUMBER_INSTANCES,
- (void*)&ioctl_msg) < 0){
- DEBUG_PRINT_ERROR("\n Instance Query Failed");
- return OMX_ErrorInsufficientResources;
- }
- if (instance_count > 1) {
- close(driver_context.video_driver_fd);
- DEBUG_PRINT_ERROR("\n Reject Second instance of Decoder");
- driver_context.video_driver_fd = -1;
+ DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
return OMX_ErrorInsufficientResources;
- }
}
-#endif
+ drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
+ drv_ctx.frame_rate.fps_denominator = 1;
-#if BITSTREAM_LOG
- outputBufferFile1 = fopen (filename, "ab");
+
+#ifdef INPUT_BUFFER_LOG
+ strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+ outputBufferFile1 = fopen (outputfilename, "ab");
+#endif
+#ifdef OUTPUT_EXTRADATA_LOG
+ outputExtradataFile = fopen (ouputextradatafilename, "ab");
#endif
// Copy the role information which provides the decoder kind
- strncpy(driver_context.kind,role,128);
-
- if(!strncmp(driver_context.kind,"OMX.qcom.video.decoder.mpeg4",\
+ strlcpy(drv_ctx.kind,role,128);
+ if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char *)m_cRole, "video_decoder.mpeg4",\
+ strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
OMX_MAX_STRINGNAME_SIZE);
- driver_context.decoder_format = VDEC_CODECTYPE_MPEG4;
+ drv_ctx.timestamp_adjust = true;
+ drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
eCompressionFormat = OMX_VIDEO_CodingMPEG4;
/*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");
+#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;
+ 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");
+#endif
}
- else if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.h263",\
+ else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char *)m_cRole, "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");
- driver_context.decoder_format = VDEC_CODECTYPE_H263;
+ drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
eCompressionFormat = OMX_VIDEO_CodingH263;
codec_type_parse = CODEC_TYPE_H263;
m_frame_parser.init_start_codes (codec_type_parse);
+#ifdef INPUT_BUFFER_LOG
+ strcat(inputfilename, "263");
+#endif
}
- else if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.avc",\
+#ifdef MAX_RES_1080P
+ else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
- driver_context.decoder_format = VDEC_CODECTYPE_H264;
+ 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;
+ eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+ codec_type_parse = CODEC_TYPE_DIVX;
+ m_frame_parser.init_start_codes (codec_type_parse);
+#ifdef _ANDROID_
+ OMX_ERRORTYPE err = createDivxDrmContext();
+ if( err != OMX_ErrorNone ) {
+ DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+ return err;
+ }
+#endif //_ANDROID_
+ }
+ 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;
+ eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+ codec_type_parse = CODEC_TYPE_DIVX;
+ m_frame_parser.init_start_codes (codec_type_parse);
+#ifdef _ANDROID_
+ OMX_ERRORTYPE err = createDivxDrmContext();
+ if( err != OMX_ErrorNone ) {
+ DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+ return err;
+ }
+#endif //_ANDROID_
+ }
+ 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;
+ eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+ codec_type_parse = CODEC_TYPE_DIVX;
+ m_frame_parser.init_start_codes (codec_type_parse);
+#ifdef _ANDROID_
+ OMX_ERRORTYPE err = createDivxDrmContext();
+ if( err != OMX_ErrorNone ) {
+ DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+ return err;
+ }
+#endif //_ANDROID_
+ }
+#else
+ else if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
+ OMX_MAX_STRINGNAME_SIZE)) || (!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 Decoder selected");
+ drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_5;
+ eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+ codec_type_parse = CODEC_TYPE_DIVX;
+ m_frame_parser.init_start_codes (codec_type_parse);
+
+#ifdef _ANDROID_
+ OMX_ERRORTYPE err = createDivxDrmContext();
+ if( err != OMX_ErrorNone ) {
+ DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
+ return err;
+ }
+#endif //_ANDROID_
+ }
+#endif
+ 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;
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");
+#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;
+ m_frame_parser.init_start_codes (codec_type_parse);
+#ifdef INPUT_BUFFER_LOG
+ strcat(inputfilename, "vc1");
+#endif
}
- else if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.vc1",\
+ else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
- driver_context.decoder_format = VDEC_CODECTYPE_VC1;
+ 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;
m_frame_parser.init_start_codes (codec_type_parse);
+#ifdef INPUT_BUFFER_LOG
+ strcat(inputfilename, "vc1");
+#endif
}
else
{
DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
eRet = OMX_ErrorInvalidComponentName;
}
-
+#ifdef INPUT_BUFFER_LOG
+ inputBufferFile1 = fopen (inputfilename, "ab");
+#endif
if (eRet == OMX_ErrorNone)
{
- driver_context.output_format = VDEC_YUV_FORMAT_NV12;
-
- if (is_fluid) {
-
- FILE * pFile;
- char disable_overlay = '0';
- pFile = fopen
- ("/data/data/com.arcsoft.videowall/files/disableoverlay.txt", "rb" );
- if (pFile == NULL) {
- DEBUG_PRINT_HIGH(" fopen FAiLED for disableoverlay.txt\n");
- } else {
- int count = fread(&disable_overlay, 1, 1, pFile);
- fclose(pFile);
- }
-
- if(disable_overlay == '1') {
- DEBUG_PRINT_HIGH(" vdec : TILE format \n");
- driver_context.output_format = VDEC_YUV_FORMAT_TILE_4x2;
- } else {
- DEBUG_PRINT_HIGH(" vdec : NV 12 format \n");
- driver_context.output_format = VDEC_YUV_FORMAT_NV12;
- }
- }
+#ifdef MAX_RES_720P
+ drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
+#endif
+#ifdef MAX_RES_1080P
+ drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2;
+#endif
/*Initialize Decoder with codec type and resolution*/
- ioctl_msg.inputparam = &driver_context.decoder_format;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &drv_ctx.decoder_format;
+ ioctl_msg.out = NULL;
if ( (eRet == OMX_ErrorNone) &&
- ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_CODEC,
+ ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_CODEC,
(void*)&ioctl_msg) < 0)
{
@@ -959,11 +1397,11 @@ OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
}
/*Set the output format*/
- ioctl_msg.inputparam = &driver_context.output_format;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &drv_ctx.output_format;
+ ioctl_msg.out = NULL;
if ( (eRet == OMX_ErrorNone) &&
- ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT,
+ ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT,
(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\n Set output format failed");
@@ -971,23 +1409,23 @@ OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
}
#ifdef MAX_RES_720P
- driver_context.video_resoultion.frame_height = 720;
- driver_context.video_resoultion.frame_width = 1280;
- driver_context.video_resoultion.stride = 1280;
- driver_context.video_resoultion.scan_lines = 720;
+ drv_ctx.video_resolution.frame_height =
+ drv_ctx.video_resolution.scan_lines = 720;
+ drv_ctx.video_resolution.frame_width =
+ drv_ctx.video_resolution.stride = 1280;
#endif
#ifdef MAX_RES_1080P
- driver_context.video_resoultion.frame_height = 1088;
- driver_context.video_resoultion.frame_width = 1920;
- driver_context.video_resoultion.stride = 1920;
- driver_context.video_resoultion.scan_lines = 1088;
+ drv_ctx.video_resolution.frame_height =
+ drv_ctx.video_resolution.scan_lines = 1088;
+ drv_ctx.video_resolution.frame_width =
+ drv_ctx.video_resolution.stride = 1920;
#endif
- ioctl_msg.inputparam = &driver_context.video_resoultion;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &drv_ctx.video_resolution;
+ ioctl_msg.out = NULL;
if ( (eRet == OMX_ErrorNone) &&
- ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_PICRES,
+ ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_PICRES,
(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\n Set Resolution failed");
@@ -995,72 +1433,89 @@ OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
}
/*Get the Buffer requirements for input and output ports*/
- driver_context.input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &driver_context.input_buffer;
-
- if ( (eRet == OMX_ErrorNone) &&
- ioctl (driver_context.video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
- (void*)&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Requesting for input buffer requirements failed");
- eRet = OMX_ErrorInsufficientResources;
+ drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+ drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+ drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+ drv_ctx.extradata = 0;
+ drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
+ drv_ctx.idr_only_decoding = 0;
+
+ if (eRet == OMX_ErrorNone)
+ eRet = get_buffer_req(&drv_ctx.ip_buf);
+ if (eRet == OMX_ErrorNone)
+ eRet = get_buffer_req(&drv_ctx.op_buf);
+ m_state = OMX_StateLoaded;
+#ifdef DEFAULT_EXTRADATA
+ if (eRet == OMX_ErrorNone && !secure_mode)
+ eRet = enable_extradata(DEFAULT_EXTRADATA);
+#endif
+ if ( (codec_type_parse == CODEC_TYPE_VC1) ||
+ (codec_type_parse == CODEC_TYPE_H264)) //add CP check here
+ {
+ //Check if dmx can be disabled
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ ioctl_msg.out = &drv_ctx.disable_dmx;
+ if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT, &ioctl_msg))
+ {
+ DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT");
+ eRet = OMX_ErrorHardware;
+ }
+ else
+ {
+ if (drv_ctx.disable_dmx && !secure_mode)
+ {
+ DEBUG_PRINT_HIGH("DMX disable is supported");
+
+ int rc = ioctl(drv_ctx.video_driver_fd,
+ VDEC_IOCTL_SET_DISABLE_DMX);
+ if(rc < 0) {
+ DEBUG_PRINT_ERROR("Failed to disable dmx on driver.");
+ drv_ctx.disable_dmx = false;
+ eRet = OMX_ErrorHardware;
+ }
+ }
+ else {
+ drv_ctx.disable_dmx = false;
+ }
+ }
}
-
- m_inp_buf_count = driver_context.input_buffer.actualcount;
- buffer_size = driver_context.input_buffer.buffer_size;
- alignment = driver_context.input_buffer.alignment;
- m_inp_buf_size = ((buffer_size + alignment -1 ) & (~(alignment -1)));
- m_inp_buf_count_min = driver_context.input_buffer.mincount;
-
- /*Get the Buffer requirements for input and output ports*/
- driver_context.input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- ioctl_msg.inputparam = &driver_context.input_buffer;
- ioctl_msg.outputparam = NULL;
-
- m_inp_buf_count_min = m_inp_buf_count = driver_context.input_buffer.actualcount =
- driver_context.input_buffer.mincount + 3;
-
- if ( (eRet == OMX_ErrorNone) &&
- ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_BUFFER_REQ,
- (void*)&ioctl_msg) < 0)
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
{
- DEBUG_PRINT_ERROR("\n Set input buffer requirements failed");
- eRet = OMX_ErrorInsufficientResources;
- }
+ 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;
- driver_context.output_buffer.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &driver_context.output_buffer;
+ 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 ((eRet == OMX_ErrorNone) &&
- ioctl (driver_context.video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
- (void*)&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Requesting for output buffer requirements failed");
- eRet = OMX_ErrorInsufficientResources;
+ h264_parser = new h264_stream_parser();
+ if (!h264_parser)
+ {
+ DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
+ eRet = OMX_ErrorInsufficientResources;
+ }
}
- m_out_buf_count_recon = m_out_buf_count = driver_context.output_buffer.actualcount;
- m_out_buf_count_min_recon = m_out_buf_count_min = driver_context.output_buffer.mincount;
-
- alignment = driver_context.output_buffer.alignment;
- buffer_size = driver_context.output_buffer.buffer_size;
- m_out_buf_size_recon = m_out_buf_size =
- ((buffer_size + alignment - 1) & (~(alignment -1)));
-#ifdef MAX_RES_720P
- scan_lines = m_crop_dy = m_height = 720;
- stride = m_crop_dx = m_width = 1280;
-#endif
-#ifdef MAX_RES_1080P
- scan_lines = m_crop_dy = m_height = 1088;
- stride = m_crop_dx = m_width = 1920;
-#endif
- m_port_height = m_height;
- m_port_width = m_width;
- m_state = OMX_StateLoaded;
-
if(pipe(fds))
{
DEBUG_PRINT_ERROR("pipe creation failed\n");
@@ -1106,17 +1561,18 @@ OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
{
DEBUG_PRINT_ERROR("\n Component Init Failed");
DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
- (void)ioctl(driver_context.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
+ (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
NULL);
DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
- close (driver_context.video_driver_fd);
- driver_context.video_driver_fd = -1;
+ close (drv_ctx.video_driver_fd);
+ drv_ctx.video_driver_fd = -1;
}
else
{
DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
}
+ memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
return eRet;
}
@@ -1149,6 +1605,10 @@ OMX_ERRORTYPE omx_vdec::get_component_version
return OMX_ErrorInvalidState;
}
/* TBD -- Return the proper version */
+ if (specVersion)
+ {
+ specVersion->nVersion = OMX_SPEC_VERSION;
+ }
return OMX_ErrorNone;
}
/* ======================================================================
@@ -1177,6 +1637,13 @@ OMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
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: %d", param1);
+ return OMX_ErrorBadPortIndex;
+ }
post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
sem_wait(&m_cmd_lock);
DEBUG_PRINT_LOW("\n send_command: Command Processed\n");
@@ -1205,7 +1672,7 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
{
OMX_ERRORTYPE eRet = OMX_ErrorNone;
OMX_STATETYPE eState = (OMX_STATETYPE) param1;
- int bFlag = 1,sem_posted = 0;;
+ int bFlag = 1,sem_posted = 0;
DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
@@ -1308,10 +1775,16 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
/* Requesting transition from Idle to Executing */
else if(eState == OMX_StateExecuting)
{
- BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
- post_event (NULL,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_START_DONE);
+ BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
bFlag = 0;
+ 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;
+ }
}
/* Requesting transition from Idle to Idle */
else if(eState == OMX_StateIdle)
@@ -1333,7 +1806,7 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
else if(eState == OMX_StatePause)
{
/*To pause the Video core we need to start the driver*/
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_CMD_START,
+ if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
NULL) < 0)
{
DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
@@ -1387,7 +1860,7 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
else if(eState == OMX_StatePause)
{
DEBUG_PRINT_LOW("\n PAUSE Command Issued");
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_CMD_PAUSE,
+ if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE,
NULL) < 0)
{
DEBUG_PRINT_ERROR("\n Error In Pause State");
@@ -1398,7 +1871,7 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
else
{
BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
- DEBUG_PRINT_LOW("send_command_proxy(): Pause-->Executing\n");
+ DEBUG_PRINT_LOW("send_command_proxy(): Executing-->Pause\n");
bFlag = 0;
}
}
@@ -1448,7 +1921,7 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
if(eState == OMX_StateExecuting)
{
DEBUG_PRINT_LOW("\n Pause --> Executing \n");
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_CMD_RESUME,
+ if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME,
NULL) < 0)
{
DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed");
@@ -1590,13 +2063,12 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
{
DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
"with param1: %d", param1);
- if(0 == param1 || OMX_ALL == param1)
+ if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
{
BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
}
- if(1 == param1 || OMX_ALL == param1)
+ if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
{
- //generate output flush event only.
BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
}
if (!sem_posted){
@@ -1674,8 +2146,8 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
{
sem_posted = 1;
sem_post (&m_cmd_lock);
- execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
}
+ execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
}
// Skip the event notification
@@ -1697,12 +2169,13 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
{
- if(!sem_posted)
+ if (!sem_posted)
{
sem_posted = 1;
sem_post (&m_cmd_lock);
- execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
}
+ 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;
@@ -1743,37 +2216,31 @@ RETURN VALUE
========================================================================== */
bool omx_vdec::execute_omx_flush(OMX_U32 flushType)
{
- struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
- enum vdec_bufferflush flush_dir = VDEC_FLUSH_TYPE_ALL;
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ enum vdec_bufferflush flush_dir;
bool bRet = false;
-
- if(flushType == 0 || flushType == OMX_ALL)
+ switch (flushType)
{
- input_flush_progress = true;
- //flush input only
- bRet = execute_input_flush(flushType);
+ case OMX_CORE_INPUT_PORT_INDEX:
+ input_flush_progress = true;
+ flush_dir = VDEC_FLUSH_TYPE_INPUT;
+ break;
+ case OMX_CORE_OUTPUT_PORT_INDEX:
+ output_flush_progress = true;
+ flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
+ break;
+ default:
+ input_flush_progress = true;
+ output_flush_progress = true;
+ flush_dir = VDEC_FLUSH_TYPE_ALL;
}
- if(flushType == 1 || flushType == OMX_ALL)
+ ioctl_msg.in = &flush_dir;
+ ioctl_msg.out = NULL;
+ if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < 0)
{
- //flush output only
- output_flush_progress = true;
- bRet = execute_output_flush(flushType);
+ DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir);
+ bRet = false;
}
-
- if(flushType == OMX_ALL)
- {
- /*Check if there are buffers with the Driver*/
- DEBUG_PRINT_LOW("\n Flush ALL ioctl issued");
- ioctl_msg.inputparam = &flush_dir;
- ioctl_msg.outputparam = NULL;
-
- if (ioctl(driver_context.video_driver_fd,VDEC_IOCTL_CMD_FLUSH,&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Flush ALL Failed ");
- return false;
- }
- }
-
return bRet;
}
/*=========================================================================
@@ -1788,10 +2255,8 @@ PARAMETERS
RETURN VALUE
true/false
==========================================================================*/
-bool omx_vdec::execute_output_flush(OMX_U32 flushType)
+bool omx_vdec::execute_output_flush()
{
- struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
- enum vdec_bufferflush flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
unsigned p1 = 0; // Parameter - 1
unsigned p2 = 0; // Parameter - 2
unsigned ident = 0;
@@ -1805,10 +2270,9 @@ bool omx_vdec::execute_output_flush(OMX_U32 flushType)
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 == OMX_COMPONENT_GENERATE_FTB )
{
- DEBUG_PRINT_LOW("\n Inside Flush Buffer OMX_COMPONENT_GENERATE_FTB");
pending_output_buffers++;
fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
}
@@ -1818,37 +2282,14 @@ bool omx_vdec::execute_output_flush(OMX_U32 flushType)
}
}
pthread_mutex_unlock(&m_lock);
+ output_flush_progress = false;
- if(gate_output_buffers)
- {
- DEBUG_PRINT_LOW("\n Output Buffers gated Check flush response");
- if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
- {
- DEBUG_PRINT_LOW("\n Notify Output Flush done");
- BITMASK_CLEAR (&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
- m_cb.EventHandler(&m_cmp,m_app_data,OMX_EventCmdComplete,OMX_CommandFlush,
- OMX_CORE_OUTPUT_PORT_INDEX,NULL );
- }
- output_flush_progress = false;
- return bRet;
- }
-
- DEBUG_PRINT_LOW("\n output buffers count = %d",pending_output_buffers);
-
- if(flushType == 1)
+ if (arbitrary_bytes)
{
- /*Check if there are buffers with the Driver*/
- DEBUG_PRINT_LOW("\n ioctl command flush for output");
- ioctl_msg.inputparam = &flush_dir;
- ioctl_msg.outputparam = NULL;
-
- if (ioctl(driver_context.video_driver_fd,VDEC_IOCTL_CMD_FLUSH,&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n output flush failed");
- return false;
- }
+ 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;
}
/*=========================================================================
@@ -1863,10 +2304,8 @@ PARAMETERS
RETURN VALUE
true/false
==========================================================================*/
-bool omx_vdec::execute_input_flush(OMX_U32 flushType)
+bool omx_vdec::execute_input_flush()
{
- struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
- enum vdec_bufferflush flush_dir = VDEC_FLUSH_TYPE_INPUT;
unsigned i =0;
unsigned p1 = 0; // Parameter - 1
unsigned p2 = 0; // Parameter - 2
@@ -1890,22 +2329,30 @@ bool omx_vdec::execute_input_flush(OMX_U32 flushType)
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)
+ 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)
{
@@ -1932,24 +2379,25 @@ bool omx_vdec::execute_input_flush(OMX_U32 flushType)
}
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);
- DEBUG_PRINT_LOW("\n Value of pending input buffers %d \n",pending_input_buffers);
-
- if(flushType == 0)
+ input_flush_progress = false;
+ if (!arbitrary_bytes)
{
- /*Check if there are buffers with the Driver*/
- DEBUG_PRINT_LOW("\n Input Flush ioctl issued");
- ioctl_msg.inputparam = &flush_dir;
- ioctl_msg.outputparam = NULL;
-
- if (ioctl(driver_context.video_driver_fd,VDEC_IOCTL_CMD_FLUSH,&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Input Flush Failed ");
- return false;
- }
+ prev_ts = LLONG_MAX;
+ rst_prev_ts = true;
}
-
+#ifdef _ANDROID_
+ 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;
}
@@ -1978,16 +2426,14 @@ bool omx_vdec::post_event(unsigned int p1,
pthread_mutex_lock(&m_lock);
- if( id == OMX_COMPONENT_GENERATE_FTB || \
- (id == OMX_COMPONENT_GENERATE_FBD)||
- (id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH))
+ if (id == OMX_COMPONENT_GENERATE_FTB ||
+ 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)||
- (id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH))
+ 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);
}
@@ -2004,6 +2450,169 @@ bool omx_vdec::post_event(unsigned int p1,
return bRet;
}
+#ifdef MAX_RES_720P
+OMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
+{
+ 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_AVCLevel31;
+
+ }
+ else if (profileLevelType->nProfileIndex == 1)
+ {
+ profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+ profileLevelType->eLevel = OMX_VIDEO_AVCLevel31;
+ }
+ else if(profileLevelType->nProfileIndex == 2)
+ {
+ profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+ profileLevelType->eLevel = OMX_VIDEO_AVCLevel31;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ return eRet;
+}
+#endif
+#ifdef MAX_RES_1080P
+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;
+
+ 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 %d\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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+ 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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ return eRet;
+}
+#endif
/* ======================================================================
FUNCTION
@@ -2024,7 +2633,6 @@ OMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
OMX_INOUT OMX_PTR paramData)
{
OMX_ERRORTYPE eRet = OMX_ErrorNone;
- unsigned int height=0,width = 0;
DEBUG_PRINT_LOW("get_parameter: \n");
if(m_state == OMX_StateInvalid)
@@ -2041,67 +2649,12 @@ OMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
{
case OMX_IndexParamPortDefinition:
{
- OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
- portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
+ (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
-
- portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
- portDefn->nSize = sizeof(portDefn);
- portDefn->eDomain = OMX_PortDomainVideo;
- portDefn->format.video.nFrameHeight = m_crop_dy;
- portDefn->format.video.nFrameWidth = m_crop_dx;
- portDefn->format.video.nStride = m_width;
- portDefn->format.video.nSliceHeight = m_height;
- portDefn->format.video.xFramerate= 25;
-
- if (0 == portDefn->nPortIndex)
- {
- portDefn->eDir = OMX_DirInput;
- /*Actual count is based on input buffer count*/
- portDefn->nBufferCountActual = m_inp_buf_count;
- /*Set the Min count*/
- portDefn->nBufferCountMin = m_inp_buf_count_min;
- portDefn->nBufferSize = m_inp_buf_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)
- {
- m_out_buf_count = m_out_buf_count_recon;
- m_out_buf_count_min = m_out_buf_count_min_recon;
- m_out_buf_size = m_out_buf_size_recon;
- portDefn->eDir = OMX_DirOutput;
- portDefn->nBufferCountActual = m_out_buf_count;
- portDefn->nBufferCountMin = m_out_buf_count_min;
- portDefn->nBufferSize = m_out_buf_size;
- portDefn->bEnabled = m_out_bEnabled;
- portDefn->bPopulated = m_out_bPopulated;
- height = driver_context.video_resoultion.frame_height;
- width = driver_context.video_resoultion.frame_width;
-
- portDefn->format.video.nFrameHeight = height;
- portDefn->format.video.nFrameWidth = width;
- portDefn->format.video.nStride = stride;
- portDefn->format.video.nSliceHeight = scan_lines;
- DEBUG_PRINT_LOW("\n Get Param Slice Height %d Slice Width %d",
- scan_lines,stride);
- //TODO: Need to add color format
- portDefn->format.video.eColorFormat = m_color_format;
- portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
- DEBUG_PRINT_LOW("\n Output Actual %d Output Min %d",
- portDefn->nBufferCountActual,portDefn->nBufferCountMin);
- }
- else
- {
- portDefn->eDir = OMX_DirMax;
- DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
- (int)portDefn->nPortIndex);
- eRet = OMX_ErrorBadPortIndex;
- }
-
+ eRet = update_portdef(portDefn);
+ if (eRet == OMX_ErrorNone)
+ m_port_def = *portDefn;
break;
}
case OMX_IndexParamVideoInit:
@@ -2141,15 +2694,19 @@ OMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
else if (1 == portFmt->nPortIndex)
{
+ portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused;
+#ifdef MAX_RES_720P
if (0 == portFmt->nIndex)
- {
- if (driver_context.output_format == VDEC_YUV_FORMAT_NV12)
- portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
- else
- portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)0x7F000000;
-
- portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused;
- }
+ portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+ else if(1 == portFmt->nIndex)
+ portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+#endif
+#ifdef MAX_RES_1080P
+ if(0 == portFmt->nIndex)
+ portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+#endif
else
{
DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
@@ -2207,7 +2764,7 @@ OMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
paramIndex);
- strncpy((char*)comp_role->cRole,(const char*)m_cRole,
+ strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
OMX_MAX_STRINGNAME_SIZE);
break;
}
@@ -2260,6 +2817,54 @@ OMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
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;
+#ifdef MAX_RES_720P
+ eRet = get_supported_profile_level_for_720p(profileLevelType);
+#endif
+#ifdef MAX_RES_1080P
+ eRet = get_supported_profile_level_for_1080p(profileLevelType);
+#endif
+ 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) {
+#ifdef USE_ION
+ if(secure_mode) {
+ nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
+ GRALLOC_USAGE_PRIVATE_CP_BUFFER | GRALLOC_USAGE_PRIVATE_UNCACHED);
+ } else {
+ nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP |
+ GRALLOC_USAGE_PRIVATE_IOMMU_HEAP);
+ }
+#else
+#if defined (MAX_RES_720P) || defined (MAX_RES_1080P_EBI)
+ nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
+#elif MAX_RES_1080P
+ nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_SMI_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
+#endif
+#endif
+ } 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);
@@ -2268,12 +2873,47 @@ OMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
- DEBUG_PRINT_LOW("\n get_parameter returning Height %d , Width %d \n",
- m_height, m_width);
- return eRet;
+ 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;
}
+#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
+OMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
+{
+ DEBUG_PRINT_LOW("Inside use_android_native_buffer");
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
+
+ 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
+ OMX_U8 *buffer = NULL;
+ 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;
+ }
+ }
+ eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
+ } else {
+ eRet = OMX_ErrorBadParameter;
+ }
+ return eRet;
+}
+#endif
/* ======================================================================
FUNCTION
omx_vdec::Setparameter
@@ -2294,8 +2934,6 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
{
OMX_ERRORTYPE eRet = OMX_ErrorNone;
struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
- unsigned int alignment = 0,buffer_size = 0;
- int i;
if(m_state == OMX_StateInvalid)
{
@@ -2307,171 +2945,124 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
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)) {
+ DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
+ return OMX_ErrorIncorrectStateOperation;
+ }
+
switch(paramIndex)
{
case OMX_IndexParamPortDefinition:
{
OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
-
- /*set_parameter can be called in loaded state
- or disabled port */
-
- /* When the component is in Loaded state and IDLE Pending*/
- if(((m_state == OMX_StateLoaded)&&
- !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
- /* Or while the I/P or the O/P port or disabled */
- ||((OMX_DirInput == portDefn->eDir && m_inp_bEnabled == OMX_FALSE)||
- (OMX_DirOutput == portDefn->eDir && m_out_bEnabled == OMX_FALSE)))
- {
- DEBUG_PRINT_LOW("Set Parameter called in valid state");
- }
- else
- {
- DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
- return OMX_ErrorIncorrectStateOperation;
- }
+ //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);
-
- eRet = omx_vdec_validate_port_param(portDefn->format.video.nFrameHeight,
- portDefn->format.video.nFrameWidth);
- if(eRet != OMX_ErrorNone)
- {
- return OMX_ErrorUnsupportedSetting;
- }
if(OMX_DirOutput == portDefn->eDir)
{
- if ( portDefn->nBufferCountActual < m_out_buf_count_min ||
- portDefn->nBufferSize != m_out_buf_size
- )
- {
- return OMX_ErrorBadParameter;
- }
- driver_context.output_buffer.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &driver_context.output_buffer;
-
- if (ioctl (driver_context.video_driver_fd,
- VDEC_IOCTL_GET_BUFFER_REQ,(void*)&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Request output buffer requirements failed");
- return OMX_ErrorUnsupportedSetting;
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
+ m_display_id = portDefn->format.video.pNativeWindow;
+ 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;
+ eRet = set_buffer_req(&drv_ctx.op_buf);
+ if (eRet == OMX_ErrorNone)
+ m_port_def = *portDefn;
}
- driver_context.output_buffer.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- driver_context.output_buffer.actualcount =
- portDefn->nBufferCountActual;
- ioctl_msg.inputparam = &driver_context.output_buffer;
- ioctl_msg.outputparam = NULL;
-
- if (ioctl (driver_context.video_driver_fd,
- VDEC_IOCTL_SET_BUFFER_REQ,(void*)&ioctl_msg) < 0)
+ else
{
- DEBUG_PRINT_ERROR("\n Request output buffer requirements failed");
- return OMX_ErrorUnsupportedSetting;
+ DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%d: %u)\n",
+ drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
+ portDefn->nBufferCountActual, portDefn->nBufferSize);
+ eRet = OMX_ErrorBadParameter;
}
- m_out_buf_count = portDefn->nBufferCountActual;
- m_out_buf_count_recon = m_out_buf_count;
- DEBUG_PRINT_LOW("set_parameter:OMX_IndexParamPortDefinition output port\n");
}
else if(OMX_DirInput == portDefn->eDir)
{
- if(m_height != portDefn->format.video.nFrameHeight ||
- m_width != portDefn->format.video.nFrameWidth)
+ 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 : %d",
+ 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;
+ ioctl_msg.in = &drv_ctx.frame_rate;
+ if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
+ (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("Setting frame rate to driver failed");
+ }
+ DEBUG_PRINT_LOW("set_parameter: frm_int(%u) 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("set_parameter ip port: stride %d\n",
- (int)portDefn->format.video.nStride);
- // set the HxW only if non-zero
- if((portDefn->format.video.nFrameHeight != 0x0)
- && (portDefn->format.video.nFrameWidth != 0x0))
- {
- m_crop_x = m_crop_y = 0;
- m_crop_dy = m_port_height = m_height =
+ DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n",
+ portDefn->format.video.nFrameWidth,
+ portDefn->format.video.nFrameHeight);
+ if (portDefn->format.video.nFrameHeight != 0x0 &&
+ portDefn->format.video.nFrameWidth != 0x0)
+ {
+ drv_ctx.video_resolution.frame_height =
+ drv_ctx.video_resolution.scan_lines =
portDefn->format.video.nFrameHeight;
- m_crop_dx = m_port_width = m_width =
+ drv_ctx.video_resolution.frame_width =
+ drv_ctx.video_resolution.stride =
portDefn->format.video.nFrameWidth;
- scan_lines = portDefn->format.video.nSliceHeight;
- stride = portDefn->format.video.nStride;
- DEBUG_PRINT_LOW("\n SetParam with new H %d and W %d\n",
- m_height, m_width );
- driver_context.video_resoultion.frame_height = m_height;
- driver_context.video_resoultion.frame_width = m_width;
- driver_context.video_resoultion.stride = stride;
- driver_context.video_resoultion.scan_lines = scan_lines;
- ioctl_msg.inputparam = &driver_context.video_resoultion;
- ioctl_msg.outputparam = NULL;
-
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_PICRES,
- (void*)&ioctl_msg) < 0)
+ ioctl_msg.in = &drv_ctx.video_resolution;
+ ioctl_msg.out = NULL;
+ if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES,
+ (void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\n Set Resolution failed");
- return OMX_ErrorUnsupportedSetting;
- }
- driver_context.output_buffer.buffer_type =
- VDEC_BUFFER_TYPE_OUTPUT;
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &driver_context.output_buffer;
-
- if (ioctl (driver_context.video_driver_fd,
- VDEC_IOCTL_GET_BUFFER_REQ,(void*)&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Request output buffer requirements failed");
- return OMX_ErrorUnsupportedSetting;
- }
-
- m_out_buf_count_recon = m_out_buf_count = driver_context.output_buffer.actualcount;
- m_out_buf_count_min_recon = m_out_buf_count_min = driver_context.output_buffer.mincount;
-
- alignment = driver_context.output_buffer.alignment;
- buffer_size = driver_context.output_buffer.buffer_size;
- m_out_buf_size_recon = m_out_buf_size =
- ((buffer_size + alignment - 1) & (~(alignment - 1)));
- }
- }
- else
- {
- /*
- If actual buffer count is greater than the Min buffer
- count,change the actual count.
- m_inp_buf_count is initialized to OMX_CORE_NUM_INPUT_BUFFERS
- in the constructor
- */
- if ( portDefn->nBufferCountActual < m_inp_buf_count_min ||
- portDefn->nBufferSize != m_inp_buf_size
- )
- {
- return OMX_ErrorBadParameter;
- }
- /*Get the Buffer requirements for input and output ports*/
- driver_context.input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &driver_context.input_buffer;
-
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
- (void*)&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Request input buffer requirements failed");
- return OMX_ErrorUnsupportedSetting;
- }
-
- driver_context.input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- driver_context.input_buffer.actualcount =
- portDefn->nBufferCountActual;
- ioctl_msg.inputparam = &driver_context.input_buffer;
- ioctl_msg.outputparam = NULL;
-
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_BUFFER_REQ,
- (void*)&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Request input buffer requirements failed");
- return OMX_ErrorUnsupportedSetting;
+ eRet = OMX_ErrorUnsupportedSetting;
}
-
- m_inp_buf_count = portDefn->nBufferCountActual;
- DEBUG_PRINT_LOW("\n set_parameter: Image Dimensions same \n");
- }
-
+ else
+ eRet = get_buffer_req(&drv_ctx.op_buf);
+ }
+ }
+ else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
+ && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size)
+ {
+ drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
+ drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize;
+ eRet = set_buffer_req(&drv_ctx.ip_buf);
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\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)
{
@@ -2481,8 +3072,6 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
}
break;
-
-
case OMX_IndexParamVideoPortFormat:
{
OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
@@ -2490,13 +3079,33 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
portFmt->eColorFormat);
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
- portFmt->eColorFormat);
if(1 == portFmt->nPortIndex)
{
+ enum vdec_output_fromat op_format;
+ if(portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
+ op_format = VDEC_YUV_FORMAT_NV12;
+ else if(portFmt->eColorFormat ==
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
+ op_format = VDEC_YUV_FORMAT_TILE_4x2;
+ else
+ eRet = OMX_ErrorBadParameter;
- m_color_format = portFmt->eColorFormat;
- }
+ if(eRet == OMX_ErrorNone && drv_ctx.output_format != op_format)
+ {
+ /*Set the output format*/
+ drv_ctx.output_format = op_format;
+ ioctl_msg.in = &drv_ctx.output_format;
+ ioctl_msg.out = NULL;
+ if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_OUTPUT_FORMAT,
+ (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("\n Set output format failed");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ else
+ eRet = get_buffer_req(&drv_ctx.op_buf);
+ }
+ }
}
break;
@@ -2512,12 +3121,20 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
{
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;
+ DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes enabled");
+ }
}
else if (portFmt->nFramePackingFormat ==
OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
{
arbitrary_bytes = false;
+ DEBUG_PRINT_HIGH("setparameter: arbitrary_bytes disabled");
}
else
{
@@ -2526,6 +3143,21 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
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;
@@ -2547,11 +3179,11 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
return OMX_ErrorIncorrectStateOperation;
}
- if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
+ 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))
{
- strncpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
}
else
{
@@ -2559,11 +3191,11 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
eRet =OMX_ErrorUnsupportedSetting;
}
}
- else if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
+ 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))
{
- strncpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
}
else
{
@@ -2571,11 +3203,41 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
eRet = OMX_ErrorUnsupportedSetting;
}
}
- else if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
+ 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))
{
- strncpy((char*)m_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;
+ }
+ }
+#ifdef MAX_RES_1080P
+ 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
+ else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
+#endif
+ {
+ 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
{
@@ -2583,11 +3245,13 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
eRet =OMX_ErrorUnsupportedSetting;
}
}
- else if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
+ 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))
{
- strncpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
}
else
{
@@ -2597,7 +3261,7 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
else
{
- DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", driver_context.kind);
+ DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
eRet = OMX_ErrorInvalidComponentName;
}
break;
@@ -2656,14 +3320,215 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
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;
+ enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY;
+ DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
+ pictureOrder->eOutputPictureOrder);
+ if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER)
+ pic_order = VDEC_ORDER_DISPLAY;
+ else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
+ pic_order = VDEC_ORDER_DECODE;
+ time_stamp_dts.set_timestamp_reorder_mode(false);
+ }
+ else
+ eRet = OMX_ErrorBadParameter;
+#ifdef MAX_RES_720P
+ if (drv_ctx.idr_only_decoding)
+ {
+ if (pictureOrder->eOutputPictureOrder != QOMX_VIDEO_DECODE_ORDER)
+ {
+ DEBUG_PRINT_HIGH("only decode order is supported for thumbnail mode");
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+#endif
+ if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order)
+ {
+ drv_ctx.picture_order = pic_order;
+ ioctl_msg.in = &drv_ctx.picture_order;
+ ioctl_msg.out = NULL;
+ if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
+ (void*)&ioctl_msg) < 0)
+ {
+ 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,
+ ((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,
+ ((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,
+ ((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,
+ ((QOMX_ENABLETYPE *)paramData)->bEnable);
+ else {
+ DEBUG_PRINT_ERROR("\n secure mode setting not supported");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ case OMX_QcomIndexParamVideoDivx:
+ {
+#ifdef MAX_RES_720P
+ QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
+ if((divXType) && (divXType->eFormat == QOMX_VIDEO_DIVXFormat311)) {
+ DEBUG_PRINT_HIGH("set_parameter: DivX 3.11 not supported in 7x30 core.");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+#endif
+ }
+ 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");
+ drv_ctx.idr_only_decoding = 1;
+ int rc = ioctl(drv_ctx.video_driver_fd,
+ VDEC_IOCTL_SET_IDR_ONLY_DECODING);
+ if(rc < 0) {
+ DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver.");
+ eRet = OMX_ErrorHardware;
+ }
+#ifdef MAX_RES_720P
+ if (eRet == OMX_ErrorNone)
+ {
+ DEBUG_PRINT_HIGH("set decode order for thumbnail mode");
+ drv_ctx.picture_order = VDEC_ORDER_DECODE;
+ ioctl_msg.in = &drv_ctx.picture_order;
+ ioctl_msg.out = NULL;
+ if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
+ (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("\n Set picture order failed");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ }
+#endif
+ }
+ break;
+#ifdef MAX_RES_1080P
+ 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, extradataIndexType->bEnabled);
+ // Set smooth streaming parameter
+ int rc = ioctl(drv_ctx.video_driver_fd,
+ VDEC_IOCTL_SET_CONT_ON_RECONFIG);
+ if(rc < 0) {
+ DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
+ eRet = OMX_ErrorHardware;
+ }
+ }
+ }
+ }
+ break;
+#endif
+#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;
+#endif
+ case OMX_QcomIndexParamEnableTimeStampReorder:
+ {
+ QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
+ if (drv_ctx.picture_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;
default:
{
DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
eRet = OMX_ErrorUnsupportedIndex;
}
}
-
return eRet;
}
@@ -2736,11 +3601,43 @@ OMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp,
struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
(QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
- ioctl_msg.outputparam = (void*)&decoderinstances->nNumOfInstances;
- (void)(ioctl(driver_context.video_driver_fd,
+ ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances;
+ (void)(ioctl(drv_ctx.video_driver_fd,
VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg));
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_QcomIndexParamFrameInfoExtraData:
+ {
+ OMX_QCOM_EXTRADATA_FRAMEINFO *extradata =
+ (OMX_QCOM_EXTRADATA_FRAMEINFO *) configData;
+
+ if(m_extradata == NULL){
+ DEBUG_PRINT_ERROR("get_config: m_extradata not set. "
+ "Aspect Ratio information missing!!");
+ }
+ else {
+ extradata->aspectRatio.aspectRatioX =
+ m_extradata->aspectRatio.aspectRatioX;
+ extradata->aspectRatio.aspectRatioY =
+ m_extradata->aspectRatio.aspectRatioY;
+ }
+ break;
+ }
+
default:
{
DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
@@ -2790,7 +3687,7 @@ OMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp,
{
OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
- if (!strcmp(driver_context.kind, "OMX.qcom.video.decoder.avc"))
+ if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc"))
{
DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
OMX_U32 extra_size;
@@ -2849,14 +3746,15 @@ OMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp,
len = 0;
}
}
- else if (!strcmp(driver_context.kind, "OMX.qcom.video.decoder.mpeg4"))
+ 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(driver_context.kind, "OMX.qcom.video.decoder.vc1"))
+ else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1"))
{
if(m_vendor_config.pData)
{
@@ -2911,7 +3809,7 @@ OMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp,
pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
nal_length = pNal->nNaluBytes;
m_frame_parser.init_nal_length(nal_length);
- DEBUG_PRINT_LOW("\n Nal Length option called with Size %d",nal_length);
+ DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
return ret;
}
@@ -2936,13 +3834,40 @@ OMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
OMX_IN OMX_STRING paramName,
OMX_OUT OMX_INDEXTYPE* indexType)
{
- DEBUG_PRINT_ERROR("get_extension_index: Error, Not implemented\n");
if(m_state == OMX_StateInvalid)
{
DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
return OMX_ErrorInvalidState;
}
- return OMX_ErrorNotImplemented;
+ else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
+ *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
+ }
+#ifdef MAX_RES_1080P
+ else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
+ {
+ *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
+ }
+#endif
+#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
+ 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)) {
+ *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
+ }
+ 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)) {
+ *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
+ }
+#endif
+ else {
+ DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
+ return OMX_ErrorNotImplemented;
+ }
+ return OMX_ErrorNone;
}
/* ======================================================================
@@ -2992,7 +3917,7 @@ OMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE
/* ======================================================================
FUNCTION
- omx_vdec::UseInputBuffer
+ omx_vdec::UseOutputBuffer
DESCRIPTION
Helper function for Use buffer in the input pin
@@ -3004,7 +3929,7 @@ RETURN VALUE
true/false
========================================================================== */
-OMX_ERRORTYPE omx_vdec::use_input_buffer(
+OMX_ERRORTYPE omx_vdec::use_output_buffer(
OMX_IN OMX_HANDLETYPE hComp,
OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
OMX_IN OMX_U32 port,
@@ -3013,138 +3938,223 @@ OMX_ERRORTYPE omx_vdec::use_input_buffer(
OMX_IN OMX_U8* buffer)
{
OMX_ERRORTYPE eRet = OMX_ErrorNone;
- struct vdec_setbuffer_cmd setbuffers;
- OMX_BUFFERHEADERTYPE *input = NULL;
+ OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
+ unsigned i= 0; // Temporary counter
struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
- unsigned i = 0;
- unsigned char *buf_addr = NULL;
- int pmem_fd = -1;
-
- if(bytes != m_inp_buf_size)
- {
- return OMX_ErrorBadParameter;
- }
-
- if(!m_inp_mem_ptr)
- {
- DEBUG_PRINT_HIGH("\n Use i/p buffer case - Header List allocation");
- input_use_buffer = true;
- m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
- calloc( (sizeof(OMX_BUFFERHEADERTYPE)), m_inp_buf_count);
+ struct vdec_setbuffer_cmd setbuffers;
+ OMX_PTR privateAppData = NULL;
+#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
+ private_handle_t *handle = NULL;
+#endif
+ OMX_U8 *buff = buffer;
- if (m_inp_mem_ptr == NULL)
+ if (!m_out_mem_ptr) {
+ DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
+ eRet = allocate_output_headers();
+#ifdef MAX_RES_1080P
+ if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
{
- return OMX_ErrorInsufficientResources;
+ //allocate H264_mv_buffer
+ eRet = vdec_alloc_h264_mv();
+ if (eRet) {
+ DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
+ return OMX_ErrorInsufficientResources;
+ }
}
+#endif
- driver_context.ptr_inputbuffer = (struct vdec_bufferpayload *) \
- calloc ((sizeof (struct vdec_bufferpayload)),m_inp_buf_count);
-
- if (driver_context.ptr_inputbuffer == NULL)
- {
- return OMX_ErrorInsufficientResources;
- }
+ }
- for (i=0; i < m_inp_buf_count; i++)
- {
- driver_context.ptr_inputbuffer [i].pmem_fd = -1;
+ if (eRet == OMX_ErrorNone) {
+ for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
+ if(BITMASK_ABSENT(&m_out_bm_count,i))
+ {
+ break;
+ }
}
}
- for(i=0; i< m_inp_buf_count; i++)
- {
- if(BITMASK_ABSENT(&m_inp_bm_count,i))
- {
- break;
- }
+ if(i >= drv_ctx.op_buf.actualcount) {
+ eRet = OMX_ErrorInsufficientResources;
}
- if(i < m_inp_buf_count)
- {
- pmem_fd = open ("/dev/pmem_adsp",O_RDWR | O_SYNC);
+ 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;
+ 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;
+ }
+ }
+ privateAppData = appData;
+ }
+#if defined(_ANDROID_ICS_)
+ native_buffer[i].nativehandle = handle;
+#endif
+ 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].mmaped_size =
+ drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
+ } else
+#endif
- if (pmem_fd < 0)
- {
- return OMX_ErrorInsufficientResources;
- }
+ 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,CACHED);
+ if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
+ 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(pmem_fd == 0)
- {
- pmem_fd = open ("/dev/pmem_adsp",O_RDWR | O_SYNC);
- if (pmem_fd < 0)
- {
- return OMX_ErrorInsufficientResources;
- }
- }
+ if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
+ return OMX_ErrorInsufficientResources;
+ }
- if(!align_pmem_buffers(pmem_fd, m_inp_buf_size,
- driver_context.input_buffer.alignment))
- {
- DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
- close(pmem_fd);
- return OMX_ErrorInsufficientResources;
- }
+ 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) {
+ return OMX_ErrorInsufficientResources;
+ }
+ }
- buf_addr = (unsigned char *)mmap(NULL,m_inp_buf_size,PROT_READ|PROT_WRITE,
- MAP_SHARED,pmem_fd,0);
+ 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
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+ drv_ctx.ptr_outputbuffer[i].offset = 0;
+ privateAppData = appData;
+ }
+ else {
- if (buf_addr == MAP_FAILED)
- {
- return OMX_ErrorInsufficientResources;
- }
+ DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
- driver_context.ptr_inputbuffer [i].bufferaddr = buf_addr;
- driver_context.ptr_inputbuffer [i].pmem_fd = pmem_fd;
- driver_context.ptr_inputbuffer [i].mmaped_size = m_inp_buf_size;
- driver_context.ptr_inputbuffer [i].offset = 0;
+ if (!appData || !bytes )
+ {
+ DEBUG_PRINT_ERROR("\n Invalid appData or bytes");
+ return OMX_ErrorBadParameter;
+ }
- setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- memcpy (&setbuffers.buffer,&driver_context.ptr_inputbuffer [i],
- sizeof (vdec_bufferpayload));
- ioctl_msg.inputparam = &setbuffers;
- ioctl_msg.outputparam = NULL;
+ if(!secure_mode && !buffer)
+ {
+ DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
+ return OMX_ErrorBadParameter;
+ }
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
- &ioctl_msg) < 0)
- {
- return OMX_ErrorInsufficientResources;
- }
- *bufferHdr = (m_inp_mem_ptr + i);
- input = *bufferHdr;
- BITMASK_SET(&m_inp_bm_count,i);
+ 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%x",
+ 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;
- input->pBuffer = (OMX_U8 *)buffer;
- input->nSize = sizeof(OMX_BUFFERHEADERTYPE);
- input->nVersion.nVersion = OMX_SPEC_VERSION;
- input->nAllocLen = m_inp_buf_size;
- input->pAppPrivate = appData;
- input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
- input->pInputPortPrivate = (void *)&driver_context.ptr_inputbuffer [i];
- }
- else
- {
- eRet = OMX_ErrorInsufficientResources;
+ *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));
+
+ ioctl_msg.in = &setbuffers;
+ ioctl_msg.out = NULL;
+
+ DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i,
+ drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd );
+ if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
+ &ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("\n Set output buffer failed");
+ return OMX_ErrorInsufficientResources;
+ }
+ // found an empty buffer at i
+ (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
+ if (m_enable_android_native_buffers) {
+ //LOG_ASSERT(handle == NULL);
+ ALOGE("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;
}
-
/* ======================================================================
FUNCTION
- omx_vdec::UseOutputBuffer
+ omx_vdec::use_input_heap_buffers
DESCRIPTION
- Helper function for Use buffer in the input pin
+ OMX Use Buffer Heap allocation method implementation.
PARAMETERS
- None.
+ <TBD>.
RETURN VALUE
- true/false
+ OMX Error None , if everything successful.
========================================================================== */
-OMX_ERRORTYPE omx_vdec::use_output_buffer(
+OMX_ERRORTYPE omx_vdec::use_input_heap_buffers(
OMX_IN OMX_HANDLETYPE hComp,
OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
OMX_IN OMX_U32 port,
@@ -3152,206 +4162,45 @@ OMX_ERRORTYPE omx_vdec::use_output_buffer(
OMX_IN OMX_U32 bytes,
OMX_IN OMX_U8* buffer)
{
+ DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
OMX_ERRORTYPE eRet = OMX_ErrorNone;
- OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
- unsigned i= 0; // Temporary counter
-
- if(!m_out_mem_ptr)
- {
- DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
- output_use_buffer = true;
- 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("Allocating First Output Buffer(%d)\n",m_out_buf_count);
- nBufHdrSize = m_out_buf_count * sizeof(OMX_BUFFERHEADERTYPE);
-
- nPMEMInfoSize = m_out_buf_count *
- sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
- nPlatformListSize = m_out_buf_count *
- sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
- nPlatformEntrySize = m_out_buf_count *
- 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);
-
- /*
- * Memory for output side involves the following:
- * 1. Array of Buffer Headers
- * 2. Platform specific information List
- * 3. Platform specific Entry List
- * 4. PMem Information entries
- * 5. Bitmask array to hold the buffer allocation details
- * In order to minimize the memory management entire allocation
- * is done in one step.
- */
- 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);
- driver_context.ptr_outputbuffer = (struct vdec_bufferpayload *) \
- calloc (sizeof(struct vdec_bufferpayload),m_out_buf_count);
- driver_context.ptr_respbuffer = (struct vdec_output_frameinfo *)\
- calloc (sizeof (struct vdec_output_frameinfo),m_out_buf_count);
-
- if(m_out_mem_ptr && pPtr && driver_context.ptr_outputbuffer
- && driver_context.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);
-
- // 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 < m_out_buf_count ; 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;
-
- pPMEMInfo->offset = 0;
- pPMEMInfo->pmem_fd = 0;
- bufHdr->pPlatformPrivate = pPlatformList;
-
- driver_context.ptr_outputbuffer[i].pmem_fd = -1;
-
- /*Create a mapping between buffers*/
- bufHdr->pOutputPortPrivate = &driver_context.ptr_respbuffer[i];
- driver_context.ptr_respbuffer[i].client_data = (void *) \
- &driver_context.ptr_outputbuffer[i];
- // Move the buffer and buffer header pointers
- bufHdr++;
- pPMEMInfo++;
- pPlatformEntry++;
- pPlatformList++;
- }
- }
- else
- {
- DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%x][0x%x]\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(driver_context.ptr_outputbuffer)
- {
- free(driver_context.ptr_outputbuffer);
- driver_context.ptr_outputbuffer = NULL;
- }
- if(driver_context.ptr_respbuffer)
- {
- free(driver_context.ptr_respbuffer);
- driver_context.ptr_respbuffer = NULL;
- }
- eRet = OMX_ErrorInsufficientResources;
- }
+ 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;
}
-
- for(i=0; i< m_out_buf_count; i++)
+ else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
{
- if(BITMASK_ABSENT(&m_out_bm_count,i))
+ 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], NULL, NULL))
{
- break;
+ DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+ return OMX_ErrorInsufficientResources;
}
+ m_in_alloc_cnt++;
}
-
- if (eRet == OMX_ErrorNone)
+ else
{
- if(i < m_out_buf_count)
- {
- driver_context.ptr_outputbuffer[i].pmem_fd = \
- open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
-
- if (driver_context.ptr_outputbuffer[i].pmem_fd < 0)
- {
- return OMX_ErrorInsufficientResources;
- }
-
- if(driver_context.ptr_outputbuffer[i].pmem_fd == 0)
- {
- driver_context.ptr_outputbuffer[i].pmem_fd = \
- open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
-
- if (driver_context.ptr_outputbuffer[i].pmem_fd < 0)
- {
- return OMX_ErrorInsufficientResources;
- }
- }
-
- if(!align_pmem_buffers(driver_context.ptr_outputbuffer[i].pmem_fd,
- m_out_buf_size, driver_context.output_buffer.alignment))
- {
- DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
- close(driver_context.ptr_outputbuffer[i].pmem_fd);
- return OMX_ErrorInsufficientResources;
- }
-
- driver_context.ptr_outputbuffer[i].bufferaddr =
- (unsigned char *)mmap(NULL,m_out_buf_size,PROT_READ|PROT_WRITE,
- MAP_SHARED,driver_context.ptr_outputbuffer[i].pmem_fd,0);
-
- if (driver_context.ptr_outputbuffer[i].bufferaddr == MAP_FAILED)
- {
- return OMX_ErrorInsufficientResources;
- }
- driver_context.ptr_outputbuffer[i].offset = 0;
- m_pmem_info[i].offset = driver_context.ptr_outputbuffer[i].offset;
- m_pmem_info[i].pmem_fd = driver_context.ptr_outputbuffer[i].pmem_fd;
-
- // found an empty buffer at i
- *bufferHdr = (m_out_mem_ptr + i );
- (*bufferHdr)->pBuffer = buffer;
- (*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;
- }
+ DEBUG_PRINT_ERROR("All i/p buffers have been set!");
+ eRet = OMX_ErrorInsufficientResources;
}
-
return eRet;
}
@@ -3377,69 +4226,82 @@ OMX_ERRORTYPE omx_vdec::use_buffer(
OMX_IN OMX_U32 bytes,
OMX_IN OMX_U8* buffer)
{
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
- if(m_state == OMX_StateInvalid)
- {
- DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
- return OMX_ErrorInvalidState;
- }
- if(port == OMX_CORE_INPUT_PORT_INDEX)
+ OMX_ERRORTYPE error = OMX_ErrorNone;
+ struct vdec_setbuffer_cmd setbuffers;
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+
+ if (bufferHdr == NULL || bytes == 0)
+ {
+ DEBUG_PRINT_ERROR("bad param 0x%p %ld",bufferHdr, bytes);
+ return OMX_ErrorBadParameter;
+ }
+
+ if(!secure_mode && buffer == NULL) {
+ DEBUG_PRINT_ERROR("bad param 0x%p",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 %u, buffer %p, eRet %d", port, *bufferHdr, error);
+ if(error == OMX_ErrorNone)
+ {
+ if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
{
- eRet = use_input_buffer(hComp,bufferHdr,port,appData,bytes,buffer);
+ // Send the callback now
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
+ post_event(OMX_CommandStateSet,OMX_StateIdle,
+ OMX_COMPONENT_GENERATE_EVENT);
}
- else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
+ if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
+ BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
{
- eRet = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer);
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+ post_event(OMX_CommandPortEnable,
+ OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
}
- else
+ else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
+ BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
{
- DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
- eRet = OMX_ErrorBadPortIndex;
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+ post_event(OMX_CommandPortEnable,
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
}
- DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, eRet);
-
- 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);
- }
- }
- 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);
- }
+ }
+ return error;
+}
- }
- else 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);
- m_event_port_settings_sent = false;
- }
- }
- }
- return eRet;
+OMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
+ 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;
}
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;
@@ -3448,34 +4310,44 @@ OMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
index = bufferHdr - m_inp_mem_ptr;
DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
- if (index < m_inp_buf_count && driver_context.ptr_inputbuffer)
+ if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
{
DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
- if (driver_context.ptr_inputbuffer[index].pmem_fd > 0)
+ if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
{
struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
struct vdec_setbuffer_cmd setbuffers;
setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- memcpy (&setbuffers.buffer,&driver_context.ptr_inputbuffer[index],
+ memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
sizeof (vdec_bufferpayload));
- ioctl_msg.inputparam = &setbuffers;
- ioctl_msg.outputparam = NULL;
- int ioctl_r = ioctl (driver_context.video_driver_fd,
+ ioctl_msg.in = &setbuffers;
+ ioctl_msg.out = NULL;
+ int ioctl_r = ioctl (drv_ctx.video_driver_fd,
VDEC_IOCTL_FREE_BUFFER, &ioctl_msg);
if (ioctl_r < 0)
{
DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r);
}
-
- DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
- driver_context.ptr_inputbuffer[index].pmem_fd);
- DEBUG_PRINT_LOW("\n unmap the input buffer size=%d address = %d",
- driver_context.ptr_inputbuffer[index].mmaped_size,
- driver_context.ptr_inputbuffer[index].bufferaddr);
- munmap (driver_context.ptr_inputbuffer[index].bufferaddr,
- driver_context.ptr_inputbuffer[index].mmaped_size);
- close (driver_context.ptr_inputbuffer[index].pmem_fd);
- driver_context.ptr_inputbuffer[index].pmem_fd = -1;
+ 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 = %d",
+ 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
}
}
@@ -3488,45 +4360,78 @@ OMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
if (bufferHdr == NULL || m_out_mem_ptr == NULL)
{
+ DEBUG_PRINT_ERROR("\nfree_output_buffer ERROR");
return OMX_ErrorBadParameter;
}
index = bufferHdr - m_out_mem_ptr;
DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
- if (index < m_out_buf_count && driver_context.ptr_outputbuffer)
+ if (index < drv_ctx.op_buf.actualcount
+ && drv_ctx.ptr_outputbuffer)
{
DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
- driver_context.ptr_outputbuffer[index].bufferaddr);
+ drv_ctx.ptr_outputbuffer[index].bufferaddr);
- if (!gate_output_buffers)
- {
- struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
- struct vdec_setbuffer_cmd setbuffers;
- setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- memcpy (&setbuffers.buffer,&driver_context.ptr_outputbuffer[index],
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct vdec_setbuffer_cmd setbuffers;
+ setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+ memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
sizeof (vdec_bufferpayload));
- ioctl_msg.inputparam = &setbuffers;
- ioctl_msg.outputparam = NULL;
- DEBUG_PRINT_LOW("\nRelease the Output Buffer");
- if (ioctl (driver_context.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
- &ioctl_msg) < 0)
- DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD");
- }
+ ioctl_msg.in = &setbuffers;
+ ioctl_msg.out = NULL;
+ DEBUG_PRINT_LOW("\nRelease the Output Buffer");
+ if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
+ &ioctl_msg) < 0)
+ DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD");
- if (driver_context.ptr_outputbuffer[0].pmem_fd > 0)
- {
- DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
- driver_context.ptr_outputbuffer[0].pmem_fd);
- DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d address = %d",
- driver_context.ptr_outputbuffer[0].mmaped_size,
- driver_context.ptr_outputbuffer[0].bufferaddr);
- munmap (driver_context.ptr_outputbuffer[0].bufferaddr,
- driver_context.ptr_outputbuffer[0].mmaped_size);
- close (driver_context.ptr_outputbuffer[0].pmem_fd);
- driver_context.ptr_outputbuffer[0].pmem_fd = -1;
- }
+#ifdef _ANDROID_
+ if(m_enable_android_native_buffers) {
+ if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
+ if(!secure_mode) {
+ munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
+ drv_ctx.ptr_outputbuffer[index].mmaped_size);
+ }
+ }
+ drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
+ } else {
+#endif
+ if (drv_ctx.ptr_outputbuffer[index].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[index].pmem_fd);
+ DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d address = %d",
+ drv_ctx.ptr_outputbuffer[index].mmaped_size,
+ drv_ctx.ptr_outputbuffer[index].bufferaddr);
+ munmap (drv_ctx.ptr_outputbuffer[index].bufferaddr,
+ drv_ctx.ptr_outputbuffer[index].mmaped_size);
+ }
+#ifdef USE_ION
+ free_ion_memory(&drv_ctx.op_buf_ion_info[index]);
+#endif
+ close (drv_ctx.ptr_outputbuffer[index].pmem_fd);
+ drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
+#ifdef _ANDROID_
+ m_heap_ptr[index].video_heap_ptr = NULL;
+ m_heap_count = m_heap_count - 1;
+ if (m_heap_count == 0)
+ {
+ free(m_heap_ptr);
+ m_heap_ptr = NULL;
+ }
+#endif // _ANDROID_
+ }
+#ifdef _ANDROID_
+ }
+#endif
+ }
+#ifdef MAX_RES_1080P
+ if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
+ {
+ vdec_dealloc_h264_mv();
}
+#endif
return OMX_ErrorNone;
@@ -3552,44 +4457,21 @@ OMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp,
if (m_inp_heap_ptr == NULL)
{
m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
- calloc( (sizeof(OMX_BUFFERHEADERTYPE)), m_inp_buf_count);
+ calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
+ drv_ctx.ip_buf.actualcount);
m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
- calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), m_inp_buf_count);
+ 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;
}
-
- h264_scratch.nAllocLen = m_inp_buf_size;
- h264_scratch.pBuffer = (OMX_U8 *)malloc (m_inp_buf_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;
- }
-
- 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 ");
- return OMX_ErrorInsufficientResources;
- }
-
- m_frame_parser.mutils->initialize_frame_checking_environment();
- m_frame_parser.mutils->allocate_rbsp_buffer (m_inp_buf_size);
- }
}
/*Find a Free index*/
- for(i=0; i< m_inp_buf_count; i++)
+ for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
{
if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
{
@@ -3598,9 +4480,9 @@ OMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp,
}
}
- if (i < m_inp_buf_count)
+ if (i < drv_ctx.ip_buf.actualcount)
{
- buf_addr = (unsigned char *)malloc (m_inp_buf_size);
+ buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
if (buf_addr == NULL)
{
@@ -3614,7 +4496,7 @@ OMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp,
input->pBuffer = (OMX_U8 *)buf_addr;
input->nSize = sizeof(OMX_BUFFERHEADERTYPE);
input->nVersion.nVersion = OMX_SPEC_VERSION;
- input->nAllocLen = m_inp_buf_size;
+ 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 );
@@ -3667,41 +4549,54 @@ OMX_ERRORTYPE omx_vdec::allocate_input_buffer(
unsigned char *buf_addr = NULL;
int pmem_fd = -1;
- if(bytes != m_inp_buf_size)
+ if(bytes != drv_ctx.ip_buf.buffer_size)
{
- DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d",bytes,m_inp_buf_size);
+ DEBUG_PRINT_LOW("\n Requested Size is wrong %d 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 case - Header List allocation");
- DEBUG_PRINT_LOW("\n Allocating input buffer count %d ",m_inp_buf_count);
- DEBUG_PRINT_LOW("\n Size of input buffer is %d",m_inp_buf_size);
+ 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)), m_inp_buf_count);
+ calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
if (m_inp_mem_ptr == NULL)
{
return OMX_ErrorInsufficientResources;
}
- driver_context.ptr_inputbuffer = (struct vdec_bufferpayload *) \
- calloc ((sizeof (struct vdec_bufferpayload)),m_inp_buf_count);
+ 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);
- if (driver_context.ptr_inputbuffer == NULL)
+ if (drv_ctx.ip_buf_ion_info == NULL)
{
return OMX_ErrorInsufficientResources;
}
+#endif
- for (i=0; i < m_inp_buf_count; i++)
+ for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
{
- driver_context.ptr_inputbuffer [i].pmem_fd = -1;
+ drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
+#ifdef USE_ION
+ drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
+#endif
}
}
- for(i=0; i< m_inp_buf_count; i++)
+ for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
{
if(BITMASK_ABSENT(&m_inp_bm_count,i))
{
@@ -3710,10 +4605,21 @@ OMX_ERRORTYPE omx_vdec::allocate_input_buffer(
}
}
- if(i < m_inp_buf_count)
+ if(i < drv_ctx.ip_buf.actualcount)
{
DEBUG_PRINT_LOW("\n Allocate input Buffer");
- pmem_fd = open ("/dev/pmem_adsp", O_RDWR, O_SYNC);
+
+#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,CACHED);
+ 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)
{
@@ -3723,7 +4629,7 @@ OMX_ERRORTYPE omx_vdec::allocate_input_buffer(
if (pmem_fd == 0)
{
- pmem_fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+ pmem_fd = open (MEM_DEVICE,O_RDWR);
if (pmem_fd < 0)
{
@@ -3732,54 +4638,70 @@ OMX_ERRORTYPE omx_vdec::allocate_input_buffer(
}
}
- if(!align_pmem_buffers(pmem_fd, m_inp_buf_size,
- driver_context.input_buffer.alignment))
+ 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);
- buf_addr = (unsigned char *)mmap(NULL,m_inp_buf_size,PROT_READ|PROT_WRITE,
- MAP_SHARED,pmem_fd,0);
-
- if (buf_addr == MAP_FAILED)
- {
- DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
- return OMX_ErrorInsufficientResources;
+ 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;
+ }
}
-
- driver_context.ptr_inputbuffer [i].bufferaddr = buf_addr;
- driver_context.ptr_inputbuffer [i].pmem_fd = pmem_fd;
- driver_context.ptr_inputbuffer [i].buffer_len = m_inp_buf_size;
- driver_context.ptr_inputbuffer [i].mmaped_size = m_inp_buf_size;
- driver_context.ptr_inputbuffer [i].offset = 0;
+ *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;
setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- memcpy (&setbuffers.buffer,&driver_context.ptr_inputbuffer [i],
+ memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer [i],
sizeof (vdec_bufferpayload));
- ioctl_msg.inputparam = &setbuffers;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &setbuffers;
+ ioctl_msg.out = NULL;
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
+ if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\n Set Buffers Failed");
return OMX_ErrorInsufficientResources;
}
- *bufferHdr = (m_inp_mem_ptr + i);
input = *bufferHdr;
BITMASK_SET(&m_inp_bm_count,i);
DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
-
- input->pBuffer = (OMX_U8 *)buf_addr;
+ 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 = m_inp_buf_size;
+ input->nAllocLen = drv_ctx.ip_buf.buffer_size;
input->pAppPrivate = appData;
input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
- input->pInputPortPrivate = (void *)&driver_context.ptr_inputbuffer [i];
+ input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
+
+ if (drv_ctx.disable_dmx)
+ {
+ eRet = allocate_desc_buffer(i);
+ }
}
else
{
@@ -3816,29 +4738,40 @@ OMX_ERRORTYPE omx_vdec::allocate_output_buffer(
unsigned i= 0; // Temporary counter
struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
struct vdec_setbuffer_cmd setbuffers;
+#ifdef USE_ION
+ 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)
+ 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;
+
+ if (!m_out_mem_ptr)
{
- DEBUG_PRINT_HIGH("\n Allocate o/p buffer case - Header List allocation");
- int nBufHdrSize = 0;
- int nPlatformEntrySize = 0;
- int nPlatformListSize = 0;
- int nPMEMInfoSize = 0;
- int pmem_fd = -1;
- unsigned char *pmem_baseaddress = NULL;
+ DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
+ drv_ctx.op_buf.actualcount,
+ drv_ctx.op_buf.buffer_size);
- 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);
- DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",m_out_buf_count);
- nBufHdrSize = m_out_buf_count * sizeof(OMX_BUFFERHEADERTYPE);
+ nBufHdrSize = drv_ctx.op_buf.actualcount *
+ sizeof(OMX_BUFFERHEADERTYPE);
- nPMEMInfoSize = m_out_buf_count *
+ nPMEMInfoSize = drv_ctx.op_buf.actualcount *
sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
- nPlatformListSize = m_out_buf_count *
+ nPlatformListSize = drv_ctx.op_buf.actualcount *
sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
- nPlatformEntrySize = m_out_buf_count *
+ 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,
@@ -3846,62 +4779,40 @@ OMX_ERRORTYPE omx_vdec::allocate_output_buffer(
nPMEMInfoSize,
nPlatformListSize);
DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
- m_out_buf_count);
-
- pmem_fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
-
- if (pmem_fd < 0)
- {
- DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",m_out_buf_size);
- return OMX_ErrorInsufficientResources;
- }
-
- if(pmem_fd == 0)
- {
- pmem_fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
-
- if (pmem_fd < 0)
- {
- DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",m_out_buf_size);
- return OMX_ErrorInsufficientResources;
- }
- }
-
- if(!align_pmem_buffers(pmem_fd, m_out_buf_size * m_out_buf_count,
- driver_context.output_buffer.alignment))
- {
- DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
- close(pmem_fd);
- return OMX_ErrorInsufficientResources;
- }
+ drv_ctx.op_buf.actualcount);
- pmem_baseaddress = (unsigned char *)mmap(NULL,(m_out_buf_size * m_out_buf_count),
- PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
- m_heap_ptr = new VideoHeap (pmem_fd,
- m_out_buf_size*m_out_buf_count,
- pmem_baseaddress);
-
-
- if (pmem_baseaddress == MAP_FAILED)
- {
- DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",m_out_buf_size);
- 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);
- driver_context.ptr_outputbuffer = (struct vdec_bufferpayload *) \
- calloc (sizeof(struct vdec_bufferpayload),m_out_buf_count);
- driver_context.ptr_respbuffer = (struct vdec_output_frameinfo *)\
- calloc (sizeof (struct vdec_output_frameinfo),m_out_buf_count);
+ 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
+#ifdef _ANDROID_
+ m_heap_ptr = (struct vidc_heap *)\
+ calloc (sizeof(struct vidc_heap),
+ drv_ctx.op_buf.actualcount);
+#endif
- if(m_out_mem_ptr && pPtr && driver_context.ptr_outputbuffer
- && driver_context.ptr_respbuffer)
+ if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
+ && drv_ctx.ptr_respbuffer
+#ifdef _ANDROID_
+ && m_heap_ptr
+#endif
+ )
{
- driver_context.ptr_outputbuffer[0].mmaped_size =
- (m_out_buf_size * m_out_buf_count);
+ 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 *)
@@ -3917,14 +4828,14 @@ OMX_ERRORTYPE omx_vdec::allocate_output_buffer(
// 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 < m_out_buf_count ; i++)
+ 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->nAllocLen = 0;
bufHdr->nFilledLen = 0;
- bufHdr->pAppPrivate = appData;
+ bufHdr->pAppPrivate = NULL;
bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
// Platform specific PMEM Information
// Initialize the Platform Entry
@@ -3936,30 +4847,38 @@ OMX_ERRORTYPE omx_vdec::allocate_output_buffer(
pPlatformList->entryList = pPlatformEntry;
// Keep pBuffer NULL till vdec is opened
bufHdr->pBuffer = NULL;
- bufHdr->nOffset = 0;
- pPMEMInfo->offset = m_out_buf_size*i;
+ pPMEMInfo->offset = 0;
pPMEMInfo->pmem_fd = 0;
bufHdr->pPlatformPrivate = pPlatformList;
-
- driver_context.ptr_outputbuffer[i].pmem_fd = pmem_fd;
-
+ drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
+#ifdef USE_ION
+ drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
+#endif
/*Create a mapping between buffers*/
- bufHdr->pOutputPortPrivate = &driver_context.ptr_respbuffer[i];
- driver_context.ptr_respbuffer[i].client_data = (void *) \
- &driver_context.ptr_outputbuffer[i];
- driver_context.ptr_outputbuffer[i].offset = m_out_buf_size*i;
- driver_context.ptr_outputbuffer[i].bufferaddr = \
- pmem_baseaddress + (m_out_buf_size*i);
-
- DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",\
- pmem_fd,driver_context.ptr_outputbuffer[i].offset,driver_context.ptr_outputbuffer[i].bufferaddr);
+ bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
+ drv_ctx.ptr_respbuffer[i].client_data = (void *)\
+ &drv_ctx.ptr_outputbuffer[i];
+#ifdef _ANDROID_
+ m_heap_ptr[i].video_heap_ptr = NULL;
+#endif
// Move the buffer and buffer header pointers
bufHdr++;
pPMEMInfo++;
pPlatformEntry++;
pPlatformList++;
}
+#ifdef MAX_RES_1080P
+ if(eRet == OMX_ErrorNone && drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
+ {
+ //Allocate the h264_mv_buffer
+ eRet = vdec_alloc_h264_mv();
+ if(eRet) {
+ DEBUG_PRINT_ERROR("ERROR in allocating MV buffers\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+#endif
}
else
{
@@ -3975,67 +4894,154 @@ OMX_ERRORTYPE omx_vdec::allocate_output_buffer(
free(pPtr);
pPtr = NULL;
}
- if(driver_context.ptr_outputbuffer)
+ if(drv_ctx.ptr_outputbuffer)
{
- free(driver_context.ptr_outputbuffer);
- driver_context.ptr_outputbuffer = NULL;
+ free(drv_ctx.ptr_outputbuffer);
+ drv_ctx.ptr_outputbuffer = NULL;
}
- if(driver_context.ptr_respbuffer)
+ if(drv_ctx.ptr_respbuffer)
{
- free(driver_context.ptr_respbuffer);
- driver_context.ptr_respbuffer = NULL;
+ 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;
}
}
- for(i=0; i< m_out_buf_count; i++)
+ 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);
+ DEBUG_PRINT_LOW("\n Found a Free Output Buffer Index %d",i);
break;
}
}
- if (eRet == OMX_ErrorNone)
+ if (i < drv_ctx.op_buf.actualcount)
{
- if(i < m_out_buf_count)
- {
- m_pmem_info[i].offset = driver_context.ptr_outputbuffer[i].offset;
- m_pmem_info[i].pmem_fd = (OMX_U32) m_heap_ptr.get ();
- driver_context.ptr_outputbuffer[i].buffer_len = m_out_buf_size;
- //driver_context.ptr_outputbuffer[i].mmaped_size = m_out_buf_size;
- if(!gate_output_buffers)
- {
- setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- memcpy (&setbuffers.buffer,&driver_context.ptr_outputbuffer [i],
- sizeof (vdec_bufferpayload));
- ioctl_msg.inputparam = &setbuffers;
- ioctl_msg.outputparam = NULL;
+ DEBUG_PRINT_LOW("\n Allocate Output Buffer");
- DEBUG_PRINT_LOW("\n Set the Output Buffer");
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
- &ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Set output buffer failed");
- return OMX_ErrorInsufficientResources;
- }
+#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, CACHED);
+ if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
+ return OMX_ErrorInsufficientResources;
}
+ pmem_fd = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
+#else
+ pmem_fd = open (MEM_DEVICE,O_RDWR);
- // found an empty buffer at i
- *bufferHdr = (m_out_mem_ptr + i );
- (*bufferHdr)->pBuffer = driver_context.ptr_outputbuffer[i].bufferaddr;
- (*bufferHdr)->pAppPrivate = appData;
- BITMASK_SET(&m_out_bm_count,i);
+ 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)
+ {
+ 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.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,
+ 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]);
+#endif
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+
+ *bufferHdr = (m_out_mem_ptr + i);
+ if (secure_mode)
+ drv_ctx.ptr_outputbuffer [i].bufferaddr = *bufferHdr;
else
+ drv_ctx.ptr_outputbuffer [i].bufferaddr = pmem_baseaddress;
+
+ drv_ctx.ptr_outputbuffer [i].pmem_fd = pmem_fd;
+ drv_ctx.ptr_outputbuffer [i].buffer_len = drv_ctx.op_buf.buffer_size;
+ drv_ctx.ptr_outputbuffer [i].mmaped_size = drv_ctx.op_buf.buffer_size;
+ drv_ctx.ptr_outputbuffer [i].offset = 0;
+
+#ifdef _ANDROID_
+ #ifdef USE_ION
+ m_heap_ptr[i].video_heap_ptr = new VideoHeap (drv_ctx.op_buf_ion_info[i].ion_device_fd,
+ drv_ctx.op_buf.buffer_size,
+ pmem_baseaddress,
+ ion_alloc_data.handle,
+ pmem_fd);
+ m_heap_count = m_heap_count + 1;
+#else
+ m_heap_ptr[i].video_heap_ptr = new VideoHeap (pmem_fd,
+ drv_ctx.op_buf.buffer_size,
+ pmem_baseaddress);
+#endif
+#endif
+
+ m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
+#ifdef _ANDROID_
+ m_pmem_info[i].pmem_fd = (OMX_U32) m_heap_ptr[i].video_heap_ptr.get ();
+#else
+ m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd ;
+#endif
+ setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+ memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer [i],
+ sizeof (vdec_bufferpayload));
+ ioctl_msg.in = &setbuffers;
+ ioctl_msg.out = NULL;
+
+ DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
+ if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
+ &ioctl_msg) < 0)
{
- DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
- eRet = OMX_ErrorInsufficientResources;
+ DEBUG_PRINT_ERROR("\n Set output buffer failed");
+ return OMX_ErrorInsufficientResources;
}
- }
+ // found an empty buffer at i
+ (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
+ (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
+ (*bufferHdr)->pAppPrivate = appData;
+ BITMASK_SET(&m_out_bm_count,i);
+
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR:Output Buffer Index not found");
+ eRet = OMX_ErrorInsufficientResources;
+ }
return eRet;
}
@@ -4121,7 +5127,6 @@ OMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hC
post_event(OMX_CommandPortEnable,
OMX_CORE_OUTPUT_PORT_INDEX,
OMX_COMPONENT_GENERATE_EVENT);
- m_event_port_settings_sent = false;
}
}
}
@@ -4169,7 +5174,7 @@ OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
OMX_ErrorPortUnpopulated,
OMX_COMPONENT_GENERATE_EVENT);
- return eRet;
+ return OMX_ErrorIncorrectStateOperation;
}
else if (m_state != OMX_StateInvalid)
{
@@ -4182,87 +5187,43 @@ OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
if(port == OMX_CORE_INPUT_PORT_INDEX)
{
/*Check if arbitrary bytes*/
- if (!arbitrary_bytes)
- {
- // check if the buffer is valid
+ if(!arbitrary_bytes && !input_use_buffer)
nPortIndex = buffer - m_inp_mem_ptr;
- }
else
- {
- nPortIndex = buffer - m_inp_heap_ptr;
- }
+ nPortIndex = buffer - m_inp_heap_ptr;
DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
- if(nPortIndex < m_inp_buf_count)
+ if(nPortIndex < drv_ctx.ip_buf.actualcount)
{
- // Clear the bit associated with it.
- BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
+ // 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 (arbitrary_bytes)
- {
- if (m_inp_heap_ptr[nPortIndex].pBuffer)
- {
- BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
- DEBUG_PRINT_LOW("\n Free Heap Buffer index %d",nPortIndex);
- free (m_inp_heap_ptr[nPortIndex].pBuffer);
- m_inp_heap_ptr[nPortIndex].pBuffer = NULL;
- }
- if (m_phdr_pmem_ptr[nPortIndex])
- {
- DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
+ 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);
- }
-
- m_inp_bPopulated = OMX_FALSE;
-
- /*Free the Buffer Header*/
+ 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");
- 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 (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_inp_mem_ptr)
- {
- DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
- free (m_inp_mem_ptr);
- m_inp_mem_ptr = NULL;
- }
-
- if (driver_context.ptr_inputbuffer)
- {
- DEBUG_PRINT_LOW("\n Free Driver Context pointer");
- free (driver_context.ptr_inputbuffer);
- driver_context.ptr_inputbuffer = NULL;
- }
+ free_input_buffer_header();
}
-
}
else
{
@@ -4284,7 +5245,7 @@ OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
{
// check if the buffer is valid
nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr;
- if(nPortIndex < m_out_buf_count)
+ 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.
@@ -4294,23 +5255,7 @@ OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
if (release_output_done())
{
- DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
- output_use_buffer = false;
- if (m_out_mem_ptr)
- {
- free (m_out_mem_ptr);
- m_out_mem_ptr = NULL;
- }
- if (driver_context.ptr_respbuffer)
- {
- free (driver_context.ptr_respbuffer);
- driver_context.ptr_respbuffer = NULL;
- }
- if (driver_context.ptr_outputbuffer)
- {
- free (driver_context.ptr_outputbuffer);
- driver_context.ptr_outputbuffer = NULL;
- }
+ free_output_buffer_header();
}
}
else
@@ -4319,12 +5264,20 @@ OMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
eRet = OMX_ErrorBadPortIndex;
}
if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
- && release_output_done() )
+ && 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);
+#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));
+ }
+#endif
+
post_event(OMX_CommandPortDisable,
OMX_CORE_OUTPUT_PORT_INDEX,
OMX_COMPONENT_GENERATE_EVENT);
@@ -4368,7 +5321,17 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
OMX_IN OMX_BUFFERHEADERTYPE* buffer)
{
OMX_ERRORTYPE ret1 = OMX_ErrorNone;
- unsigned int nBufferIndex = m_inp_buf_count;
+ 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(m_state == OMX_StateInvalid)
{
@@ -4382,22 +5345,67 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
return OMX_ErrorBadParameter;
}
+ 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 %d", 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 (perf_flag)
+ {
+ if (!latency)
+ {
+ dec_time.stop();
+ latency = dec_time.processing_time_us();
+ dec_time.start();
+ }
+ }
+#endif //_ANDROID_
+
if (arbitrary_bytes)
{
nBufferIndex = buffer - m_inp_heap_ptr;
}
else
{
- nBufferIndex = buffer - m_inp_mem_ptr;
+ 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 %d",
+ &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
+ }
+ else{
+ nBufferIndex = buffer - m_inp_mem_ptr;
+ }
}
- if (nBufferIndex > m_inp_buf_count )
+ if (nBufferIndex > drv_ctx.ip_buf.actualcount )
{
DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
return OMX_ErrorBadParameter;
}
- DEBUG_PRINT_LOW("\n ETB: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+ 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,
@@ -4405,6 +5413,8 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
}
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;
@@ -4436,6 +5446,9 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE h
struct vdec_ioctl_msg ioctl_msg;
struct vdec_seqheader seq_header;
bool port_setting_changed = true;
+#ifdef MAX_RES_1080P
+ bool not_coded_vop = false;
+#endif
/*Should we generate a Aync error event*/
if (buffer == NULL || buffer->pInputPortPrivate == NULL)
@@ -4446,7 +5459,7 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE h
nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
- if (nPortIndex > m_inp_buf_count)
+ if (nPortIndex > drv_ctx.ip_buf.actualcount)
{
DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
nPortIndex);
@@ -4455,23 +5468,50 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE h
pending_input_buffers++;
- if( input_flush_progress == true || m_ineos_reached == 1)
+ /* return zero length and not an EOS buffer */
+ if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
+ ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
{
- DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
+ DEBUG_PRINT_HIGH("\n return zero legth buffer");
post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
OMX_COMPONENT_GENERATE_EBD);
return OMX_ErrorNone;
}
- if(m_event_port_settings_sent && !arbitrary_bytes)
+#ifdef MAX_RES_1080P
+ 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 %d frame number %d",
+ 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;
+ }
+ }
+ }
+#endif
+ if(input_flush_progress == true
+#ifdef MAX_RES_1080P
+ || not_coded_vop
+#endif
+ )
{
- post_event((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
+ 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 - driver_context.ptr_inputbuffer) > m_inp_buf_count)
+ if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount)
{
return OMX_ErrorBadParameter;
}
@@ -4484,8 +5524,15 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE h
{
if (buffer->nFilledLen <= temp_buffer->buffer_len)
{
- memcpy (temp_buffer->bufferaddr,(buffer->pBuffer + buffer->nOffset),
- buffer->nFilledLen);
+ 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
{
@@ -4494,36 +5541,6 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE h
}
- if (!arbitrary_bytes && first_frame < 2 && codec_type_parse == CODEC_TYPE_MPEG4)
- {
-
- if (first_frame == 0)
- {
- first_buffer = (unsigned char *)malloc (m_inp_buf_size);
- DEBUG_PRINT_LOW("\n Copied the first buffer data size %d ",
- temp_buffer->buffer_len);
- first_frame = 1;
- memcpy (first_buffer,temp_buffer->bufferaddr,temp_buffer->buffer_len);
- first_frame_size = buffer->nFilledLen;
- buffer->nFilledLen = 0;
- post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
- OMX_COMPONENT_GENERATE_EBD);
- return OMX_ErrorNone;
- }
- else if (first_frame == 1)
- {
- first_frame = 2;
- DEBUG_PRINT_LOW("\n Second buffer copy the header size %d frame size %d",
- first_frame_size,temp_buffer->buffer_len);
- memcpy (&first_buffer [first_frame_size],temp_buffer->bufferaddr,
- temp_buffer->buffer_len);
- first_frame_size += temp_buffer->buffer_len;
- memcpy (temp_buffer->bufferaddr,first_buffer,first_frame_size);
- temp_buffer->buffer_len = first_frame_size;
- free (first_buffer);
- }
- }
-
frameinfo.bufferaddr = temp_buffer->bufferaddr;
frameinfo.client_data = (void *) buffer;
frameinfo.datalen = temp_buffer->buffer_len;
@@ -4532,75 +5549,94 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE h
frameinfo.pmem_fd = temp_buffer->pmem_fd;
frameinfo.pmem_offset = temp_buffer->offset;
frameinfo.timestamp = buffer->nTimeStamp;
-
-#if BITSTREAM_LOG
- int bytes_written;
- bytes_written = fwrite((const char *)temp_buffer->bufferaddr,
- temp_buffer->buffer_len,1,outputBufferFile1);
-
-#endif
-
- if(!set_seq_header_done)
- {
- set_seq_header_done = true;
- DEBUG_PRINT_HIGH("\n Set Sequence Header");
- seq_header.ptr_seqheader = frameinfo.bufferaddr;
- seq_header.seq_header_len = frameinfo.datalen;
- seq_header.pmem_fd = frameinfo.pmem_fd;
- seq_header.pmem_offset = frameinfo.pmem_offset;
- ioctl_msg.inputparam = &seq_header;
- ioctl_msg.outputparam = NULL;
- if (ioctl(driver_context.video_driver_fd,VDEC_IOCTL_SET_SEQUENCE_HEADER,
- &ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\n Set Sequence Header Failed");
- /*Generate an async error and move to invalid state*/
- return OMX_ErrorBadParameter;
- }
- if(omx_vdec_check_port_settings (&port_setting_changed) != OMX_ErrorNone)
+ 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)
{
- DEBUG_PRINT_ERROR("\n Check port setting failed");
- return OMX_ErrorBadParameter;
+ extract_demux_addr_offsets(buffer);
}
- if(port_setting_changed)
+ DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",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_HIGH("\n Port settings changed");
- m_event_port_settings_sent = true;
- m_cb.EventHandler(&m_cmp, m_app_data,OMX_EventPortSettingsChanged,
- OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
- DEBUG_PRINT_HIGH("\n EventHandler for Port Setting changed done");
- return OMX_ErrorNone;
+ DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+ m_timestamp_list.insert_ts(buffer->nTimeStamp);
}
- else
+ else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
{
- if(!register_output_buffers())
- {
- DEBUG_PRINT_ERROR("\n register output failed");
- return OMX_ErrorBadParameter;
- }
- DEBUG_PRINT_HIGH("\n Port settings Not changed");
+ DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
+ m_timestamp_list.insert_ts(buffer->nTimeStamp);
}
}
+#endif
- if (temp_buffer->buffer_len == 0 || (buffer->nFlags & 0x01))
+#ifdef INPUT_BUFFER_LOG
+ if (inputBufferFile1)
{
- DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
- frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
- m_ineos_reached = 1;
+ fwrite((const char *)temp_buffer->bufferaddr,
+ temp_buffer->buffer_len,1,inputBufferFile1);
}
+#endif
- sent_first_frame = true;
- DEBUG_PRINT_LOW("\n Decode Input Frame Size %d",frameinfo.datalen);
- ioctl_msg.inputparam = &frameinfo;
- ioctl_msg.outputparam = NULL;
+ if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
+ {
+ frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+ buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
+ }
- if (ioctl(driver_context.video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
+ 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;
+ }
+ DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
+ frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
+ ioctl_msg.in = &frameinfo;
+ ioctl_msg.out = NULL;
+ if (ioctl(drv_ctx.video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
&ioctl_msg) < 0)
{
/*Generate an async error and move to invalid state*/
+ DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy VDEC_IOCTL_DECODE_FRAME failed");
+ if (!arbitrary_bytes)
+ {
+ DEBUG_PRINT_LOW("\n Return failed buffer");
+ post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
+ OMX_COMPONENT_GENERATE_EBD);
+ }
return OMX_ErrorBadParameter;
- }
+ } else
+ time_stamp_dts.insert_timestamp(buffer);
return ret;
}
@@ -4630,12 +5666,24 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
return OMX_ErrorInvalidState;
}
- if (buffer == NULL || ((buffer - m_out_mem_ptr) > m_out_buf_size))
+ if (!m_out_bEnabled)
+ {
+ DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
+ return OMX_ErrorIncorrectStateOperation;
+ }
+
+ if (buffer == NULL || ((buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount))
{
return OMX_ErrorBadParameter;
}
- DEBUG_PRINT_LOW("\n FTB: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+ if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
+ {
+ DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %d", buffer->nOutputPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
+
+ DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
post_event((unsigned) hComp, (unsigned)buffer,OMX_COMPONENT_GENERATE_FTB);
return OMX_ErrorNone;
}
@@ -4666,19 +5714,17 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy(
struct vdec_output_frameinfo *ptr_respbuffer = NULL;
- if (bufferAdd == NULL || ((buffer - m_out_mem_ptr) > m_out_buf_count) )
- {
+ if (bufferAdd == NULL || ((buffer - m_out_mem_ptr) >
+ 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_event_port_settings_sent == true) || (m_out_bEnabled != OMX_TRUE)
- || output_flush_progress == true || m_outeos_reached == 1)
+ if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
{
- DEBUG_PRINT_LOW("\n Output Buffers return in EOS condition");
- buffer->nFlags |= m_outeos_reached;
+ DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
+ buffer->nFilledLen = 0;
m_cb.FillBufferDone (hComp,m_app_data,buffer);
return OMX_ErrorNone;
}
@@ -4691,37 +5737,57 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy(
if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
{
- return OMX_ErrorBadParameter;
+ 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;
- ioctl_msg.inputparam = &fillbuffer;
- ioctl_msg.outputparam = NULL;
- if (ioctl (driver_context.video_driver_fd,
+#ifdef _ANDROID_ICS_
+ 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)) {
+ DEBUG_PRINT_ERROR("Failed to acquire genlock");
+ buffer->nFilledLen = 0;
+ m_cb.FillBufferDone (hComp,m_app_data,buffer);
+ pending_output_buffers--;
+ return OMX_ErrorInsufficientResources;
+ } else {
+ native_buffer[buffer - m_out_mem_ptr].inuse = true;
+ }
+ }
+#endif
+
+ ioctl_msg.in = &fillbuffer;
+ ioctl_msg.out = NULL;
+ if (ioctl (drv_ctx.video_driver_fd,
VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\n Decoder frame failed");
+#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
m_cb.FillBufferDone (hComp,m_app_data,buffer);
+ pending_output_buffers--;
return OMX_ErrorBadParameter;
}
- if(gate_input_buffers)
- {
- gate_input_buffers = false;
- if(pdest_frame)
- {
- /*Push the frame to the Decoder*/
- if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
- {
- return OMX_ErrorBadParameter;
- }
- frame_count++;
- pdest_frame = NULL;
- }
- }
return OMX_ErrorNone;
}
@@ -4767,6 +5833,13 @@ RETURN VALUE
========================================================================== */
OMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
{
+#ifdef _ANDROID_
+ if(iDivXDrmDecrypt)
+ {
+ delete iDivXDrmDecrypt;
+ iDivXDrmDecrypt=NULL;
+ }
+#endif //_ANDROID_
int i = 0;
if (OMX_StateLoaded != m_state)
{
@@ -4783,48 +5856,51 @@ OMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
if(m_out_mem_ptr)
{
DEBUG_PRINT_LOW("Freeing the Output Memory\n");
- for (i=0; i<m_out_buf_count; i++ )
+ for (i=0; i < drv_ctx.op_buf.actualcount; i++ )
{
free_output_buffer (&m_out_mem_ptr[i]);
- }
- if (driver_context.ptr_outputbuffer)
+#ifdef _ANDROID_ICS_
+ if (m_enable_android_native_buffers)
{
- free (driver_context.ptr_outputbuffer);
- driver_context.ptr_outputbuffer = NULL;
+ 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;
+ }
}
-
- if (driver_context.ptr_respbuffer)
- {
- free (driver_context.ptr_respbuffer);
- driver_context.ptr_respbuffer = NULL;
+#endif
}
- free(m_out_mem_ptr);
- m_out_mem_ptr = NULL;
+#ifdef _ANDROID_ICS_
+ memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+#endif
}
/*Check if the input buffers have to be cleaned up*/
- if(m_inp_mem_ptr)
+ if(m_inp_mem_ptr || m_inp_heap_ptr)
{
DEBUG_PRINT_LOW("Freeing the Input Memory\n");
- for (i=0; i<m_inp_buf_count; i++ )
+ for (i=0; i<drv_ctx.ip_buf.actualcount; i++ )
{
- free_input_buffer (&m_inp_mem_ptr[i]);
- }
-
- if (driver_context.ptr_inputbuffer)
- {
- free (driver_context.ptr_inputbuffer);
- driver_context.ptr_inputbuffer = NULL;
+ if (m_inp_mem_ptr)
+ free_input_buffer (i,&m_inp_mem_ptr[i]);
+ else
+ free_input_buffer (i,NULL);
}
-
- free(m_inp_mem_ptr);
- m_inp_mem_ptr = NULL;
}
-
+ free_input_buffer_header();
+ free_output_buffer_header();
if(h264_scratch.pBuffer)
{
- free(h264_scratch.pBuffer);
- h264_scratch.pBuffer = NULL;
+ free(h264_scratch.pBuffer);
+ h264_scratch.pBuffer = NULL;
+ }
+
+ if (h264_parser)
+ {
+ delete h264_parser;
+ h264_parser = NULL;
}
if(m_platform_list)
@@ -4845,23 +5921,43 @@ OMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
m_ftb_q.m_read = m_ftb_q.m_write =0;
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();
+ }
+#endif
DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
- (void)ioctl(driver_context.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
+ (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
NULL);
DEBUG_PRINT_HIGH("\n Close the driver instance");
- close(driver_context.video_driver_fd);
-
-#if BITSTREAM_LOG
- fclose (outputBufferFile1);
-#endif
#ifdef _ANDROID_
- //for (i=0; i<m_out_buf_count; i++ )
- {
- // Clear the strong reference
- m_heap_ptr.clear();
- }
+ /* get strong count gets the refernce count of the pmem, the count will
+ * be incremented by our kernal driver and surface flinger, by the time
+ * we close the pmem, this cound needs to be zero, but there is no way
+ * for us to know when surface flinger reduces its cound, so we wait
+ * here in a infinite loop till the count is zero
+ */
+ if (m_heap_ptr)
+ {
+ for (int indx = 0; indx < drv_ctx.op_buf.actualcount; indx++)
+ m_heap_ptr[indx].video_heap_ptr = NULL;
+ free(m_heap_ptr);
+ m_heap_ptr = NULL;
+ m_heap_count = 0;
+ }
#endif // _ANDROID_
+ close(drv_ctx.video_driver_fd);
+#ifdef INPUT_BUFFER_LOG
+ fclose (inputBufferFile1);
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+ fclose (outputBufferFile1);
+#endif
+#ifdef OUTPUT_EXTRADATA_LOG
+ fclose (outputExtradataFile);
+#endif
DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
return OMX_ErrorNone;
}
@@ -4886,8 +5982,62 @@ OMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hCom
OMX_IN OMX_PTR appData,
OMX_IN void* eglImage)
{
- DEBUG_PRINT_ERROR("Error : use_EGL_image: Not Implemented \n");
- return OMX_ErrorNotImplemented;
+ 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;
+#else
+ 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 ");
+ }
+#ifdef USE_EGL_IMAGE_GPU
+ 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);
+#else //with OMX test app
+ struct temp_egl {
+ int pmem_fd;
+ int offset;
+ };
+ struct temp_egl *temp_egl_id = NULL;
+ void * pmemPtr = (void *) eglImage;
+ temp_egl_id = (struct temp_egl *)eglImage;
+ if (temp_egl_id != NULL)
+ {
+ fd = temp_egl_id->pmem_fd;
+ offset = temp_egl_id->offset;
+ }
+#endif
+ 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;
}
/* ======================================================================
@@ -4909,11 +6059,23 @@ OMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
{
OMX_ERRORTYPE eRet = OMX_ErrorNone;
- if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
+ 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;
+ }
+ }
+ if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE))
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -4921,11 +6083,11 @@ OMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
eRet = OMX_ErrorNoMore;
}
}
- else if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
+ else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -4934,11 +6096,17 @@ OMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
eRet = OMX_ErrorNoMore;
}
}
- else if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
+#ifdef MAX_RES_1080P
+ 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
+ else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE))
+#endif
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -4947,11 +6115,26 @@ OMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
eRet = OMX_ErrorNoMore;
}
}
- else if(!strncmp(driver_context.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE))
+ else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE))
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+ 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
@@ -5027,7 +6210,7 @@ bool omx_vdec::allocate_input_done(void)
}
if(m_inp_mem_ptr )
{
- for(;i<m_inp_buf_count;i++)
+ for(;i<drv_ctx.ip_buf.actualcount;i++)
{
if(BITMASK_ABSENT(&m_inp_bm_count,i))
{
@@ -5035,12 +6218,12 @@ bool omx_vdec::allocate_input_done(void)
}
}
}
- if(i==m_inp_buf_count)
+ if(i == drv_ctx.ip_buf.actualcount)
{
bRet = true;
- DEBUG_PRINT_HIGH("\n Allocate done for all i/p buffers");
+ DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
}
- if(i==m_inp_buf_count && m_inp_bEnabled)
+ if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
{
m_inp_bPopulated = OMX_TRUE;
}
@@ -5070,9 +6253,9 @@ bool omx_vdec::allocate_output_done(void)
return bRet;
}
- if(m_out_mem_ptr )
+ if (m_out_mem_ptr)
{
- for(;j<m_out_buf_count;j++)
+ for(;j < drv_ctx.op_buf.actualcount;j++)
{
if(BITMASK_ABSENT(&m_out_bm_count,j))
{
@@ -5081,16 +6264,14 @@ bool omx_vdec::allocate_output_done(void)
}
}
- if(j==m_out_buf_count)
+ if(j == drv_ctx.op_buf.actualcount)
{
bRet = true;
- DEBUG_PRINT_HIGH("\n Allocate done for all o/p buffers");
+ DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
+ if(m_out_bEnabled)
+ m_out_bPopulated = OMX_TRUE;
}
- if(j==m_out_buf_count && m_out_bEnabled)
- {
- m_out_bPopulated = OMX_TRUE;
- }
return bRet;
}
@@ -5145,14 +6326,14 @@ bool omx_vdec::release_output_done(void)
DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
if(m_out_mem_ptr)
{
- for(;j<m_out_buf_count;j++)
+ for(;j < drv_ctx.op_buf.actualcount ; j++)
{
if(BITMASK_PRESENT(&m_out_bm_count,j))
{
break;
}
}
- if(j==m_out_buf_count)
+ if(j == drv_ctx.op_buf.actualcount)
{
m_out_bm_count = 0;
bRet = true;
@@ -5187,14 +6368,14 @@ bool omx_vdec::release_input_done(void)
DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
if(m_inp_mem_ptr)
{
- for(;j<m_inp_buf_count;j++)
+ for(;j<drv_ctx.ip_buf.actualcount;j++)
{
if( BITMASK_PRESENT(&m_inp_bm_count,j))
{
break;
}
}
- if(j==m_inp_buf_count)
+ if(j==drv_ctx.ip_buf.actualcount)
{
bRet = true;
}
@@ -5206,181 +6387,170 @@ bool omx_vdec::release_input_done(void)
return bRet;
}
-/* ======================================================================
-FUNCTION
- omx_vdec::omx_vdec_check_port_settings
-
-DESCRIPTION
- Parse meta data to check the height and width param
- Check the level and profile
+OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE * buffer)
+{
+ OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
-PARAMETERS
- None.
+ 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;
+ }
-RETURN VALUE
- OMX_ErrorNone, if profile and level are supported
- OMX_ErrorUnsupportedSetting, if profile and level are not supported
-========================================================================== */
-OMX_ERRORTYPE omx_vdec::omx_vdec_check_port_settings(bool *port_setting_changed)
-{
- struct vdec_ioctl_msg ioctl_msg;
- unsigned int alignment = 0,buffer_size = 0;
- OMX_ERRORTYPE eRet = OMX_ErrorNone;
+#ifdef _ANDROID_
+ char value[PROPERTY_VALUE_MAX];
+ property_get("vidc.dec.debug.panframedata", value, NULL);
- *port_setting_changed = false;
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &driver_context.video_resoultion;
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_GET_PICRES,&ioctl_msg))
+ if (atoi(value))
+ {
+ if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
{
- DEBUG_PRINT_ERROR("\n Error in VDEC_IOCTL_GET_PICRES in port_setting");
- return OMX_ErrorHardware;
+ DEBUG_PRINT_HIGH("\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
+ DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
}
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &driver_context.output_buffer;
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
- &ioctl_msg))
+ if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
{
- DEBUG_PRINT_ERROR("\n Error in VDEC_IOCTL_GET_BUFFER_REQ in port_setting");
- return OMX_ErrorHardware;
+ DEBUG_PRINT_HIGH("\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
+ DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
+ DEBUG_PRINT_HIGH("***************************************************\n");
}
- DEBUG_PRINT_HIGH("\n Queried Dimensions H=%d W=%d Act H=%d W=%d",
- driver_context.video_resoultion.frame_height,
- driver_context.video_resoultion.frame_width,
- m_height,m_width);
- DEBUG_PRINT_HIGH("\n Queried Buffer ACnt=%d BSiz=%d Act Acnt=%d Bsiz=%d",
- driver_context.output_buffer.actualcount,
- driver_context.output_buffer.buffer_size,
- m_out_buf_count,m_out_buf_size);
-
- DEBUG_PRINT_HIGH("\n Queried stride cuur Str=%d cur scan=%d Act str=%d act scan =%d",
- driver_context.video_resoultion.stride,driver_context.video_resoultion.scan_lines,
- stride,scan_lines);
-
-
- if(driver_context.video_resoultion.frame_height != m_height ||
- driver_context.video_resoultion.frame_width != m_width ||
- driver_context.video_resoultion.scan_lines != scan_lines ||
- driver_context.video_resoultion.stride != stride ||
- driver_context.output_buffer.actualcount != m_out_buf_count ||
- driver_context.output_buffer.buffer_size > m_out_buf_size)
- {
- *port_setting_changed = true;
- ioctl_msg.inputparam = &driver_context.output_buffer;
- ioctl_msg.outputparam = NULL;
-
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_BUFFER_REQ,
- &ioctl_msg))
- {
- DEBUG_PRINT_ERROR("\n Error in VDEC_IOCTL_GET_BUFFER_REQ in port_setting");
- return OMX_ErrorHardware;
- }
- m_out_buf_size_recon = driver_context.output_buffer.buffer_size;
- m_out_buf_count_recon = driver_context.output_buffer.actualcount;
- m_out_buf_count_min_recon = driver_context.output_buffer.mincount;
-
- alignment = driver_context.output_buffer.alignment;
- buffer_size = driver_context.output_buffer.buffer_size;
- m_out_buf_size_recon =
- ((buffer_size + alignment - 1) & (~(alignment - 1)));
- m_crop_dy = m_height = driver_context.video_resoultion.frame_height;
- m_crop_dx = m_width = driver_context.video_resoultion.frame_width;
- scan_lines = driver_context.video_resoultion.scan_lines;
- stride = driver_context.video_resoultion.stride;
- m_port_height = m_height;
- m_port_width = m_width;
- }
-
- return eRet;
-}
-
-
-/* ======================================================================
-FUNCTION
- omx_vdec::omx_vdec_validate_port_param
-
-DESCRIPTION
- Get the PMEM area from video decoder
-
-PARAMETERS
- None.
-
-RETURN VALUE
- None
-========================================================================== */
-OMX_ERRORTYPE omx_vdec::omx_vdec_validate_port_param(int height, int width)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- long hxw = height*width;
- long lmt_hxw = 0;
-
- return ret;
-}
-
-static FILE * outputBufferFile = NULL;
-
-OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
- OMX_BUFFERHEADERTYPE * buffer)
-{
- OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
-
- if (buffer == NULL || ((buffer - m_out_mem_ptr) > m_out_buf_count))
- {
- return OMX_ErrorBadParameter;
}
+#endif
DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
buffer, buffer->pBuffer);
pending_output_buffers --;
- if (buffer->nFlags & 0x01)
+ if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
{
- DEBUG_PRINT_LOW("\n Output EOS has been reached");
+ DEBUG_PRINT_HIGH("\n Output EOS has been reached");
+ if (!output_flush_progress)
+ post_event(NULL,NULL,OMX_COMPONENT_GENERATE_EOS_DONE);
- m_outeos_reached = 0;
- m_ineos_reached = 0;
- 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();
- }
if (psource_frame)
{
- m_cb.EmptyBufferDone(&m_cmp ,m_app_data,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,NULL,NULL);
pdest_frame = NULL;
}
- m_frame_parser.flush();
}
DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
-
- if (outputBufferFile == NULL)
+#ifdef OUTPUT_BUFFER_LOG
+ if (outputBufferFile1)
{
- outputBufferFile = fopen ("/data/output.yuv","wb");
+ fwrite (buffer->pBuffer,1,buffer->nFilledLen,
+ outputBufferFile1);
}
- if (outputBufferFile)
+#endif
+
+ /* For use buffer we need to copy the data */
+ if (!output_flush_progress)
{
- /*fwrite (buffer->pBuffer,1,buffer->nFilledLen,
- outputBufferFile); */
+ time_stamp_dts.get_next_timestamp(buffer,
+ (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+ ?true:false);
}
- /* For use buffer we need to copy the data */
if (m_cb.FillBufferDone)
{
- pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
- ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
- buffer->pPlatformPrivate)->entryList->entry;
+ if (buffer->nFilledLen > 0)
+ {
+ if (client_extradata)
+ handle_extradata(buffer);
+ if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+ // Keep min timestamp interval to handle corrupted bit stream scenario
+ set_frame_rate(buffer->nTimeStamp);
+ else if (arbitrary_bytes)
+ adjust_timestamp(buffer->nTimeStamp);
+#ifdef _ANDROID_
+ 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;
+ }
+ }
+#endif //_ANDROID_
+
+#ifdef OUTPUT_EXTRADATA_LOG
+ 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);
+ }
+ }
+#endif
+ }
+ 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 %d",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;
+ }
+ }
+ }
+#endif
m_cb.FillBufferDone (hComp,m_app_data,buffer);
DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
}
@@ -5396,8 +6566,9 @@ OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp,
OMX_BUFFERHEADERTYPE* buffer)
{
- if (buffer == NULL || ((buffer - m_inp_mem_ptr) > m_inp_buf_count))
+ 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;
}
@@ -5412,6 +6583,7 @@ OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp,
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
@@ -5427,6 +6599,9 @@ OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp,
else if(m_cb.EmptyBufferDone)
{
buffer->nFilledLen = 0;
+ if (input_use_buffer == true){
+ buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
+ }
m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
}
return OMX_ErrorNone;
@@ -5448,6 +6623,26 @@ int omx_vdec::async_message_process (void *context, void* message)
vdec_msg = (struct vdec_msginfo *)message;
omx = reinterpret_cast<omx_vdec*>(context);
+
+#ifdef _ANDROID_
+ if (omx->m_debug_timestamp)
+ {
+ if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) &&
+ !(omx->output_flush_progress) )
+ {
+ OMX_TICKS expected_ts = 0;
+ omx->m_timestamp_list.pop_min_ts(expected_ts);
+ DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
+ vdec_msg->msgdata.output_frame.time_stamp, expected_ts);
+
+ if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts)
+ {
+ DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
+ }
+ }
+ }
+#endif
+
switch (vdec_msg->msgcode)
{
@@ -5492,7 +6687,7 @@ int omx_vdec::async_message_process (void *context, void* message)
if (omxhdr == NULL ||
- ((omxhdr - omx->m_inp_mem_ptr) > omx->m_inp_buf_count) )
+ ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) )
{
omxhdr = NULL;
vdec_msg->status_code = VDEC_S_EFATAL;
@@ -5501,73 +6696,108 @@ int omx_vdec::async_message_process (void *context, void* message)
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:
+ case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
omxhdr = (OMX_BUFFERHEADERTYPE*)vdec_msg->msgdata.output_frame.client_data;
- DEBUG_PRINT_LOW("\n Got Buffer back from Driver %p omxhdr time stamp = %d " ,omxhdr,vdec_msg->msgdata.output_frame.time_stamp);
+ 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 != NULL) &&
- ((omxhdr - omx->m_out_mem_ptr) < omx->m_out_buf_count) &&
- (omxhdr->pOutputPortPrivate != NULL) &&
- ( ((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
- - omx->driver_context.ptr_respbuffer) < omx->m_out_buf_count)
- )
+ /* update SYNCFRAME flag */
+ if (omx->eCompressionFormat == OMX_VIDEO_CodingAVC)
+ {
+ /* set SYNCFRAME flag if picture type is IDR for h264 */
+ if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_IDR)
+ vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
+ else
+ vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
+ }
+ else
+ {
+ /* set SYNCFRAME flag if picture type is I_TYPE */
+ if (vdec_msg->msgdata.output_frame.pic_type == PICTURE_TYPE_I)
+ vdec_msg->msgdata.output_frame.flags |= OMX_BUFFERFLAG_SYNCFRAME;
+ else
+ vdec_msg->msgdata.output_frame.flags &= ~OMX_BUFFERFLAG_SYNCFRAME;
+ }
+
+ 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 = (vdec_msg->msgdata.output_frame.flags & 0x01);
+ omxhdr->nFlags = (vdec_msg->msgdata.output_frame.flags);
output_respbuf = (struct vdec_output_frameinfo *)\
omxhdr->pOutputPortPrivate;
- output_respbuf->framesize.bottom = \
+ output_respbuf->framesize.bottom =
vdec_msg->msgdata.output_frame.framesize.bottom;
- output_respbuf->framesize.left = \
+ output_respbuf->framesize.left =
vdec_msg->msgdata.output_frame.framesize.left;
- output_respbuf->framesize.right = \
+ output_respbuf->framesize.right =
vdec_msg->msgdata.output_frame.framesize.right;
- output_respbuf->framesize.top = \
+ output_respbuf->framesize.top =
vdec_msg->msgdata.output_frame.framesize.top;
output_respbuf->len = vdec_msg->msgdata.output_frame.len;
output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp;
output_respbuf->flags = vdec_msg->msgdata.output_frame.flags;
+ output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type;
+ output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format;
+ output_respbuf->aspect_ratio_info =
+ vdec_msg->msgdata.output_frame.aspect_ratio_info;
+
- /*Use buffer case*/
if (omx->output_use_buffer)
- {
- if (vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen)
- {
- memcpy ( omxhdr->pBuffer,
- (vdec_msg->msgdata.output_frame.bufferaddr +
- vdec_msg->msgdata.output_frame.offset),
- vdec_msg->msgdata.output_frame.len );
- }
- else
- {
- omxhdr->nFilledLen = 0;
- }
- }
+ memcpy ( omxhdr->pBuffer,
+ (vdec_msg->msgdata.output_frame.bufferaddr +
+ 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 (NULL, vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_EOS_DONE);
else
- {
- omxhdr = NULL;
- vdec_msg->status_code = VDEC_S_EFATAL;
- }
-
- DEBUG_PRINT_LOW("\n Driver returned a output Buffer status %d",
- vdec_msg->status_code);
+ omx->post_event (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 ((unsigned int)omxhdr,vdec_msg->status_code,
- OMX_COMPONENT_GENERATE_FBD);
+ OMX_COMPONENT_GENERATE_PORT_RECONFIG);
break;
+ case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
+ {
+ DEBUG_PRINT_HIGH("\n Port settings changed info");
+ // get_buffer_req and populate port defn structure
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ omx->m_port_def.nPortIndex = 1;
+ eRet = omx->update_portdef(&(omx->m_port_def));
+ omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
+ break;
+ }
default:
break;
}
@@ -5590,9 +6820,12 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
- if( input_flush_progress == true || m_ineos_reached == 1)
+ /* 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_LOW("\n Flush in progress return buffer ");
+ DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
return OMX_ErrorNone;
}
@@ -5628,11 +6861,12 @@ OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
if (pdest_frame == NULL)
{
DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
- if (m_input_free_q.m_size && !gate_input_buffers)
+ 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);
}
}
@@ -5641,7 +6875,7 @@ OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
if (psource_frame == NULL)
{
DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
- if (m_input_pending_q.m_size && !gate_input_buffers)
+ if (m_input_pending_q.m_size)
{
m_input_pending_q.pop_entry(&address,&p2,&id);
psource_frame = (OMX_BUFFERHEADERTYPE *)address;
@@ -5655,12 +6889,13 @@ OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
}
- while ((pdest_frame != NULL) && (psource_frame != NULL)&& !gate_input_buffers)
+ 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:
@@ -5684,12 +6919,12 @@ OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
OMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
{
OMX_U32 partial_frame = 1;
- OMX_BOOL genarte_edb = OMX_TRUE,generate_eos = OMX_TRUE;
+ OMX_BOOL generate_ebd = OMX_TRUE;
unsigned address,p2,id;
DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
psource_frame,psource_frame->nTimeStamp);
- if (m_frame_parser.parse_mpeg4_frame(psource_frame,
+ if (m_frame_parser.parse_sc_frame(psource_frame,
pdest_frame,&partial_frame) == -1)
{
DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
@@ -5707,42 +6942,42 @@ OMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
if (frame_count == 0)
{
DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
- mp4h263_flags = psource_frame->nFlags;
- mp4h263_timestamp = psource_frame->nTimeStamp;
+#ifdef MAX_RES_1080P
+ 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);
+ }
+#endif
frame_count++;
}
else
{
- pdest_frame->nTimeStamp = mp4h263_timestamp;
- mp4h263_timestamp = psource_frame->nTimeStamp;
- pdest_frame->nFlags = mp4h263_flags;
- mp4h263_flags = psource_frame->nFlags;
-
- if(psource_frame->nFilledLen == 0)
+ pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
+ if(pdest_frame->nFilledLen)
{
- pdest_frame->nFlags = mp4h263_flags;
- generate_eos = OMX_FALSE;
- }
-
+ /*Push the frame to the Decoder*/
+ if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
+ {
+ return OMX_ErrorBadParameter;
+ }
+ frame_count++;
+ pdest_frame = NULL;
- /*Push the frame to the Decoder*/
- if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
- {
- return OMX_ErrorBadParameter;
+ 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;
+ }
}
- if(m_event_port_settings_sent)
+ else if(!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS))
{
- gate_input_buffers = true;
- return OMX_ErrorNone;
- }
- frame_count++;
- pdest_frame = NULL;
-
- if (m_input_free_q.m_size && !gate_input_buffers)
- {
- m_input_free_q.pop_entry(&address,&p2,&id);
- pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
- pdest_frame->nFilledLen = 0;
+ DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
+ m_input_free_q.insert_entry((unsigned) pdest_frame,NULL,NULL);
+ pdest_frame = NULL;
}
}
}
@@ -5760,12 +6995,11 @@ OMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
if (psource_frame->nFilledLen == 0)
{
- if ((psource_frame->nFlags & 0x01) && generate_eos)
+ if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
{
if (pdest_frame)
{
- pdest_frame->nTimeStamp = psource_frame->nTimeStamp;
- pdest_frame->nFlags = psource_frame->nFlags;
+ pdest_frame->nFlags |= psource_frame->nFlags;
DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
@@ -5781,10 +7015,10 @@ OMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
else
{
DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
- genarte_edb = OMX_FALSE;
+ generate_ebd = OMX_FALSE;
}
}
- if(genarte_edb)
+ 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);
@@ -5810,192 +7044,196 @@ OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
OMX_U32 partial_frame = 1;
unsigned address,p2,id;
OMX_BOOL isNewFrame = OMX_FALSE;
- OMX_BOOL genarte_edb = OMX_TRUE;
- OMX_BOOL skip_parsing = 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 Values of h264_scratch.nFilledLen %d look_ahead_nal %d",
- h264_scratch.nFilledLen,look_ahead_nal);
- DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
+ DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d "
+ "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
+ DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
if (h264_scratch.nFilledLen && look_ahead_nal)
{
look_ahead_nal = false;
- DEBUG_PRINT_LOW("\n Copy the previous NAL into Buffer %d ",
- h264_scratch.nFilledLen);
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 Total filled length %d",pdest_frame->nFilledLen);
+ DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
h264_scratch.nFilledLen = 0;
}
else
{
- DEBUG_PRINT_ERROR("\nERROR:Destination buffer overflow for H264");
+ DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
return OMX_ErrorBadParameter;
}
}
-
- if(psource_frame->nFlags & 0x01)
+ if (nal_length == 0)
{
- DEBUG_PRINT_LOW("\n EOS has been reached no parsing required");
- skip_parsing = OMX_TRUE;
- if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
- psource_frame->nFilledLen)
+ 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)
{
- memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
- (psource_frame->pBuffer+psource_frame->nOffset),
- psource_frame->nFilledLen);
- pdest_frame->nFilledLen += psource_frame->nFilledLen;
- DEBUG_PRINT_LOW("\n Total filled length %d",pdest_frame->nFilledLen);
- psource_frame->nFilledLen = 0;
+ DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
+ return OMX_ErrorBadParameter;
}
- else
+ }
+ 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("\nERROR:Destination buffer overflow for H264");
+ DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
return OMX_ErrorBadParameter;
}
}
- if(!skip_parsing)
+ if (partial_frame == 0)
{
- if (nal_length == 0)
+ if (nal_count == 0 && h264_scratch.nFilledLen == 0)
{
- DEBUG_PRINT_LOW("\n NAL length Zero hence parse using start code");
- if (m_frame_parser.parse_mpeg4_frame(psource_frame,
- &h264_scratch,&partial_frame) == -1)
- {
- DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
- return OMX_ErrorBadParameter;
- }
+ 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 NAL length %d hence parse with NAL length %d",nal_length);
- if (m_frame_parser.parse_h264_nallength(psource_frame,
- &h264_scratch,&partial_frame) == -1)
+ DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
+ if(h264_scratch.nFilledLen)
{
- DEBUG_PRINT_ERROR("\n Error In Parsing NAL Return Error");
- return OMX_ErrorBadParameter;
+ 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 (partial_frame == 0)
- {
-
- if (nal_count == 0 && h264_scratch.nFilledLen == 0)
+ if (!isNewFrame)
{
- 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;
+ if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
+ h264_scratch.nFilledLen)
+ {
+ DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
+ 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
{
- DEBUG_PRINT_LOW("\n Length of New NAL is %d",h264_scratch.nFilledLen);
-
- m_frame_parser.mutils->isNewFrame(h264_scratch.pBuffer,
- h264_scratch.nFilledLen,0,isNewFrame);
- nal_count++;
+ look_ahead_nal = true;
+ DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
+ pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
+ pdest_frame->nFilledLen,frame_count++);
- if (!isNewFrame)
+ 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)
+ h264_scratch.nFilledLen)
{
- DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
- h264_scratch.nFilledLen);
memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
- h264_scratch.pBuffer,h264_scratch.nFilledLen);
+ h264_scratch.pBuffer,h264_scratch.nFilledLen);
pdest_frame->nFilledLen += h264_scratch.nFilledLen;
h264_scratch.nFilledLen = 0;
}
else
{
- DEBUG_PRINT_LOW("\n Destination buffer overflow for H264");
+ DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
return OMX_ErrorBadParameter;
}
}
else
{
- look_ahead_nal = true;
- pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
- pdest_frame->nFlags = h264_scratch.nFlags;
- h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
- h264_scratch.nFlags = psource_frame->nFlags;
-
- DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
- pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
- DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
- pdest_frame->nFilledLen,frame_count++);
-
- if (pdest_frame->nFilledLen == 0)
+ if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
{
- 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("\nERROR:Destination buffer overflow for H264");
- return OMX_ErrorBadParameter;
- }
+ DEBUG_PRINT_LOW("\n Reset the EOS Flag");
+ pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
}
- else
+ /*Push the frame to the Decoder*/
+ if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
{
- /*Push the frame to the Decoder*/
- if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
- {
- return OMX_ErrorBadParameter;
- }
- if(m_event_port_settings_sent)
- {
- gate_input_buffers = true;
- return OMX_ErrorNone;
- }
- //frame_count++;
- pdest_frame = NULL;
- if (m_input_free_q.m_size && !gate_input_buffers)
- {
- 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;
- }
+ 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
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
+ /*Check if Destination Buffer is full*/
+ if (h264_scratch.nAllocLen ==
+ h264_scratch.nFilledLen + h264_scratch.nOffset)
{
- DEBUG_PRINT_LOW("\n Not a Complete Frame %d",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;
- }
+ DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
+ return OMX_ErrorStreamCorrupt;
}
}
- if (psource_frame->nFilledLen == 0)
+ if (!psource_frame->nFilledLen)
{
- DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
+ DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
- if (psource_frame->nFlags & 0x01)
+ if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
{
if (pdest_frame)
{
@@ -6010,26 +7248,35 @@ OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
}
else
{
- DEBUG_PRINT_ERROR("\nERROR:Destination buffer overflow for H264");
+ DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
return OMX_ErrorBadParameter;
}
- pdest_frame->nTimeStamp = psource_frame->nTimeStamp;
- pdest_frame->nFlags = psource_frame->nFlags;
-
- DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
- pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
- DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
- pdest_frame->nFilledLen,frame_count++);
+ pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
+ pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
+#ifdef MAX_RES_720P
+ if (frame_count == 0)
+ {
+ DEBUG_PRINT_HIGH("No frames sent to driver yet, "
+ "So send zero length EOS buffer");
+ pdest_frame->nFilledLen = 0;
+ }
+#endif
+ DEBUG_PRINT_LOW("pdest_frame->nFilledLen = %d, nFlags = 0x%x, TimeStamp = %x",
+ pdest_frame->nFilledLen, pdest_frame->nFlags, 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;
}
- if(m_event_port_settings_sent)
- {
- gate_input_buffers = true;
- return OMX_ErrorNone;
- }
frame_count++;
pdest_frame = NULL;
}
@@ -6037,22 +7284,22 @@ OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
{
DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
pdest_frame,h264_scratch.nFilledLen);
- genarte_edb = OMX_FALSE;
+ generate_ebd = OMX_FALSE;
}
}
- if(genarte_edb)
+ }
+ 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)
{
- m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
- psource_frame = NULL;
- if (m_input_pending_q.m_size && !gate_input_buffers)
- {
- 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 %d length %d",
- psource_frame->nFlags,psource_frame->nFilledLen);
- }
- }
+ 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 %d src length %d",
+ psource_frame->nFlags,psource_frame->nFilledLen);
+ }
}
return OMX_ErrorNone;
}
@@ -6063,8 +7310,9 @@ OMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
OMX_U32 partial_frame = 1;
OMX_U32 buf_len, dest_len;
- if(frame_count == 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)
{
@@ -6126,78 +7374,1426 @@ OMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
return OMX_ErrorNone;
}
-bool omx_vdec::register_output_buffers()
+#ifndef USE_ION
+bool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
+ OMX_U32 alignment)
{
- struct vdec_ioctl_msg ioctl_msg;
- struct vdec_setbuffer_cmd setbuffers;
- int i = 0;
- unsigned p1 =0,p2 = 0,ident = 0;
+ 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
- for(i=0;i<m_out_buf_count;i++)
+#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)
+{
+ 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;
+ }
+ if(!secure_mode && flag == CACHED)
+ {
+ ion_dev_flag = O_RDONLY;
+ } else {
+ ion_dev_flag = (O_RDONLY); /*| O_DSYNC); */ //BIG TBD
+ }
+ 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->len = buffer_size;
+ alloc_data->align = clip2(alignment);
+ if (alloc_data->align < 4096)
+ {
+ alloc_data->align = 4096;
+ }
+ if(secure_mode) {
+ alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) | ION_SECURE);
+ } else {
+ alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) | ION_HEAP(ION_IOMMU_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;
+}
+
+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;
+}
+#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;
+
+ if (m_out_mem_ptr)
{
- setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- memcpy (&setbuffers.buffer,&driver_context.ptr_outputbuffer [i],
- sizeof (vdec_bufferpayload));
- ioctl_msg.inputparam = &setbuffers;
- ioctl_msg.outputparam = NULL;
+ free (m_out_mem_ptr);
+ m_out_mem_ptr = NULL;
+ }
- DEBUG_PRINT_LOW("\n Set the Output Buffer");
- if (ioctl (driver_context.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
- &ioctl_msg) < 0)
+ 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;
+ }
+#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
+}
+
+void omx_vdec::free_input_buffer_header()
+{
+ input_use_buffer = false;
+ if (arbitrary_bytes)
{
- DEBUG_PRINT_ERROR("\n Set output buffer failed");
- return false;
+ 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_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 (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);
+ drv_ctx.ip_buf_ion_info = NULL;
+ }
+#endif
+}
+
+OMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
+{
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ unsigned int buf_size = 0, extra_data_size = 0;
+ DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
+ buffer_prop->actualcount, buffer_prop->buffer_size);
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = buffer_prop;
+ if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_GET_BUFFER_REQ,
+ (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
+ eRet = OMX_ErrorInsufficientResources;
}
- if(gate_output_buffers)
+ else
{
- /*Generate FBD for all Buffers in the FTBq*/
- pthread_mutex_lock(&m_lock);
- DEBUG_PRINT_LOW("\n Initiate Pushing Output Buffers");
- while (m_ftb_q.m_size)
+ buf_size = buffer_prop->buffer_size;
+ if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+ {
+ DEBUG_PRINT_HIGH("Frame info extra data enabled!");
+ extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+ }
+ if (client_extradata & OMX_INTERLACE_EXTRADATA)
+ {
+ DEBUG_PRINT_HIGH("Interlace extra data enabled!");
+ extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
+ }
+ if (client_extradata & OMX_PORTDEF_EXTRADATA)
{
- m_ftb_q.pop_entry(&p1,&p2,&ident);
- if(ident == OMX_COMPONENT_GENERATE_FTB )
+ extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
+ DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
+ extra_data_size);
+ }
+ if (extra_data_size)
+ {
+ extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
+ buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
+ }
+ buf_size += 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;
+}
+
+OMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
+{
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ unsigned buf_size = 0;
+ 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
+ {
+ ioctl_msg.in = buffer_prop;
+ ioctl_msg.out = NULL;
+ if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_BUFFER_REQ,
+ (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("Setting buffer requirements failed");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE omx_vdec::start_port_reconfig()
+{
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ eRet = update_picture_resolution();
+ if (eRet == OMX_ErrorNone)
+ {
+ ioctl_msg.out = &drv_ctx.interlace;
+ if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_INTERLACE_FORMAT, &ioctl_msg))
+ {
+ DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_INTERLACE_FORMAT");
+ eRet = OMX_ErrorHardware;
+ }
+ else
+ {
+ if (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
{
- if (fill_this_buffer_proxy ((OMX_HANDLETYPE)p1,
- (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
- omx_report_error ();
- return false;
- }
+ DEBUG_PRINT_HIGH("Interlace format detected (%x)!", drv_ctx.interlace);
+ if(!secure_mode)
+ client_extradata |= OMX_INTERLACE_EXTRADATA;
+ else {
+ DEBUG_PRINT_ERROR("secure mode interlaced format not supported");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
}
- else if (ident == OMX_COMPONENT_GENERATE_FBD)
+ in_reconfig = true;
+ op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+ eRet = get_buffer_req(&op_buf_rcnfg);
+ }
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE omx_vdec::update_picture_resolution()
+{
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = &drv_ctx.video_resolution;
+ if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg))
+ {
+ DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
+ eRet = OMX_ErrorHardware;
+ }
+ 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)
+ {
+ portDefn->eDir = OMX_DirOutput;
+ if (update_picture_resolution() != OMX_ErrorNone)
+ {
+ ALOGE(" update_picture_resolution failed \n");
+ return OMX_ErrorHardware;
+ }
+ if (in_reconfig)
+ {
+ portDefn->nBufferCountActual = op_buf_rcnfg.actualcount;
+ portDefn->nBufferCountMin = op_buf_rcnfg.mincount;
+ portDefn->nBufferSize = op_buf_rcnfg.buffer_size;
+ }
+ else
+ {
+ portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
+ portDefn->nBufferCountMin = drv_ctx.op_buf.mincount;
+ portDefn->nBufferSize = drv_ctx.op_buf.buffer_size;
+ }
+ portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+ portDefn->bEnabled = m_out_bEnabled;
+ portDefn->bPopulated = m_out_bPopulated;
+ if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
+ portDefn->format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+ else if (drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
+ portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: Color format unknown: %x\n", drv_ctx.output_format);
+ }
+ }
+ 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_LOW("update_portdef Width = %d Height = %d Stride = %u"
+ "SliceHeight = %u \n", portDefn->format.video.nFrameHeight,
+ portDefn->format.video.nFrameWidth,
+ 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;
+
+ 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);
+
+ 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);
+#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)
+ {
+ 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++)
{
- fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+ 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;
+#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%x][0x%x]\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;
}
- gate_output_buffers = false;
- pthread_mutex_unlock(&m_lock);
+#endif
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ } else {
+ eRet = OMX_ErrorInsufficientResources;
}
- return true;
+ return eRet;
}
-bool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
- OMX_U32 alignment)
+void omx_vdec::complete_pending_buffer_done_cbs()
{
-//TODO: figure out if this is really necessary (PMEM_ALLOCATE_ALIGNED is a
-// QCOM extension to pmem
- return true;
-#if 0
+ 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 ();
+ }
+ 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 ();
+ }
+ break;
+ }
+ }
+}
+
+void omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
+{
+ OMX_U32 new_frame_interval = 0;
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
+ && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
+ {
+ new_frame_interval = (act_timestamp > prev_ts)?
+ act_timestamp - prev_ts :
+ prev_ts - act_timestamp;
+ 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(%u) fps(%f)",
+ frm_int, drv_ctx.frame_rate.fps_numerator /
+ (float)drv_ctx.frame_rate.fps_denominator);
+ ioctl_msg.in = &drv_ctx.frame_rate;
+ if (ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
+ (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("Setting frame rate failed");
+ }
+ }
+ }
+ }
+ 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;
+ }
+ 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_S64 ts_in_sei = 0;
+ OMX_U32 frame_rate = 0;
+
+ p_extra = (OMX_OTHER_EXTRADATATYPE *)
+ ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset +
+ p_buf_hdr->nFilledLen + 3)&(~3));
+ if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ p_extra = NULL;
+ if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA))
+ {
+ // Process driver extradata
+ while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE)
+ {
+ DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
+ p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
+ if (p_extra->nSize < p_extra->nDataSize)
+ {
+ DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
+ p_extra->nSize, p_extra->nDataSize);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) ||
+ p_extra->nDataSize == 0 || p_extra->nSize == 0)
+ p_extra = NULL;
+ continue;
+ }
+ if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP)
+ {
+ if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+ num_conceal_MB = count_MB_in_extradata(p_extra);
+ if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
+ // Map driver extradata to corresponding OMX type
+ p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
+ else
+ p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+#ifdef _ANDROID_
+ if (m_debug_concealedmb) {
+ DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
+ }
+#endif /* _ANDROID_ */
+ }
+ else if (p_extra->eType == VDEC_EXTRADATA_SEI)
+ {
+ p_sei = p_extra;
+#ifdef MAX_RES_1080P
+ h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+#endif
+ p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+ }
+ else if (p_extra->eType == VDEC_EXTRADATA_VUI)
+ {
+ p_vui = p_extra;
+#ifdef MAX_RES_1080P
+ h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
+#endif
+ p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+ }
+ print_debug_extradata(p_extra);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) ||
+ p_extra->nDataSize == 0 || p_extra->nSize == 0)
+ p_extra = NULL;
+ }
+ if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP))
+ {
+ // Driver extradata is only exposed if MB map is requested by client,
+ // otherwise can be overwritten by omx extradata.
+ p_extra = (OMX_OTHER_EXTRADATATYPE *)
+ ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset +
+ p_buf_hdr->nFilledLen + 3)&(~3));
+ p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+ }
+ }
+
+#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
+ {
+ if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+ {
+ if (p_vui)
+ h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
+ if (p_sei)
+ h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+ ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
+ if (!VALID_TS(p_buf_hdr->nTimeStamp))
+ p_buf_hdr->nTimeStamp = ts_in_sei;
+ }
+ else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
+ // If timeinfo is present frame info from SEI is already processed
+ h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+ }
+#endif
+ if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
+ ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
+ (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ {
+ p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+ append_interlace_extradata(p_extra,
+ ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ }
+ if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
+ ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
+ (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ {
+ p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+ /* vui extra data (frame_rate) information */
+ if (h264_parser)
+ h264_parser->get_frame_rate(&frame_rate);
+ append_frame_info_extradata(p_extra, num_conceal_MB,
+ ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
+ p_buf_hdr->nTimeStamp, frame_rate,
+ &((struct vdec_output_frameinfo *)
+ p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ }
+ if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
+ p_extra != NULL &&
+ ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
+ (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ {
+ p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+ append_portdef_extradata(p_extra);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ }
+ if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
+ if (p_extra &&
+ ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
+ (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ append_terminator_extradata(p_extra);
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
+ p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+ }
+}
+
+OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_U32 driver_extradata = 0, extradata_size = 0;
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ if(m_state != OMX_StateLoaded)
+ {
+ DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
+ return OMX_ErrorIncorrectStateOperation;
+ }
+ if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
+ extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+ if (requested_extradata & OMX_INTERLACE_EXTRADATA)
+ extradata_size += OMX_INTERLACE_EXTRADATA_SIZE;
+ if (requested_extradata & OMX_PORTDEF_EXTRADATA)
+ {
+ extradata_size += OMX_PORTDEF_EXTRADATA_SIZE;
+ }
+ DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
+ client_extradata, requested_extradata, enable);
+
+ if (enable)
+ requested_extradata |= client_extradata;
+ else
+ {
+ requested_extradata = client_extradata & ~requested_extradata;
+ extradata_size *= -1;
+ }
+
+ driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK;
+ if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
+ driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info
+#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
+ {
+ driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)?
+ VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info
+ driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)?
+ VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info
+ }
+
+#endif
+ if (driver_extradata != drv_ctx.extradata)
+ {
+ client_extradata = requested_extradata;
+ drv_ctx.extradata = driver_extradata;
+ ioctl_msg.in = &drv_ctx.extradata;
+ ioctl_msg.out = NULL;
+ if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA,
+ (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("\nSet extradata failed");
+ ret = OMX_ErrorUnsupportedSetting;
+ }
+ else
+ ret = get_buffer_req(&drv_ctx.op_buf);
+ }
+ else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK))
+ {
+ client_extradata = requested_extradata;
+ drv_ctx.op_buf.buffer_size += extradata_size;
+ // align the buffer size
+ drv_ctx.op_buf.buffer_size = (drv_ctx.op_buf.buffer_size + drv_ctx.op_buf.alignment - 1)&(~(drv_ctx.op_buf.alignment - 1));
+ DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d\n", drv_ctx.op_buf.buffer_size);
+ if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator
+ drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE);
+ ret = set_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;
+ }
+ 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);
+}
+
+void omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
+{
+#ifdef _ANDROID_
+ if (!m_debug_extradata)
+ return;
+
+ DEBUG_PRINT_HIGH(
+ "============== Extra Data ==============\n"
+ " Size: %u \n"
+ " Version: %u \n"
+ " PortIndex: %u \n"
+ " Type: %x \n"
+ " DataSize: %u \n",
+ extra->nSize, extra->nVersion.nVersion,
+ extra->nPortIndex, extra->eType, extra->nDataSize);
+
+ if (extra->eType == OMX_ExtraDataInterlaceFormat)
+ {
+ OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+ DEBUG_PRINT_HIGH(
+ "------ Interlace Format ------\n"
+ " Size: %u \n"
+ " Version: %u \n"
+ " PortIndex: %u \n"
+ " Is Interlace Format: %u \n"
+ " Interlace Formats: %u \n"
+ "=========== End of Interlace ===========\n",
+ intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
+ intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
+ }
+ else if (extra->eType == OMX_ExtraDataFrameInfo)
+ {
+ OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+
+ DEBUG_PRINT_HIGH(
+ "-------- Frame Format --------\n"
+ " Picture Type: %u \n"
+ " Interlace Type: %u \n"
+ " Pan Scan Total Frame Num: %u \n"
+ " Concealed Macro Blocks: %u \n"
+ " frame rate: %u \n"
+ " Aspect Ratio X: %u \n"
+ " Aspect Ratio Y: %u \n",
+ fminfo->ePicType,
+ fminfo->interlaceType,
+ fminfo->panScan.numWindows,
+ fminfo->nConcealedMacroblocks,
+ fminfo->nFrameRate,
+ fminfo->aspectRatio.aspectRatioX,
+ fminfo->aspectRatio.aspectRatioY);
+
+ for (int i = 0; i < fminfo->panScan.numWindows; i++)
+ {
+ DEBUG_PRINT_HIGH(
+ "------------------------------\n"
+ " Pan Scan Frame Num: %d \n"
+ " Rectangle x: %d \n"
+ " Rectangle y: %d \n"
+ " Rectangle dx: %d \n"
+ " Rectangle dy: %d \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 ========");
+ }
+#endif /* _ANDROID_ */
+}
+
+void omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+ OMX_U32 interlaced_format_type)
+{
+ OMX_STREAMINTERLACEFORMAT *interlace_format;
+ OMX_U32 mbaff = 0;
+ 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 == VDEC_InterlaceFrameProgressive) && !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::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+ OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp,
+ OMX_U32 frame_rate, struct vdec_aspectratioinfo *aspect_ratio_info)
+{
+ OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
+ 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->panScan,0,sizeof(frame_info->panScan));
+ memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
+ {
+ h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp);
+ }
+
+ fill_aspect_ratio_info(aspect_ratio_info, frame_info);
+ frame_info->nConcealedMacroblocks = num_conceal_mb;
+ frame_info->nFrameRate = frame_rate;
+ print_debug_extradata(extra);
+}
+
+void omx_vdec::fill_aspect_ratio_info(
+ struct vdec_aspectratioinfo *aspect_ratio_info,
+ OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
+{
+ m_extradata = frame_info;
+
+ m_extradata->aspectRatio.aspectRatioX = 0;
+ m_extradata->aspectRatio.aspectRatioY = 0;
+
+ if(drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
+ {
+ h264_parser->fill_aspect_ratio_info(&m_extradata->aspectRatio);
+ }
+#ifdef MAX_RES_1080P
+ else if(drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG4 ||
+ drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_3 ||
+ drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4 ||
+ drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5 ||
+ drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_6)
+ {
+ mp4_fill_aspect_ratio_info(aspect_ratio_info,m_extradata);
+ }
+#endif
+ if(m_extradata->aspectRatio.aspectRatioX == 0 ||
+ m_extradata->aspectRatio.aspectRatioY == 0) {
+ m_extradata->aspectRatio.aspectRatioX = 1;
+ m_extradata->aspectRatio.aspectRatioY = 1;
+ }
+}
+
+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 = %u width = %u stride = %u"
+ "sliceheight = %u \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)
+{
+ 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);
+}
+
+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;
+ }
+ }
+
+ 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;
+}
+
+void omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
+{
+ DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", 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;
+
+ 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;
+ }
+ else
+ index++;
+ }
+ DEBUG_PRINT_LOW("Extracted (%d) 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;
+
+ 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 (%d)", 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%x),nal_size(%d),demux_index(%d)",
+ 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=%d", 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;
+}
+
+#ifdef MAX_RES_1080P
+OMX_ERRORTYPE omx_vdec::vdec_alloc_h264_mv()
+{
+ OMX_U32 pmem_fd = -1;
+ OMX_U32 width, height, size, alignment;
+ void *buf_addr = NULL;
+ struct vdec_ioctl_msg ioctl_msg;
+#ifndef USE_ION
struct pmem_allocation allocation;
- allocation.size = buffer_size;
- allocation.align = clip2(alignment);
- if (allocation.align < 4096)
+#endif
+ struct vdec_h264_mv h264_mv;
+ struct vdec_mv_buff_size mv_buff_size;
+
+ mv_buff_size.width = drv_ctx.video_resolution.stride;
+ mv_buff_size.height = drv_ctx.video_resolution.scan_lines>>2;
+
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&mv_buff_size;
+
+ if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_GET_MV_BUFFER_SIZE, (void*)&ioctl_msg) < 0)
{
- allocation.align = 4096;
+ DEBUG_PRINT_ERROR("\n GET_MV_BUFFER_SIZE Failed for width: %d, Height %d" ,
+ mv_buff_size.width, mv_buff_size.height);
+ return OMX_ErrorInsufficientResources;
}
+
+ DEBUG_PRINT_ERROR("GET_MV_BUFFER_SIZE returned: Size: %d and alignment: %d",
+ mv_buff_size.size, mv_buff_size.alignment);
+
+ size = mv_buff_size.size * drv_ctx.op_buf.actualcount;
+ alignment = mv_buff_size.alignment;
+
+ DEBUG_PRINT_LOW("Entered vdec_alloc_h264_mv act_width: %d, act_height: %d, size: %d, alignment %d\n",
+ drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height,size,alignment);
+
+
+#ifdef USE_ION
+ drv_ctx.h264_mv.ion_device_fd = alloc_map_ion_memory(
+ size, 8192,
+ &drv_ctx.h264_mv.ion_alloc_data,
+ &drv_ctx.h264_mv.fd_ion_data,CACHED);
+ if (drv_ctx.h264_mv.ion_device_fd < 0) {
+ return OMX_ErrorInsufficientResources;
+ }
+ pmem_fd = drv_ctx.h264_mv.fd_ion_data.fd;
+#else
+ allocation.size = size;
+ allocation.align = clip2(alignment);
+ if (allocation.align != 8192)
+ allocation.align = 8192;
+
+ pmem_fd = open(MEM_DEVICE, O_RDWR);
+
+ if ((int)(pmem_fd) < 0)
+ return OMX_ErrorInsufficientResources;
+
if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
{
- DEBUG_PRINT_ERROR("\n Aligment failed with pmem driver");
- return false;
+ DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
+ allocation.align, allocation.size);
+ return OMX_ErrorInsufficientResources;
}
- return true;
#endif
+ if(!secure_mode) {
+ buf_addr = mmap(NULL, size,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED, pmem_fd, 0);
+
+ if (buf_addr == (void*) MAP_FAILED)
+ {
+ close(pmem_fd);
+#ifdef USE_ION
+ free_ion_memory(&drv_ctx.h264_mv);
+#endif
+ pmem_fd = -1;
+ DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
+ return OMX_ErrorInsufficientResources;
+ }
+ } else
+ buf_addr =(unsigned char *) (pmem_fd + 1234);
+ DEBUG_PRINT_LOW("\n Allocated virt:%p, FD: %d of size %d count: %d \n", buf_addr,
+ pmem_fd, size, drv_ctx.op_buf.actualcount);
+
+ h264_mv.size = size;
+ h264_mv.count = drv_ctx.op_buf.actualcount;
+ h264_mv.pmem_fd = pmem_fd;
+ h264_mv.offset = 0;
+
+ ioctl_msg.in = (void*)&h264_mv;
+ ioctl_msg.out = NULL;
+
+ if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_H264_MV_BUFFER, (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("Failed to set the H264_mv_buffers\n");
+ return OMX_ErrorInsufficientResources;
+ }
+
+ h264_mv_buff.buffer = (unsigned char *) buf_addr;
+ h264_mv_buff.size = size;
+ h264_mv_buff.count = drv_ctx.op_buf.actualcount;
+ h264_mv_buff.offset = 0;
+ h264_mv_buff.pmem_fd = pmem_fd;
+ DEBUG_PRINT_LOW("\n Saving virt:%p, FD: %d of size %d count: %d \n", h264_mv_buff.buffer,
+ h264_mv_buff.pmem_fd, h264_mv_buff.size, drv_ctx.op_buf.actualcount);
+ return OMX_ErrorNone;
+}
+
+void omx_vdec::vdec_dealloc_h264_mv()
+{
+ if(h264_mv_buff.pmem_fd > 0)
+ {
+ if(ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_H264_MV_BUFFER,NULL) < 0)
+ DEBUG_PRINT_ERROR("VDEC_IOCTL_FREE_H264_MV_BUFFER failed");
+ if(!secure_mode)
+ munmap(h264_mv_buff.buffer, h264_mv_buff.size);
+ close(h264_mv_buff.pmem_fd);
+#ifdef USE_ION
+ free_ion_memory(&drv_ctx.h264_mv);
+#endif
+ DEBUG_PRINT_LOW("\n Cleaning H264_MV buffer of size %d \n",h264_mv_buff.size);
+ h264_mv_buff.pmem_fd = -1;
+ h264_mv_buff.offset = 0;
+ h264_mv_buff.size = 0;
+ h264_mv_buff.count = 0;
+ h264_mv_buff.buffer = NULL;
+ }
+}
+
+#endif
+
+#ifdef _ANDROID_
+OMX_ERRORTYPE omx_vdec::createDivxDrmContext()
+{
+ 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;
}
+#endif //_ANDROID_
diff --git a/mm-video/vidc/vdec/src/omx_vdec_copper.cpp b/mm-video/vidc/vdec/src/omx_vdec_copper.cpp
new file mode 100755
index 00000000..f28c3cf8
--- /dev/null
+++ b/mm-video/vidc/vdec/src/omx_vdec_copper.cpp
@@ -0,0 +1,8438 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+*//** @file omx_vdec.cpp
+ This module contains the implementation of the OpenMAX core & component.
+
+*//*========================================================================*/
+
+//////////////////////////////////////////////////////////////////////////////
+// Include Files
+//////////////////////////////////////////////////////////////////////////////
+
+#include <string.h>
+#include <pthread.h>
+#include <sys/prctl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include "omx_vdec.h"
+#include <fcntl.h>
+#include <limits.h>
+
+#ifndef _ANDROID_
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#endif //_ANDROID_
+
+#ifdef _ANDROID_
+#include <cutils/properties.h>
+#undef USE_EGL_IMAGE_GPU
+#endif
+
+#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
+#include <gralloc_priv.h>
+#endif
+
+#if defined (_ANDROID_ICS_)
+#include <genlock.h>
+#endif
+
+#ifdef _ANDROID_
+#include "DivXDrmDecrypt.h"
+#endif //_ANDROID_
+
+#ifdef USE_EGL_IMAGE_GPU
+#include <EGL/egl.h>
+#include <EGL/eglQCOM.h>
+#define EGL_BUFFER_HANDLE_QCOM 0x4F00
+#define EGL_BUFFER_OFFSET_QCOM 0x4F01
+#endif
+
+#ifdef INPUT_BUFFER_LOG
+#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0"
+#define INPUT_BUFFER_FILE_NAME_LEN 30
+FILE *inputBufferFile1;
+char inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0";
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+FILE *outputBufferFile1;
+char outputfilename [] = "/data/output.yuv";
+#endif
+#ifdef OUTPUT_EXTRADATA_LOG
+FILE *outputExtradataFile;
+char ouputextradatafilename [] = "/data/extradata";
+#endif
+
+#define DEFAULT_FPS 30
+#define MAX_INPUT_ERROR DEFAULT_FPS
+#define MAX_SUPPORTED_FPS 120
+
+#define VC1_SP_MP_START_CODE 0xC5000000
+#define VC1_SP_MP_START_CODE_MASK 0xFF000000
+#define VC1_AP_SEQ_START_CODE 0x0F010000
+#define VC1_STRUCT_C_PROFILE_MASK 0xF0
+#define VC1_STRUCT_B_LEVEL_MASK 0xE0000000
+#define VC1_SIMPLE_PROFILE 0
+#define VC1_MAIN_PROFILE 1
+#define VC1_ADVANCE_PROFILE 3
+#define VC1_SIMPLE_PROFILE_LOW_LEVEL 0
+#define VC1_SIMPLE_PROFILE_MED_LEVEL 2
+#define VC1_STRUCT_C_LEN 4
+#define VC1_STRUCT_C_POS 8
+#define VC1_STRUCT_A_POS 12
+#define VC1_STRUCT_B_POS 24
+#define VC1_SEQ_LAYER_SIZE 36
+
+#define MEM_DEVICE "/dev/ion"
+#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
+
+#ifdef _ANDROID_
+ extern "C"{
+ #include<utils/Log.h>
+ }
+#endif//_ANDROID_
+
+#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } }
+#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); }
+
+void* async_message_thread (void *input)
+{
+ struct vdec_ioctl_msg ioctl_msg;
+ struct vdec_msginfo vdec_msg;
+ OMX_BUFFERHEADERTYPE *buffer;
+ struct v4l2_plane plane;
+ struct pollfd pfd;
+ struct v4l2_buffer v4l2_buf ={0};
+ struct v4l2_event dqevent;
+ pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
+ omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
+ pfd.fd = omx->drv_ctx.video_driver_fd;
+ int error_code = 0,rc=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, TIMEOUT);
+ if (!rc) {
+ printf("Poll timedout\n");
+ break;
+ } else if (rc < 0) {
+ printf("Error while polling: %d\n", rc);
+ break;
+ }
+ if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
+ v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+ v4l2_buf.length = 1;
+ v4l2_buf.m.planes = &plane;
+ rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
+ if (rc) {
+ /*TODO: How to handle this case */
+ printf("Failed to dequeue buf: %d from capture capability\n", rc);
+ break;
+ }
+ 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.bytesused;
+ vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane.m.userptr;
+ }
+ else if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
+ v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+ v4l2_buf.m.planes = &plane;
+ rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
+ if (rc) {
+ /*TODO: How to handle this case */
+ printf("Failed to dequeue buf: %d from output capability\n", rc);
+ break;
+ }
+ 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;
+ } else if (pfd.revents & POLLPRI){
+ rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
+ if(dqevent.u.data[0] == MSM_VIDC_DECODER_EVENT_CHANGE){
+ vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
+ vdec_msg.status_code=VDEC_S_SUCCESS;
+ printf("\n VIDC Port Reconfig recieved \n");
+ } else if (dqevent.u.data[0] == MSM_VIDC_DECODER_FLUSH_DONE){
+ vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
+ vdec_msg.status_code=VDEC_S_SUCCESS;
+ printf("\n VIDC Flush Done Recieved \n");
+ } else
+ printf("\n VIDC Some Event recieved \n");
+ } else if (pfd.revents & POLLERR){
+ printf("\n async_message_thread Exited \n");
+ break;
+ } else{
+ /*TODO: How to handle this case */
+ continue;
+ }
+
+ if (omx->async_message_process(input,&vdec_msg) < 0) {
+ printf("\n async_message_thread Exited \n");
+ break;
+ }
+ }
+ 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;
+
+ 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);
+
+ if(0 == n)
+ {
+ break;
+ }
+
+ if (1 == n)
+ {
+ omx->process_event_cb(omx, id);
+ }
+ if ((n < 0) && (errno != EINTR))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
+ break;
+ }
+ }
+ 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);
+}
+
+// omx_cmd_queue destructor
+omx_vdec::omx_cmd_queue::~omx_cmd_queue()
+{
+ // Nothing to do
+}
+
+// omx cmd queue constructor
+omx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
+{
+ memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
+}
+
+// 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;
+ }
+ }
+ else
+ {
+ ret = false;
+ DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
+ }
+ 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;
+ }
+ }
+ else
+ {
+ ret = false;
+ }
+ return ret;
+}
+
+// Retrieve the first mesg type in the queue
+unsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
+{
+ return m_q[m_read].id;
+}
+
+#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) );
+}
+omx_vdec::ts_arr_list::~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;
+
+ //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;
+}
+
+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;
+
+ 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 (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;
+
+}
+
+
+bool omx_vdec::ts_arr_list::reset_ts_list()
+{
+ 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;
+}
+#endif
+
+// factory function executed by the core to create instances
+void *get_omx_component_factory_fn(void)
+{
+ return (new omx_vdec);
+}
+
+#ifdef _ANDROID_
+#ifdef USE_ION
+VideoHeap::VideoHeap(int devicefd, size_t size, void* base,
+ struct ion_handle *handle, int ionMapfd)
+{
+ ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
+}
+#else
+VideoHeap::VideoHeap(int fd, size_t size, void* base)
+{
+ // dup file descriptor, map once, use pmem
+ init(dup(fd), base, size, 0 , MEM_DEVICE);
+}
+#endif
+#endif // _ANDROID_
+/* ======================================================================
+FUNCTION
+ omx_vdec::omx_vdec
+
+DESCRIPTION
+ Constructor
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+omx_vdec::omx_vdec(): m_state(OMX_StateInvalid),
+ m_app_data(NULL),
+ m_inp_mem_ptr(NULL),
+ m_out_mem_ptr(NULL),
+ m_phdr_pmem_ptr(NULL),
+ 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_inp_bEnabled(OMX_TRUE),
+ m_out_bEnabled(OMX_TRUE),
+ m_platform_list(NULL),
+ m_platform_entry(NULL),
+ m_pmem_info(NULL),
+ output_flush_progress (false),
+ input_flush_progress (false),
+ input_use_buffer (false),
+ output_use_buffer (false),
+ arbitrary_bytes (true),
+ psource_frame (NULL),
+ pdest_frame (NULL),
+ m_inp_heap_ptr (NULL),
+ m_heap_inp_bm_count (0),
+ codec_type_parse ((codec_type)0),
+ first_frame_meta (true),
+ frame_count (0),
+ nal_length(0),
+ nal_count (0),
+ look_ahead_nal (false),
+ first_frame(0),
+ first_buffer(NULL),
+ first_frame_size (0),
+ m_error_propogated(false),
+ m_device_file_ptr(NULL),
+ m_vc1_profile((vc1_profile_type)0),
+ prev_ts(LLONG_MAX),
+ rst_prev_ts(true),
+ frm_int(0),
+ m_in_alloc_cnt(0),
+ m_display_id(NULL),
+ ouput_egl_buffers(false),
+ h264_parser(NULL),
+ client_extradata(0),
+ h264_last_au_ts(LLONG_MAX),
+ h264_last_au_flags(0),
+ m_inp_err_count(0),
+#ifdef _ANDROID_
+ m_heap_ptr(NULL),
+ m_enable_android_native_buffers(OMX_FALSE),
+ m_use_android_native_buffers(OMX_FALSE),
+#endif
+ in_reconfig(false),
+ m_use_output_pmem(OMX_FALSE),
+ m_out_mem_region_smi(OMX_FALSE),
+ m_out_pvt_entry_pmem(OMX_FALSE),
+ secure_mode(false)
+#ifdef _ANDROID_
+ ,iDivXDrmDecrypt(NULL)
+#endif
+ ,m_desc_buffer_ptr(NULL)
+ ,streaming({false, false})
+{
+ /* 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;
+ }
+ property_value[0] = NULL;
+ 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);
+ }
+
+ property_value[0] = NULL;
+ 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);
+
+#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(&op_buf_rcnfg, 0 ,sizeof(vdec_allocatorproperty));
+ memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+ m_demux_entries = 0;
+#ifdef _ANDROID_ICS_
+ memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+#endif
+ drv_ctx.timestamp_adjust = false;
+ drv_ctx.video_driver_fd = -1;
+ m_vendor_config.pData = NULL;
+ pthread_mutex_init(&m_lock, NULL);
+ sem_init(&m_cmd_lock,0,0);
+#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);
+#endif
+
+}
+
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::~omx_vdec
+
+DESCRIPTION
+ Destructor
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+omx_vdec::~omx_vdec()
+{
+ m_pmem_info = NULL;
+ 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");
+ pthread_join(msg_thread_id,NULL);
+ DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
+ pthread_join(async_thread_id,NULL);
+ close(drv_ctx.video_driver_fd);
+ pthread_mutex_destroy(&m_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");
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::OMXCntrlProcessMsgCb
+
+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
+
+RETURN VALUE
+ None.
+
+========================================================================== */
+void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
+{
+ unsigned p1; // Parameter - 1
+ unsigned 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(&p1,&p2,&ident);
+ }
+
+ if (qsize == 0 && pThis->m_state != OMX_StatePause)
+ {
+ qsize = pThis->m_ftb_q.m_size;
+ if (qsize)
+ {
+ pThis->m_ftb_q.pop_entry(&p1,&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(&p1,&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, 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 && pThis->in_reconfig)
+ {
+ pThis->op_buf_rcnfg.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ pThis->stream_off();
+ OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->op_buf_rcnfg);
+ 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_ERROR("\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->output_flush_progress)
+ {
+ DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
+ if (/*ioctl (pThis->drv_ctx.video_driver_fd,
+ VDEC_IOCTL_CMD_STOP,NULL ) < 0*/0)
+ {
+ DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
+ pThis->omx_report_error ();
+ }
+ }
+ }
+ }
+ }
+ 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_ERROR("\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->input_flush_progress)
+ {
+ DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
+ if (/*ioctl (pThis->drv_ctx.video_driver_fd,
+ VDEC_IOCTL_CMD_STOP,NULL ) < */0)
+ {
+ DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_STOP failed");
+ pThis->omx_report_error ();
+ }
+ }
+ }
+ }
+ }
+ 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 (pThis->start_port_reconfig() != OMX_ErrorNone)
+ pThis->omx_report_error();
+ else
+ {
+ if (pThis->in_reconfig)
+ {
+ if (pThis->m_cb.EventHandler) {
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventPortSettingsChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, 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_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);
+
+}
+
+
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::ComponentInit
+
+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
+
+RETURN VALUE
+ None.
+
+========================================================================== */
+OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
+{
+
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct v4l2_fmtdesc fdesc;
+ struct v4l2_format fmt;
+ struct v4l2_requestbuffers bufreq;
+ unsigned int alignment = 0,buffer_size = 0;
+ int fds[2];
+ int r,ret=0;
+ bool codec_ambiguous = false;
+ OMX_STRING device_name = "/dev/video32";
+
+ drv_ctx.video_driver_fd = open("/dev/video32", O_RDWR);
+
+ 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){
+ drv_ctx.video_driver_fd = open(device_name, O_RDWR);
+ }
+
+ 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;
+
+
+#ifdef INPUT_BUFFER_LOG
+ strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+ outputBufferFile1 = fopen (outputfilename, "ab");
+#endif
+#ifdef OUTPUT_EXTRADATA_LOG
+ outputExtradataFile = fopen (ouputextradatafilename, "ab");
+#endif
+
+ // 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;
+ /*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");
+#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;
+ 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");
+#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;
+ codec_type_parse = CODEC_TYPE_H263;
+ m_frame_parser.init_start_codes (codec_type_parse);
+#ifdef INPUT_BUFFER_LOG
+ 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.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);
+
+ }
+ 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);
+
+ }
+ 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");
+#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;
+ m_frame_parser.init_start_codes (codec_type_parse);
+#ifdef INPUT_BUFFER_LOG
+ 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;
+ m_frame_parser.init_start_codes (codec_type_parse);
+#ifdef INPUT_BUFFER_LOG
+ strcat(inputfilename, "vc1");
+#endif
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
+ eRet = OMX_ErrorInvalidComponentName;
+ }
+#ifdef INPUT_BUFFER_LOG
+ inputBufferFile1 = fopen (inputfilename, "ab");
+#endif
+ if (eRet == OMX_ErrorNone)
+ {
+
+ drv_ctx.output_format = VDEC_YUV_FORMAT_TILE_4x2;
+ capture_capability= V4L2_PIX_FMT_NV12;
+
+ struct v4l2_event_subscription sub;
+ sub.type=V4L2_EVENT_ALL;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
+ if (ret) {
+ printf("\n Subscribe Event Failed \n");
+ return OMX_ErrorInsufficientResources;
+ }
+
+ struct v4l2_capability cap;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
+ if (ret) {
+ printf("Failed to query capabilities\n");
+ /*TODO: How to handle this case */
+ } else {
+ printf("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) {
+ printf("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) {
+
+ printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+ fdesc.pixelformat, fdesc.flags);
+ fdesc.index++;
+ }
+
+ drv_ctx.video_resolution.frame_height=drv_ctx.video_resolution.scan_lines=240;
+ drv_ctx.video_resolution.frame_width=drv_ctx.video_resolution.stride=320;
+ 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 */
+ printf("Failed to set format on capture port\n");
+ }
+ printf("\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.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
+ } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
+ divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
+ } else {
+ divx_ctrl.id = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
+ }
+
+ divx_ctrl.value = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &fmt);
+ if (ret) {
+ DEBUG_PRINT_ERROR("Failed to set divx version\n");
+ }
+ } else {
+ DEBUG_PRINT_ERROR("Codec should not be ambiguous");
+ }
+ }
+
+ 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 = output_capability;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
+ if (ret) {
+ /*TODO: How to handle this case */
+ printf("Failed to set format on capture port\n");
+ }
+ printf("\n Set Format was successful \n ");
+
+ /*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;
+ drv_ctx.op_buf.alignment=4096;
+ drv_ctx.ip_buf.alignment=4096;
+ drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+ drv_ctx.extradata = 0;
+ drv_ctx.picture_order = VDEC_ORDER_DECODE;
+ drv_ctx.idr_only_decoding = 0;
+
+ m_state = OMX_StateLoaded;
+ eRet=get_buffer_req(&drv_ctx.ip_buf);
+ printf("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size);
+
+#ifdef DEFAULT_EXTRADATA
+ if (eRet == OMX_ErrorNone && !secure_mode)
+ eRet = enable_extradata(DEFAULT_EXTRADATA);
+#endif
+ 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 (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;
+ }
+ }
+
+ 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];
+ r = pthread_create(&msg_thread_id,0,message_thread,this);
+
+ if(r < 0)
+ {
+ DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ }
+ }
+
+ if (eRet != OMX_ErrorNone)
+ {
+ DEBUG_PRINT_ERROR("\n Component Init Failed");
+ DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
+ (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
+ NULL);
+ DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
+ close (drv_ctx.video_driver_fd);
+ drv_ctx.video_driver_fd = -1;
+ }
+ 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
+
+DESCRIPTION
+ Returns the component version.
+
+PARAMETERS
+ TBD.
+
+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
+ )
+{
+ 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;
+}
+/* ======================================================================
+FUNCTION
+ omx_vdec::SendCommand
+
+DESCRIPTION
+ Returns zero if all the buffers released..
+
+PARAMETERS
+ None.
+
+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
+ )
+{
+ DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client");
+ 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: %d", param1);
+ return OMX_ErrorBadPortIndex;
+ }
+ post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
+ sem_wait(&m_cmd_lock);
+ DEBUG_PRINT_LOW("\n send_command: Command Processed\n");
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::SendCommand
+
+DESCRIPTION
+ Returns zero if all the buffers released..
+
+PARAMETERS
+ None.
+
+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_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);
+
+ 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;
+ printf("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 = 1;
+ int rc=0;
+ enum v4l2_buf_type btype;
+ btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ /*TODO: How to handle this case */
+ printf("\n Failed to call streamoff on OUTPUT Port \n");
+ } else {
+ streaming[OUTPUT_PORT] = false;
+ }
+ btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ /*TODO: How to handle this case */
+ printf("\n Failed to call streamoff on CAPTURE Port \n");
+ } else {
+ streaming[CAPTURE_PORT] = false;
+ }
+ struct v4l2_event_subscription sub;
+ sub.type=V4L2_EVENT_ALL;
+ ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+ if (ret) {
+ printf("\n Subscribe Event Failed \n");
+ eRet = OMX_ErrorHardware;
+ }
+ m_state == OMX_StateIdle;
+ }
+ /* Requesting transition from Executing to Paused */
+ else if(eState == OMX_StatePause)
+ {
+ DEBUG_PRINT_LOW("\n PAUSE Command Issued");
+ if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_PAUSE,
+ NULL) < */0)
+ {
+ DEBUG_PRINT_ERROR("\n Error In Pause State");
+ post_event(OMX_EventError,OMX_ErrorHardware,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorHardware;
+ }
+ else
+ {
+ BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
+ DEBUG_PRINT_LOW("send_command_proxy(): Executing-->Pause\n");
+ bFlag = 0;
+ }
+ }
+ /* 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");
+ if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_RESUME,
+ NULL) < */0)
+ {
+ DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_RESUME failed");
+ post_event(OMX_EventError,OMX_ErrorHardware,\
+ OMX_COMPONENT_GENERATE_EVENT);
+ eRet = OMX_ErrorHardware;
+ }
+ else
+ {
+ BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
+ DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
+ post_event (NULL,VDEC_S_SUCCESS,\
+ OMX_COMPONENT_GENERATE_RESUME_DONE);
+ bFlag = 0;
+ }
+ }
+ /* 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: %d", 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: %d", 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: %d", 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
+
+DESCRIPTION
+ Executes the OMX flush.
+
+PARAMETERS
+ flushtype - input flush(1)/output flush(0)/ both.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+bool omx_vdec::execute_omx_flush(OMX_U32 flushType)
+{
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ enum vdec_bufferflush flush_dir;
+ bool bRet = false;
+ switch (flushType)
+ {
+ case OMX_CORE_INPUT_PORT_INDEX:
+ input_flush_progress = true;
+ flush_dir = VDEC_FLUSH_TYPE_INPUT;
+ break;
+ case OMX_CORE_OUTPUT_PORT_INDEX:
+ output_flush_progress = true;
+ flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
+ break;
+ default:
+ input_flush_progress = true;
+ output_flush_progress = true;
+ flush_dir = VDEC_FLUSH_TYPE_ALL;
+ }
+ ioctl_msg.in = &flush_dir;
+ ioctl_msg.out = NULL;
+ if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_CMD_FLUSH, &ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", (int)flush_dir);
+ bRet = false;
+ }
+ return bRet;
+}
+/*=========================================================================
+FUNCTION : execute_output_flush
+
+DESCRIPTION
+ Executes the OMX flush at OUTPUT PORT.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+==========================================================================*/
+bool omx_vdec::execute_output_flush()
+{
+ 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 == OMX_COMPONENT_GENERATE_FTB )
+ {
+ pending_output_buffers++;
+ fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
+ }
+ else if (ident == OMX_COMPONENT_GENERATE_FBD)
+ {
+ fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
+ }
+ }
+ 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;
+}
+/*=========================================================================
+FUNCTION : execute_input_flush
+
+DESCRIPTION
+ Executes the OMX flush at INPUT PORT.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ 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;
+
+ /*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);
+
+ 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);
+ }
+ }
+ time_stamp_dts.flush_timestamp();
+ /*Check if Heap Buffers are to be flushed*/
+ if (arbitrary_bytes)
+ {
+ 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);
+ }
+
+ 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,NULL,NULL);
+ pdest_frame = NULL;
+ }
+ m_frame_parser.flush();
+ }
+ 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();
+ }
+#endif
+ DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
+ return bRet;
+}
+
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::SendCommandEvent
+
+DESCRIPTION
+ Send the event to decoder pipe. This is needed to generate the callbacks
+ in decoder thread context.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+bool omx_vdec::post_event(unsigned int p1,
+ unsigned int p2,
+ unsigned int id)
+{
+ bool bRet = false;
+
+
+ pthread_mutex_lock(&m_lock);
+
+ if (id == OMX_COMPONENT_GENERATE_FTB ||
+ 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);
+
+ pthread_mutex_unlock(&m_lock);
+
+ 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;
+
+ 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 %d\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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+ 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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ return eRet;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::GetParameter
+
+DESCRIPTION
+ OMX Get Parameter method implementation
+
+PARAMETERS
+ <TBD>.
+
+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_ERRORTYPE eRet = OMX_ErrorNone;
+
+ DEBUG_PRINT_LOW("get_parameter: \n");
+ if(m_state == OMX_StateInvalid)
+ {
+ DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+ if(paramData == NULL)
+ {
+ DEBUG_PRINT_LOW("Get Param in Invalid paramData \n");
+ return OMX_ErrorBadParameter;
+ }
+ switch(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");
+
+ 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->nIndex)
+ portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+ else
+ {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
+ " NoMore Color formats\n");
+ eRet = OMX_ErrorNoMore;
+ }
+ portFmt->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+ }
+ 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);
+
+ 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);
+
+ 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;
+
+
+ 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) {
+
+ if(secure_mode) {
+ nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
+ GRALLOC_USAGE_PRIVATE_UNCACHED);
+ } else {
+ nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_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;
+ }
+
+ }
+
+ 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;
+}
+
+#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
+OMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
+{
+ DEBUG_PRINT_LOW("Inside use_android_native_buffer");
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
+
+ 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
+ OMX_U8 *buffer = NULL;
+ 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;
+ }
+ }
+ eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
+ } else {
+ eRet = OMX_ErrorBadParameter;
+ }
+ return eRet;
+}
+#endif
+/* ======================================================================
+FUNCTION
+ omx_vdec::Setparameter
+
+DESCRIPTION
+ OMX Set Parameter method implementation.
+
+PARAMETERS
+ <TBD>.
+
+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_ERRORTYPE eRet = OMX_ErrorNone;
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+
+ 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((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(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;
+ 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;
+ 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(#%d: %u)\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)
+ {
+ 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 : %d",
+ 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;
+ ioctl_msg.in = &drv_ctx.frame_rate;
+ if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
+ (void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("Setting frame rate to driver failed");
+ }
+ DEBUG_PRINT_LOW("set_parameter: frm_int(%u) 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(%d x %d)\n",
+ portDefn->format.video.nFrameWidth,
+ portDefn->format.video.nFrameHeight);
+ if (portDefn->format.video.nFrameHeight != 0x0 &&
+ portDefn->format.video.nFrameWidth != 0x0)
+ {
+ drv_ctx.video_resolution.frame_height =
+ drv_ctx.video_resolution.scan_lines =
+ portDefn->format.video.nFrameHeight;
+ drv_ctx.video_resolution.frame_width =
+ drv_ctx.video_resolution.stride =
+ portDefn->format.video.nFrameWidth;
+ ioctl_msg.in = &drv_ctx.video_resolution;
+ ioctl_msg.out = NULL;
+ if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICRES,
+ (void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\n Set Resolution failed");
+ eRet = OMX_ErrorUnsupportedSetting;
+ }
+ else
+ eRet = get_buffer_req(&drv_ctx.op_buf);
+ }
+ }
+ else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
+ && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size)
+ {
+ drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
+ drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize;
+ eRet = set_buffer_req(&drv_ctx.ip_buf);
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%d: %u)\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_FormatYUV420SemiPlanar)
+ op_format = VDEC_YUV_FORMAT_NV12;
+ else if(portFmt->eColorFormat ==
+ 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);
+ }
+ }
+ }
+ }
+ break;
+
+ case OMX_QcomIndexPortDefn:
+ {
+ OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
+ (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
+ DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\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 %d\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);
+
+ 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
+ {
+ 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 %d\n",
+ priorityMgmtype->nGroupID);
+
+ DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
+ priorityMgmtype->nGroupPriority);
+
+ m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
+ m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
+
+ 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;
+
+ else
+
+ eRet = OMX_ErrorBadPortIndex;
+
+ 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;
+ enum vdec_output_order pic_order = VDEC_ORDER_DISPLAY;
+ DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
+ pictureOrder->eOutputPictureOrder);
+ if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER)
+ pic_order = VDEC_ORDER_DISPLAY;
+ else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
+ pic_order = VDEC_ORDER_DECODE;
+ time_stamp_dts.set_timestamp_reorder_mode(false);
+ }
+ else
+ eRet = OMX_ErrorBadParameter;
+
+ if (eRet == OMX_ErrorNone && pic_order != drv_ctx.picture_order)
+ {
+ drv_ctx.picture_order = pic_order;
+ // ioctl_msg.in = &drv_ctx.picture_order;
+ //ioctl_msg.out = NULL;
+ if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_PICTURE_ORDER,
+ (void*)&ioctl_msg) < */0)
+ {
+ 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,
+ ((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,
+ ((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,
+ ((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,
+ ((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;
+
+#if 0
+ createDivxDrmContext( divXType->pDrmHandle );
+#endif
+ }
+ 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");
+ drv_ctx.idr_only_decoding = 1;
+ int rc; //= ioctl(drv_ctx.video_driver_fd,
+ // VDEC_IOCTL_SET_IDR_ONLY_DECODING);
+ if(rc < 0) {
+ DEBUG_PRINT_ERROR("Failed to set IDR only decoding on driver.");
+ eRet = OMX_ErrorHardware;
+ }
+ }
+ 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, extradataIndexType->bEnabled);
+ // Set smooth streaming parameter
+ int rc;// = ioctl(drv_ctx.video_driver_fd,
+ // VDEC_IOCTL_SET_CONT_ON_RECONFIG);
+ if(rc < 0) {
+ DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
+ eRet = OMX_ErrorHardware;
+ }
+ }
+ }
+ }
+ 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;
+#endif
+ case OMX_QcomIndexParamEnableTimeStampReorder:
+ {
+ QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
+ if (drv_ctx.picture_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;
+ default:
+ {
+ DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
+ eRet = OMX_ErrorUnsupportedIndex;
+ }
+ }
+ return eRet;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::GetConfig
+
+DESCRIPTION
+ OMX Get Config Method implementation.
+
+PARAMETERS
+ <TBD>.
+
+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_ERRORTYPE eRet = OMX_ErrorNone;
+
+ if (m_state == OMX_StateInvalid)
+ {
+ DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+
+ switch (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:
+ {
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+ QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
+ (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
+ //ioctl_msg.out = (void*)&decoderinstances->nNumOfInstances;
+ //(void)(ioctl(drv_ctx.video_driver_fd,
+ //VDEC_IOCTL_GET_NUMBER_INSTANCES,&ioctl_msg));
+
+ 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;
+ }
+ 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 (m_state == OMX_StateExecuting)
+ {
+ DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
+ return ret;
+ }
+
+ if (configIndex == 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[%d] len[%d] data[0x%x]\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 (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)
+ {
+
+ pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
+ 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;
+ }
+
+ 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)) {
+ *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
+ }
+ 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)) {
+ 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)) {
+ *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
+ }
+#endif
+ else {
+ DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
+ return OMX_ErrorNotImplemented;
+ }
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::GetState
+
+DESCRIPTION
+ Returns the state information back to the caller.<TBD>
+
+PARAMETERS
+ <TBD>.
+
+RETURN VALUE
+ Error None if everything is successful.
+========================================================================== */
+OMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STATETYPE* state)
+{
+ *state = m_state;
+ DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::ComponentTunnelRequest
+
+DESCRIPTION
+ OMX Component Tunnel Request method implementation. <TBD>
+
+PARAMETERS
+ None.
+
+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)
+{
+ DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
+ return OMX_ErrorNotImplemented;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::UseOutputBuffer
+
+DESCRIPTION
+ Helper function for Use buffer in the input pin
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+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_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
+ unsigned i= 0; // Temporary counter
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct vdec_setbuffer_cmd setbuffers;
+ OMX_PTR privateAppData = NULL;
+ private_handle_t *handle = NULL;
+ OMX_U8 *buff = buffer;
+ if (!m_out_mem_ptr) {
+ DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
+ eRet = allocate_output_headers();
+ }
+
+ if (eRet == OMX_ErrorNone) {
+ for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
+ if(BITMASK_ABSENT(&m_out_bm_count,i))
+ {
+ break;
+ }
+ }
+ }
+
+ if(i >= 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;
+ 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;
+ }
+ }
+ privateAppData = appData;
+ }
+#if defined(_ANDROID_ICS_)
+ native_buffer[i].nativehandle = handle;
+#endif
+ 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].mmaped_size =
+ drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_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, 0);
+ if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
+ 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) {
+ return OMX_ErrorInsufficientResources;
+ }
+
+ 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) {
+ 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
+ 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%x",
+ 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));
+
+ // ioctl_msg.in = &setbuffers;
+ // ioctl_msg.out = NULL;
+
+ DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %x, pmem_fd=%0x%x", i,
+ drv_ctx.ptr_outputbuffer[i],drv_ctx.ptr_outputbuffer[i].pmem_fd );
+ // if (ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_SET_BUFFER,
+ // &ioctl_msg) < 0)
+ // {
+ // DEBUG_PRINT_ERROR("\n Set output buffer failed");
+ // return OMX_ErrorInsufficientResources;
+ // }
+ // found an empty buffer at i
+ (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
+ (*bufferHdr)->pBuffer = buff;
+ (*bufferHdr)->pAppPrivate = privateAppData;
+ BITMASK_SET(&m_out_bm_count,i);
+ }
+ return eRet;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::use_input_heap_buffers
+
+DESCRIPTION
+ OMX Use Buffer Heap allocation method implementation.
+
+PARAMETERS
+ <TBD>.
+
+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)
+{
+ 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], NULL, 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;
+ }
+ return eRet;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::UseBuffer
+
+DESCRIPTION
+ OMX Use Buffer method implementation.
+
+PARAMETERS
+ <TBD>.
+
+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_ERRORTYPE error = OMX_ErrorNone;
+ struct vdec_setbuffer_cmd setbuffers;
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+
+ 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 %u, 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)
+{
+ 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_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct vdec_setbuffer_cmd setbuffers;
+ setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
+ memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
+ sizeof (vdec_bufferpayload));
+ ioctl_msg.in = &setbuffers;
+ ioctl_msg.out = NULL;
+ int ioctl_r; //= ioctl (drv_ctx.video_driver_fd,
+ // VDEC_IOCTL_FREE_BUFFER, &ioctl_msg);
+ if (ioctl_r < 0)
+ {
+ DEBUG_PRINT_ERROR("\nVDEC_IOCTL_FREE_BUFFER returned error %d", ioctl_r);
+ }
+
+ 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 = %d",
+ 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;
+
+ 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);
+
+ if (index < drv_ctx.op_buf.actualcount
+ && drv_ctx.ptr_outputbuffer)
+ {
+ DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
+ drv_ctx.ptr_outputbuffer[index].bufferaddr);
+
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct vdec_setbuffer_cmd setbuffers;
+ setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
+ memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
+ sizeof (vdec_bufferpayload));
+ ioctl_msg.in = &setbuffers;
+ ioctl_msg.out = NULL;
+ DEBUG_PRINT_LOW("\nRelease the Output Buffer");
+ if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_FREE_BUFFER,
+ &ioctl_msg) < */0)
+ DEBUG_PRINT_ERROR("\nRelease output buffer failed in VCD");
+
+#ifdef _ANDROID_
+ if(m_enable_android_native_buffers) {
+ 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 {
+#endif
+ if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
+ {
+ 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 = %d",
+ drv_ctx.ptr_outputbuffer[0].mmaped_size,
+ drv_ctx.ptr_outputbuffer[0].bufferaddr);
+ munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
+ drv_ctx.ptr_outputbuffer[0].mmaped_size);
+ 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]);
+#endif
+ }
+#ifdef _ANDROID_
+ }
+#endif
+ }
+
+ 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 *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;
+ }
+
+ *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],NULL,NULL))
+ {
+ DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+ else
+ {
+ return OMX_ErrorBadParameter;
+ }
+
+ return eRet;
+
+}
+
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::AllocateInputBuffer
+
+DESCRIPTION
+ Helper function for allocate buffer in the input pin
+
+PARAMETERS
+ None.
+
+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_ERRORTYPE eRet = OMX_ErrorNone;
+ struct vdec_setbuffer_cmd setbuffers;
+ OMX_BUFFERHEADERTYPE *input = NULL;
+ struct vdec_ioctl_msg ioctl_msg = {NULL,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 %d 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;
+ }
+
+ 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);
+
+ 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;
+#ifdef USE_ION
+ 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, 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 Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]);
+
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
+
+ if (rc) {
+ printf("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
+
+DESCRIPTION
+ Helper fn for AllocateBuffer in the output pin
+
+PARAMETERS
+ <TBD>.
+
+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_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
+ unsigned i= 0; // Temporary counter
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct vdec_setbuffer_cmd setbuffers;
+#ifdef USE_ION
+ 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;
+
+ 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);
+
+ 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);
+#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, 0);
+ if (ion_device_fd < 0) {
+ return OMX_ErrorInsufficientResources;
+ }
+ pmem_fd = fd_ion_data.fd;
+#else
+ 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)
+ {
+ 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(!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);
+#ifdef USE_ION
+ free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
+#endif
+ 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;
+#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%x][0x%x]\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;
+ }
+ }
+
+ 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;
+ 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.length = drv_ctx.op_buf.buffer_size;
+ plane.m.userptr = (unsigned long)(drv_ctx.ptr_outputbuffer[i].bufferaddr-drv_ctx.ptr_outputbuffer[i].offset);
+#ifdef USE_ION
+ plane.reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
+#endif
+ plane.reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
+ plane.data_offset = 0;
+ buf.m.planes = &plane;
+ buf.length = 1;
+
+ DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
+ 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;
+}
+
+
+// AllocateBuffer -- API Call
+/* ======================================================================
+FUNCTION
+ omx_vdec::AllocateBuffer
+
+DESCRIPTION
+ Returns zero if all the buffers released..
+
+PARAMETERS
+ None.
+
+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)
+{
+ 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)
+ {
+ 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)
+ {
+ eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
+ }
+ 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))
+ {
+ // 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)
+ {
+ 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);
+ post_event(OMX_CommandPortEnable,
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+ }
+ }
+ DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);
+ return eRet;
+}
+
+// Free Buffer - API call
+/* ======================================================================
+FUNCTION
+ omx_vdec::FreeBuffer
+
+DESCRIPTION
+
+PARAMETERS
+ None.
+
+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_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)))
+ {
+ 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))
+ {
+ DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
+ }
+ 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);
+
+ return OMX_ErrorIncorrectStateOperation;
+ }
+ 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);
+ }
+
+ 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)
+ {
+
+ 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);
+ }
+ 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())
+ {
+ 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);
+ }
+ }
+ else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
+ {
+ // check if the buffer is valid
+ nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr;
+ 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;
+ free_output_buffer (buffer);
+
+ if (release_output_done())
+ {
+ free_output_buffer_header();
+ }
+ }
+ 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())
+ {
+ 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);
+#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));
+ }
+#endif
+
+ post_event(OMX_CommandPortDisable,
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+ }
+ else
+ {
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ 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);
+ }
+ }
+ return eRet;
+}
+
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::EmptyThisBuffer
+
+DESCRIPTION
+ This routine is used to push the encoded video frames to
+ the video decoder.
+
+PARAMETERS
+ None.
+
+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_ERRORTYPE ret1 = OMX_ErrorNone;
+ unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
+
+ 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 (!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 %d", 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);
+ }
+ }
+#endif //_ANDROID_
+ 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 %d",
+ &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;
+ }
+
+ 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;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::empty_this_buffer_proxy
+
+DESCRIPTION
+ This routine is used to push the encoded video frames to
+ the video decoder.
+
+PARAMETERS
+ None.
+
+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)
+{
+ 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_ioctl_msg ioctl_msg;
+ 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;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+
+
+ 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 %d frame number %d",
+ 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
+
+ || 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;
+ }
+
+ 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=%d",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);
+ }
+ 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 (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 (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 = {0};
+ struct v4l2_plane plane;
+ int rc;
+ unsigned long print_count;
+ if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
+ { buf.flags = V4L2_BUF_FLAG_EOS;
+ printf("\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-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;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
+ if(!streaming[OUTPUT_PORT])
+ {
+ enum v4l2_buf_type buf_type;
+ int ret,r;
+ 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) {
+ printf("Streamon on OUTPUT Plane was successful \n");
+ streaming[OUTPUT_PORT] = true;
+ ret = pthread_create(&async_thread_id,0,async_message_thread,this);
+ if(ret < 0)
+ printf("\n Failed to create async_message_thread \n");
+ } else{
+ /*TODO: How to handle this case */
+ printf(" \n Failed to call streamon on OUTPUT \n");
+ }
+}
+ DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
+ frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
+ time_stamp_dts.insert_timestamp(buffer);
+
+ return ret;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::FillThisBuffer
+
+DESCRIPTION
+ IL client uses this method to release the frame buffer
+ after displaying them.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+
+ 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 (buffer == NULL || ((buffer - m_out_mem_ptr) >= 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 %d", buffer->nOutputPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
+
+ DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
+ post_event((unsigned) hComp, (unsigned)buffer,OMX_COMPONENT_GENERATE_FTB);
+ return OMX_ErrorNone;
+}
+/* ======================================================================
+FUNCTION
+ omx_vdec::fill_this_buffer_proxy
+
+DESCRIPTION
+ IL client uses this method to release the frame buffer
+ after displaying them.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
+{
+ OMX_ERRORTYPE nRet = OMX_ErrorNone;
+ struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
+ 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 *)m_out_mem_ptr);
+
+ if (bufferAdd == NULL || ((buffer - m_out_mem_ptr) >
+ 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++;
+ 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;
+ }
+
+ // memcpy (&fillbuffer.buffer,ptr_outputbuffer,\
+ sizeof(struct vdec_bufferpayload));
+ // fillbuffer.client_data = bufferAdd;
+
+#ifdef _ANDROID_ICS_
+ 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)) {
+ DEBUG_PRINT_ERROR("Failed to acquire genlock");
+ buffer->nFilledLen = 0;
+ m_cb.FillBufferDone (hComp,m_app_data,buffer);
+ pending_output_buffers--;
+ return OMX_ErrorInsufficientResources;
+ } else {
+ native_buffer[buffer - m_out_mem_ptr].inuse = true;
+ }
+ }
+#endif
+ int rc = 0;
+ struct v4l2_buffer buf={0};
+ struct v4l2_plane plane;
+
+ buf.index = nPortIndex;
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane.bytesused = buffer->nFilledLen;
+ plane.length = drv_ctx.op_buf.buffer_size;
+ plane.m.userptr = (unsigned long)(drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr-drv_ctx.ptr_outputbuffer[nPortIndex].offset);
+ plane.reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
+ plane.reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
+ plane.data_offset = 0;
+ buf.m.planes = &plane;
+ buf.length = 1;
+
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
+ if (rc) {
+ /*TODO: How to handle this case */
+ printf("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
+ //m_cb.FillBufferDone (hComp,m_app_data,buffer);
+ // pending_output_buffers--;
+ // return OMX_ErrorBadParameter;
+ //}
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::SetCallbacks
+
+DESCRIPTION
+ Set the callbacks.
+
+PARAMETERS
+ None.
+
+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)
+{
+
+ 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
+
+DESCRIPTION
+ Destroys the component and release memory allocated to the heap.
+
+PARAMETERS
+ <TBD>.
+
+RETURN VALUE
+ OMX Error None if everything successful.
+
+========================================================================== */
+OMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
+{
+#ifdef _ANDROID_
+ if(iDivXDrmDecrypt)
+ {
+ delete iDivXDrmDecrypt;
+ iDivXDrmDecrypt=NULL;
+ }
+#endif //_ANDROID_
+
+ int i = 0;
+ if (OMX_StateLoaded != m_state)
+ {
+ DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
+ m_state);
+ DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
+ }
+ else
+ {
+ DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
+ }
+
+ /*Check if the output buffers have to be cleaned up*/
+ 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]);
+#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");
+ }
+ native_buffer[i].inuse = false;
+ }
+ }
+#endif
+ }
+#ifdef _ANDROID_ICS_
+ memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
+#endif
+ }
+
+ /*Check if the input buffers have to be cleaned up*/
+ 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);
+ }
+ }
+ free_input_buffer_header();
+ free_output_buffer_header();
+ if(h264_scratch.pBuffer)
+ {
+ free(h264_scratch.pBuffer);
+ h264_scratch.pBuffer = NULL;
+ }
+
+ if (h264_parser)
+ {
+ delete h264_parser;
+ h264_parser = NULL;
+ }
+
+ if(m_platform_list)
+ {
+ free(m_platform_list);
+ m_platform_list = NULL;
+ }
+ if(m_vendor_config.pData)
+ {
+ free(m_vendor_config.pData);
+ m_vendor_config.pData = NULL;
+ }
+
+ // Reset counters in mesg queues
+ m_ftb_q.m_size=0;
+ m_cmd_q.m_size=0;
+ m_etb_q.m_size=0;
+ m_ftb_q.m_read = m_ftb_q.m_write =0;
+ 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();
+ }
+#endif
+
+ DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
+ //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
+ // NULL);
+ DEBUG_PRINT_HIGH("\n Close the driver instance");
+
+#ifdef INPUT_BUFFER_LOG
+ fclose (inputBufferFile1);
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+ fclose (outputBufferFile1);
+#endif
+#ifdef OUTPUT_EXTRADATA_LOG
+ fclose (outputExtradataFile);
+#endif
+ DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::UseEGLImage
+
+DESCRIPTION
+ OMX Use EGL Image method implementation <TBD>.
+
+PARAMETERS
+ <TBD>.
+
+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_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;
+#else
+ 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 ");
+ }
+#ifdef USE_EGL_IMAGE_GPU
+ 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);
+#else //with OMX test app
+ struct temp_egl {
+ int pmem_fd;
+ int offset;
+ };
+ struct temp_egl *temp_egl_id = NULL;
+ void * pmemPtr = (void *) eglImage;
+ temp_egl_id = (struct temp_egl *)eglImage;
+ if (temp_egl_id != NULL)
+ {
+ fd = temp_egl_id->pmem_fd;
+ offset = temp_egl_id->offset;
+ }
+#endif
+ 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;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::ComponentRoleEnum
+
+DESCRIPTION
+ OMX Component Role Enum method implementation.
+
+PARAMETERS
+ <TBD>.
+
+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_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);
+ }
+ 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;
+ }
+ }
+
+ 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);
+ }
+ 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
+ {
+ DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
+ eRet = OMX_ErrorInvalidComponentName;
+ }
+ return eRet;
+}
+
+
+
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::AllocateDone
+
+DESCRIPTION
+ Checks if entire buffer pool is allocated by IL Client or not.
+ Need this to move to IDLE state.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false.
+
+========================================================================== */
+bool omx_vdec::allocate_done(void)
+{
+ bool bRet = false;
+ bool bRet_In = false;
+ bool bRet_Out = false;
+
+ 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())
+ {
+ bRet = true;
+ }
+ }
+ return bRet;
+}
+
+
+/* ======================================================================
+FUNCTION
+ omx_vdec::ReleaseOutputDone
+
+DESCRIPTION
+ Checks if IL client has released all the buffers.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+bool omx_vdec::release_output_done(void)
+{
+ 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;
+ }
+ }
+ if(j == drv_ctx.op_buf.actualcount)
+ {
+ m_out_bm_count = 0;
+ bRet = true;
+ }
+ }
+ else
+ {
+ m_out_bm_count = 0;
+ bRet = true;
+ }
+ return bRet;
+}
+/* ======================================================================
+FUNCTION
+ omx_vdec::ReleaseInputDone
+
+DESCRIPTION
+ Checks if IL client has released all the buffers.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+bool omx_vdec::release_input_done(void)
+{
+ 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;
+ }
+ }
+ if(j==drv_ctx.ip_buf.actualcount)
+ {
+ bRet = true;
+ }
+ }
+ else
+ {
+ bRet = true;
+ }
+ return bRet;
+}
+
+OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
+ 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;
+ }
+
+ 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(NULL,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,NULL,NULL);
+ pdest_frame = NULL;
+ }
+ }
+
+ DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
+#ifdef OUTPUT_BUFFER_LOG
+ if (outputBufferFile1)
+ {
+ fwrite (buffer->pBuffer,1,buffer->nFilledLen,
+ outputBufferFile1);
+ }
+#endif
+
+ /* For use buffer we need to copy the data */
+ if (!output_flush_progress)
+ {
+ time_stamp_dts.get_next_timestamp(buffer,
+ (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
+ ?true:false);
+ }
+ if (m_cb.FillBufferDone)
+ {
+ if (buffer->nFilledLen > 0)
+ {
+ if (client_extradata)
+ handle_extradata(buffer);
+ if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+ // Keep min timestamp interval to handle corrupted bit stream scenario
+ 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;
+ }
+ }
+
+#ifdef OUTPUT_EXTRADATA_LOG
+ 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);
+ }
+ }
+#endif
+ }
+ 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 %d",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;
+ }
+ }
+ }
+#endif
+ m_cb.FillBufferDone (hComp,m_app_data,buffer);
+ DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
+ }
+ else
+ {
+ return OMX_ErrorBadParameter;
+ }
+
+ return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE* buffer)
+{
+
+ 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;
+ }
+
+ DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
+ 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,NULL,NULL))
+ {
+ DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
+ }
+ }
+ }
+ else if(m_cb.EmptyBufferDone)
+ {
+ buffer->nFilledLen = 0;
+ if (input_use_buffer == true){
+ buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
+ }
+ m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
+ }
+ return OMX_ErrorNone;
+}
+
+
+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);
+
+#ifdef _ANDROID_
+ if (omx->m_debug_timestamp)
+ {
+ if ( (vdec_msg->msgcode == VDEC_MSG_RESP_OUTPUT_BUFFER_DONE) &&
+ !(omx->output_flush_progress) )
+ {
+ OMX_TICKS expected_ts = 0;
+ omx->m_timestamp_list.pop_min_ts(expected_ts);
+ DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
+ vdec_msg->msgdata.output_frame.time_stamp, expected_ts);
+
+ if (vdec_msg->msgdata.output_frame.time_stamp != expected_ts)
+ {
+ DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
+ }
+ }
+ }
+#endif
+
+ switch (vdec_msg->msgcode)
+ {
+
+ case VDEC_MSG_EVT_HW_ERROR:
+ omx->post_event (NULL,vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
+ break;
+
+ case VDEC_MSG_RESP_START_DONE:
+ omx->post_event (NULL,vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_START_DONE);
+ break;
+
+ case VDEC_MSG_RESP_STOP_DONE:
+ omx->post_event (NULL,vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_STOP_DONE);
+ break;
+
+ case VDEC_MSG_RESP_RESUME_DONE:
+ omx->post_event (NULL,vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_RESUME_DONE);
+ break;
+
+ case VDEC_MSG_RESP_PAUSE_DONE:
+ omx->post_event (NULL,vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_PAUSE_DONE);
+ break;
+
+ case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
+ omx->post_event (NULL,vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
+ break;
+ case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
+ omx->post_event (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->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 = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nTimeStamp;
+ omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags;
+
+ if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS)
+ {
+ omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
+ //rc = -1;
+ }
+ vdec_msg->msgdata.output_frame.bufferaddr=omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
+ output_respbuf = (struct vdec_output_frameinfo *)\
+ omxhdr->pOutputPortPrivate;
+ // output_respbuf->framesize.bottom =
+ // vdec_msg->msgdata.output_frame.framesize.bottom;
+ // output_respbuf->framesize.left =
+ // vdec_msg->msgdata.output_frame.framesize.left;
+ // output_respbuf->framesize.right =
+ // vdec_msg->msgdata.output_frame.framesize.right;
+ // output_respbuf->framesize.top =
+ // vdec_msg->msgdata.output_frame.framesize.top;
+ output_respbuf->len = vdec_msg->msgdata.output_frame.len;
+ output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
+ // output_respbuf->time_stamp = vdec_msg->msgdata.output_frame.time_stamp;
+ // output_respbuf->flags = vdec_msg->msgdata.output_frame.flags;
+ // output_respbuf->pic_type = vdec_msg->msgdata.output_frame.pic_type;
+ // output_respbuf->interlaced_format = vdec_msg->msgdata.output_frame.interlaced_format;
+
+ if (omx->output_use_buffer)
+ memcpy ( omxhdr->pBuffer,
+ (vdec_msg->msgdata.output_frame.bufferaddr +
+ 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 (NULL, vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_EOS_DONE);
+ else
+ omx->post_event (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 ((unsigned int)omxhdr,vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_PORT_RECONFIG);
+ break;
+ case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
+ {
+ DEBUG_PRINT_HIGH("\n Port settings changed info");
+ // get_buffer_req and populate port defn structure
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ omx->m_port_def.nPortIndex = 1;
+ eRet = omx->update_portdef(&(omx->m_port_def));
+ omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
+ OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
+ break;
+ }
+ default:
+ break;
+ }
+ return rc;
+}
+
+OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
+ OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE *buffer
+ )
+{
+ 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 %u, flags %d, timestamp %u",
+ buffer->nFilledLen, buffer->nFlags, (unsigned)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 %d",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,NULL,NULL))
+ {
+ return OMX_ErrorBadParameter;
+ }
+ }
+
+
+ return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
+{
+ 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);
+ }
+ }
+
+ /*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 %d",psource_frame,
+ psource_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
+ 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;
+ }
+ if (ret != OMX_ErrorNone)
+ {
+ DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
+ omx_report_error ();
+ break;
+ }
+ }
+
+ 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,p2,id;
+
+ DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
+ 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 %d source %p frame count %d",
+ pdest_frame->nFilledLen,psource_frame,frame_count);
+
+
+ DEBUG_PRINT_LOW("\n TimeStamp updated %d",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,NULL,NULL);
+ pdest_frame = NULL;
+ }
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Not a Complete Frame %d",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 =%d TimeStamp = %x",
+ pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Found a frame size = %d 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;
+ }
+ }
+ 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 %d",psource_frame,
+ psource_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
+ psource_frame->nFlags,psource_frame->nFilledLen);
+ }
+ }
+ }
+ return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
+{
+ OMX_U32 partial_frame = 1;
+ unsigned address,p2,id;
+ 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 %d "
+ "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
+ DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",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: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 = %d",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 %d",
+ 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 =%d TimeStamp = %x",
+ pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
+ DEBUG_PRINT_LOW("\n Found a frame size = %d 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;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",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 =%d TimeStamp = %x",
+ 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 %d",
+ pdest_frame,h264_scratch.nFilledLen);
+ generate_ebd = OMX_FALSE;
+ }
+ }
+ }
+ 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 %d src length %d",
+ psource_frame->nFlags,psource_frame->nFilledLen);
+ }
+ }
+ return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
+{
+ OMX_U8 *buf, *pdest;
+ OMX_U32 partial_frame = 1;
+ OMX_U32 buf_len, dest_len;
+
+ if(first_frame == 0)
+ {
+ first_frame = 1;
+ DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
+ 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)
+ {
+ m_vc1_profile = VC1_SP_MP_RCV;
+ }
+ else if(*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE)
+ {
+ m_vc1_profile = VC1_AP;
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
+ return OMX_ErrorStreamCorrupt;
+ }
+ }
+ else
+ {
+ pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
+ pdest_frame->nOffset;
+ dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
+ pdest_frame->nOffset);
+
+ if(dest_len < m_vendor_config.nDataSize)
+ {
+ DEBUG_PRINT_ERROR("\nDestination buffer full\n");
+ return OMX_ErrorBadParameter;
+ }
+ else
+ {
+ memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
+ pdest_frame->nFilledLen += m_vendor_config.nDataSize;
+ }
+ }
+ }
+
+ 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)
+ {
+ DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
+ return OMX_ErrorBadParameter;
+ }
+ break;
+
+ case VC1_SP_MP_RCV:
+ default:
+ DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n");
+ return OMX_ErrorBadParameter;
+ }
+ return OMX_ErrorNone;
+}
+
+bool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
+ 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;
+}
+#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)
+{
+ 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;
+ }
+ if(!secure_mode && flag == CACHED)
+ {
+ ion_dev_flag = O_RDONLY;
+ } else {
+ ion_dev_flag = (O_RDONLY | O_DSYNC);
+ }
+ 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->len = buffer_size;
+ alloc_data->align = clip2(alignment);
+ if (alloc_data->align < 4096)
+ {
+ alloc_data->align = 4096;
+ }
+ if(secure_mode) {
+ alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) | ION_SECURE);
+ } else {
+ alloc_data->flags = 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;
+}
+
+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;
+}
+#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;
+
+ 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 (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);
+ drv_ctx.op_buf_ion_info = NULL;
+ }
+#endif
+}
+
+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 (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_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;
+ }
+#ifdef USE_ION
+ if (drv_ctx.ip_buf_ion_info) {
+ DEBUG_PRINT_LOW("\n Free ion context");
+ free(drv_ctx.ip_buf_ion_info);
+ drv_ctx.ip_buf_ion_info = NULL;
+ }
+#endif
+}
+void omx_vdec::stream_off()
+{
+ int rc=0;
+ enum v4l2_buf_type btype;
+ btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ /*TODO: How to handle this case */
+ printf("\n Failed to call streamoff on OUTPUT Port \n");
+ } else {
+ streaming[CAPTURE_PORT] = false;
+ }
+}
+
+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;
+ struct v4l2_format fmt;
+ int ret;
+ DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)",
+ buffer_prop->actualcount, buffer_prop->buffer_size);
+ bufreq.memory = V4L2_MEMORY_USERPTR;
+ if(in_reconfig == true)
+ bufreq.count = 0;
+ else
+ bufreq.count = 2;
+ 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;
+ printf("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);
+
+ drv_ctx.video_resolution.frame_height = fmt.fmt.pix_mp.height;
+ drv_ctx.video_resolution.frame_width = fmt.fmt.pix_mp.width;
+
+ printf("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
+ {
+ buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+ buf_size = buffer_prop->buffer_size;
+ if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+ {
+ DEBUG_PRINT_HIGH("Frame info extra data enabled!");
+ extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+ }
+ if (client_extradata & OMX_INTERLACE_EXTRADATA)
+ {
+ DEBUG_PRINT_HIGH("Interlace extra data enabled!");
+ extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
+ }
+ if (client_extradata & OMX_PORTDEF_EXTRADATA)
+ {
+ extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
+ DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
+ extra_data_size);
+ }
+ if (extra_data_size)
+ {
+ extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
+ buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
+ }
+ buf_size += 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;
+}
+
+OMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ unsigned buf_size = 0;
+ struct v4l2_format fmt;
+ 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;}
+ 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 failed");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE omx_vdec::start_port_reconfig()
+{
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ enum v4l2_buf_type btype;
+ int rc = 0,i;
+ struct v4l2_plane plane;
+ struct v4l2_buffer v4l2_buf ={0};
+ struct v4l2_decoder_cmd dec;
+ dec.cmd = V4L2_DEC_CMD_STOP;
+ rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec);
+ btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ in_reconfig = true;
+ return eRet;
+}
+
+OMX_ERRORTYPE omx_vdec::update_picture_resolution()
+{
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = &drv_ctx.video_resolution;
+ if (/*ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_GET_PICRES, &ioctl_msg)*/0)
+ {
+ DEBUG_PRINT_ERROR("Error VDEC_IOCTL_GET_PICRES");
+ eRet = OMX_ErrorHardware;
+ }
+ 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)
+ {
+ portDefn->eDir = OMX_DirOutput;
+ eRet=get_buffer_req(&drv_ctx.op_buf);
+ if (in_reconfig)
+ {
+ portDefn->nBufferCountActual = op_buf_rcnfg.actualcount;
+ portDefn->nBufferCountMin = op_buf_rcnfg.mincount;
+ portDefn->nBufferSize = op_buf_rcnfg.buffer_size;
+ }
+ else
+ {
+ portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
+ portDefn->nBufferCountMin = drv_ctx.op_buf.mincount;
+ portDefn->nBufferSize = drv_ctx.op_buf.buffer_size;
+ }
+ portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+ portDefn->bEnabled = m_out_bEnabled;
+ portDefn->bPopulated = m_out_bPopulated;
+ if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
+ portDefn->format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+ else if (drv_ctx.output_format == VDEC_YUV_FORMAT_TILE_4x2)
+ portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: Color format unknown: %x\n", drv_ctx.output_format);
+ }
+ }
+ 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_LOW("update_portdef Width = %d Height = %d Stride = %u"
+ "SliceHeight = %u \n", portDefn->format.video.nFrameHeight,
+ portDefn->format.video.nFrameWidth,
+ 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;
+
+ 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);
+
+ 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);
+#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)
+ {
+ 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 = 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;
+#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%x][0x%x]\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;
+ }
+ } else {
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ 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 ();
+ }
+ 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 ();
+ }
+ break;
+ }
+ }
+}
+
+void omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
+{
+ OMX_U32 new_frame_interval = 0;
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
+ && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
+ {
+ new_frame_interval = (act_timestamp > prev_ts)?
+ act_timestamp - prev_ts :
+ prev_ts - act_timestamp;
+ 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(%u) fps(%f)",
+ frm_int, drv_ctx.frame_rate.fps_numerator /
+ (float)drv_ctx.frame_rate.fps_denominator);
+ ioctl_msg.in = &drv_ctx.frame_rate;
+ if (/*ioctl (drv_ctx.video_driver_fd, VDEC_IOCTL_SET_FRAME_RATE,
+ (void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("Setting frame rate failed");
+ }
+ }
+ }
+ }
+ 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;
+ }
+ 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_S64 ts_in_sei = 0;
+ OMX_U32 frame_rate = 0;
+ p_extra = (OMX_OTHER_EXTRADATATYPE *)
+ ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset +
+ p_buf_hdr->nFilledLen + 3)&(~3));
+ if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ p_extra = NULL;
+ if (drv_ctx.extradata && (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA))
+ {
+ // Process driver extradata
+ while(p_extra && p_extra->eType != VDEC_EXTRADATA_NONE)
+ {
+ DEBUG_PRINT_LOW("handle_extradata : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
+ p_buf_hdr, p_buf_hdr->nTimeStamp, p_extra->eType, p_extra->nDataSize);
+ if (p_extra->nSize < p_extra->nDataSize)
+ {
+ DEBUG_PRINT_ERROR(" \n Corrupt metadata Buffer size %d payload size %d",
+ p_extra->nSize, p_extra->nDataSize);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) ||
+ p_extra->nDataSize == 0)
+ p_extra = NULL;
+ continue;
+ }
+ if (p_extra->eType == VDEC_EXTRADATA_MB_ERROR_MAP)
+ {
+ if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+ num_conceal_MB = count_MB_in_extradata(p_extra);
+ if (client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP)
+ // Map driver extradata to corresponding OMX type
+ p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataConcealMB;
+ else
+ p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+ if (m_debug_concealedmb) {
+ DEBUG_PRINT_HIGH("Concealed MB percentage is %u", num_conceal_MB);
+ }
+ }
+ else if (p_extra->eType == VDEC_EXTRADATA_SEI)
+ {
+ p_sei = p_extra;
+
+ h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+
+ p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+ }
+ else if (p_extra->eType == VDEC_EXTRADATA_VUI)
+ {
+ p_vui = p_extra;
+
+ h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
+
+ p_extra->eType = OMX_ExtraDataMax; // Invalid type to avoid expose this extradata to OMX client
+ }
+ print_debug_extradata(p_extra);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ if ((OMX_U8*)p_extra > (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen) ||
+ p_extra->nDataSize == 0)
+ p_extra = NULL;
+ }
+ if (!(client_extradata & VDEC_EXTRADATA_MB_ERROR_MAP))
+ {
+ // Driver extradata is only exposed if MB map is requested by client,
+ // otherwise can be overwritten by omx extradata.
+ p_extra = (OMX_OTHER_EXTRADATATYPE *)
+ ((unsigned)(p_buf_hdr->pBuffer + p_buf_hdr->nOffset +
+ p_buf_hdr->nFilledLen + 3)&(~3));
+ p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+ }
+ }
+
+#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
+ {
+ if (client_extradata & OMX_TIMEINFO_EXTRADATA)
+ {
+ if (p_vui)
+ h264_parser->parse_nal((OMX_U8*)p_vui->data, p_vui->nDataSize, NALU_TYPE_VUI, false);
+ if (p_sei)
+ h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+ ts_in_sei = h264_parser->process_ts_with_sei_vui(p_buf_hdr->nTimeStamp);
+ if (!VALID_TS(p_buf_hdr->nTimeStamp))
+ p_buf_hdr->nTimeStamp = ts_in_sei;
+ }
+ else if ((client_extradata & OMX_FRAMEINFO_EXTRADATA) && p_sei)
+ // If timeinfo is present frame info from SEI is already processed
+ h264_parser->parse_nal((OMX_U8*)p_sei->data, p_sei->nDataSize, NALU_TYPE_SEI);
+ }
+#endif
+ if ((client_extradata & OMX_INTERLACE_EXTRADATA) && p_extra &&
+ ((OMX_U8*)p_extra + OMX_INTERLACE_EXTRADATA_SIZE) <
+ (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ {
+ p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+ append_interlace_extradata(p_extra,
+ ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->interlaced_format);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ }
+ if (client_extradata & OMX_FRAMEINFO_EXTRADATA && p_extra &&
+ ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
+ (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ {
+ p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+ /* vui extra data (frame_rate) information */
+ if (h264_parser)
+ h264_parser->get_frame_rate(&frame_rate);
+ append_frame_info_extradata(p_extra, num_conceal_MB,
+ ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type,
+ p_buf_hdr->nTimeStamp, frame_rate, NULL);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ }
+ if ((client_extradata & OMX_PORTDEF_EXTRADATA) &&
+ p_extra != NULL &&
+ ((OMX_U8*)p_extra + OMX_PORTDEF_EXTRADATA_SIZE) <
+ (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ {
+ p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
+ append_portdef_extradata(p_extra);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
+ }
+ if (p_buf_hdr->nFlags & OMX_BUFFERFLAG_EXTRADATA)
+ if (p_extra &&
+ ((OMX_U8*)p_extra + OMX_FRAMEINFO_EXTRADATA_SIZE) <
+ (p_buf_hdr->pBuffer + p_buf_hdr->nAllocLen))
+ append_terminator_extradata(p_extra);
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: Terminator extradata cannot be added");
+ p_buf_hdr->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+ }
+}
+
+OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_U32 driver_extradata = 0, extradata_size = 0;
+ struct vdec_ioctl_msg ioctl_msg = {NULL, NULL};
+ if(m_state != OMX_StateLoaded)
+ {
+ DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
+ return OMX_ErrorIncorrectStateOperation;
+ }
+ if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
+ extradata_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+ if (requested_extradata & OMX_INTERLACE_EXTRADATA)
+ extradata_size += OMX_INTERLACE_EXTRADATA_SIZE;
+ if (requested_extradata & OMX_PORTDEF_EXTRADATA)
+ {
+ extradata_size += OMX_PORTDEF_EXTRADATA_SIZE;
+ }
+ DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
+ client_extradata, requested_extradata, enable);
+
+ if (enable)
+ requested_extradata |= client_extradata;
+ else
+ {
+ requested_extradata = client_extradata & ~requested_extradata;
+ extradata_size *= -1;
+ }
+
+ driver_extradata = requested_extradata & DRIVER_EXTRADATA_MASK;
+ if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
+ driver_extradata |= VDEC_EXTRADATA_MB_ERROR_MAP; // Required for conceal MB frame info
+#ifdef PROCESS_EXTRADATA_IN_OUTPUT_PORT
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
+ {
+ driver_extradata |= ((requested_extradata & OMX_FRAMEINFO_EXTRADATA)?
+ VDEC_EXTRADATA_SEI : 0); // Required for pan scan frame info
+ driver_extradata |= ((requested_extradata & OMX_TIMEINFO_EXTRADATA)?
+ VDEC_EXTRADATA_VUI | VDEC_EXTRADATA_SEI : 0); //Required for time info
+ }
+
+#endif
+ if (driver_extradata != drv_ctx.extradata)
+ {
+ client_extradata = requested_extradata;
+ drv_ctx.extradata = driver_extradata;
+ //ioctl_msg.in = &drv_ctx.extradata;
+ //ioctl_msg.out = NULL;
+ //if (ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_SET_EXTRADATA,
+ // (void*)&ioctl_msg) < 0)
+ //{
+ // DEBUG_PRINT_ERROR("\nSet extradata failed");
+ // ret = OMX_ErrorUnsupportedSetting;
+ //} // else
+ // ret = get_buffer_req(&drv_ctx.op_buf);
+ }
+ else if ((client_extradata & ~DRIVER_EXTRADATA_MASK) != (requested_extradata & ~DRIVER_EXTRADATA_MASK))
+ {
+ client_extradata = requested_extradata;
+ drv_ctx.op_buf.buffer_size += extradata_size;
+ // align the buffer size
+ drv_ctx.op_buf.buffer_size = (drv_ctx.op_buf.buffer_size + drv_ctx.op_buf.alignment - 1)&(~(drv_ctx.op_buf.alignment - 1));
+ DEBUG_PRINT_LOW("Aligned buffer size with exreadata = %d\n", drv_ctx.op_buf.buffer_size);
+ if (!(client_extradata & ~DRIVER_EXTRADATA_MASK)) // If no omx extradata is required remove space for terminator
+ drv_ctx.op_buf.buffer_size -= sizeof(OMX_OTHER_EXTRADATATYPE);
+ ret = set_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;
+ }
+ 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);
+}
+
+void omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
+{
+ if (!m_debug_extradata)
+ return;
+
+ DEBUG_PRINT_HIGH(
+ "============== Extra Data ==============\n"
+ " Size: %u \n"
+ " Version: %u \n"
+ " PortIndex: %u \n"
+ " Type: %x \n"
+ " DataSize: %u \n",
+ extra->nSize, extra->nVersion.nVersion,
+ extra->nPortIndex, extra->eType, extra->nDataSize);
+
+ if (extra->eType == OMX_ExtraDataInterlaceFormat)
+ {
+ OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
+ DEBUG_PRINT_HIGH(
+ "------ Interlace Format ------\n"
+ " Size: %u \n"
+ " Version: %u \n"
+ " PortIndex: %u \n"
+ " Is Interlace Format: %u \n"
+ " Interlace Formats: %u \n"
+ "=========== End of Interlace ===========\n",
+ intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
+ intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
+ }
+ else if (extra->eType == OMX_ExtraDataFrameInfo)
+ {
+ OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
+
+ DEBUG_PRINT_HIGH(
+ "-------- Frame Format --------\n"
+ " Picture Type: %u \n"
+ " Interlace Type: %u \n"
+ " Pan Scan Total Frame Num: %u \n"
+ " Concealed Macro Blocks: %u \n"
+ " frame rate: %u \n"
+ " Aspect Ratio X: %u \n"
+ " Aspect Ratio Y: %u \n",
+ fminfo->ePicType,
+ fminfo->interlaceType,
+ fminfo->panScan.numWindows,
+ fminfo->nConcealedMacroblocks,
+ fminfo->nFrameRate,
+ fminfo->aspectRatio.aspectRatioX,
+ fminfo->aspectRatio.aspectRatioY);
+
+ for (int i = 0; i < fminfo->panScan.numWindows; i++)
+ {
+ DEBUG_PRINT_HIGH(
+ "------------------------------\n"
+ " Pan Scan Frame Num: %d \n"
+ " Rectangle x: %d \n"
+ " Rectangle y: %d \n"
+ " Rectangle dx: %d \n"
+ " Rectangle dy: %d \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 ========");
+ }
+}
+
+void omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+ OMX_U32 interlaced_format_type)
+{
+ OMX_STREAMINTERLACEFORMAT *interlace_format;
+ OMX_U32 mbaff = 0;
+ 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 == VDEC_InterlaceFrameProgressive) && !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::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+ OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_S64 timestamp, OMX_U32 frame_rate,
+ vdec_aspectratioinfo *aspect_ratio_info)
+{
+ OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
+ 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->panScan,0,sizeof(frame_info->panScan));
+ memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
+ if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
+ {
+ h264_parser->fill_pan_scan_data(&frame_info->panScan, timestamp);
+ h264_parser->fill_aspect_ratio_info(&frame_info->aspectRatio);
+ }
+ frame_info->nConcealedMacroblocks = num_conceal_mb;
+ frame_info->nFrameRate = frame_rate;
+ 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 = %u width = %u stride = %u"
+ "sliceheight = %u \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)
+{
+ 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);
+}
+
+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;
+ }
+ }
+
+ 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;
+}
+
+void omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
+{
+ DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", 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;
+
+ 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;
+ }
+ else
+ index++;
+ }
+ DEBUG_PRINT_LOW("Extracted (%d) 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;
+
+ 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 (%d)", 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%x),nal_size(%d),demux_index(%d)",
+ 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=%d", 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;
+}
+
+#if 0
+OMX_ERRORTYPE omx_vdec::createDivxDrmContext( OMX_PTR drmHandle )
+{
+ OMX_ERRORTYPE err = OMX_ErrorNone;
+ if( drmHandle == NULL ) {
+ DEBUG_PRINT_HIGH("\n This clip is not DRM encrypted");
+ iDivXDrmDecrypt = NULL;
+ return err;
+ }
+
+ iDivXDrmDecrypt = DivXDrmDecrypt::Create( drmHandle );
+ if (iDivXDrmDecrypt) {
+ DEBUG_PRINT_LOW("\nCreated DIVX DRM, now calling Init");
+ 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");
+ return OMX_ErrorUndefined;
+ }
+ return err;
+}
+#endif
+
diff --git a/mm-video/vidc/vdec/src/queue.c b/mm-video/vidc/vdec/src/queue.c
index aefb6811..e0aeb9a4 100644..100755
--- a/mm-video/vidc/vdec/src/queue.c
+++ b/mm-video/vidc/vdec/src/queue.c
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/vdec/src/ts_parser.cpp b/mm-video/vidc/vdec/src/ts_parser.cpp
new file mode 100755
index 00000000..a9503208
--- /dev/null
+++ b/mm-video/vidc/vdec/src/ts_parser.cpp
@@ -0,0 +1,273 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include "ts_parser.h"
+
+#define DEBUG ALOGE
+void omx_time_stamp_reorder::set_timestamp_reorder_mode(bool mode)
+{
+ reorder_ts = mode;
+}
+
+void omx_time_stamp_reorder::enable_debug_print(bool flag)
+{
+ print_debug = flag;
+}
+
+omx_time_stamp_reorder::~omx_time_stamp_reorder()
+{
+ delete_list();
+}
+
+omx_time_stamp_reorder::omx_time_stamp_reorder()
+{
+ reorder_ts = false;
+ phead = pcurrent = NULL;
+ error = false;
+ print_debug = false;
+}
+
+void omx_time_stamp_reorder::delete_list()
+{
+ time_stamp_list *ptemp;
+ if (!phead) return;
+ while(phead->next != phead) {
+ ptemp = phead;
+ phead = phead->next;
+ phead->prev = ptemp->prev;
+ ptemp->prev->next = phead;
+ delete ptemp;
+ }
+ delete phead;
+ phead = NULL;
+}
+
+bool omx_time_stamp_reorder::get_current_list()
+{
+ if (!phead) {
+ if(!add_new_list()) {
+ handle_error();
+ return false;
+ }
+ }
+ pcurrent = phead->prev;
+ return true;
+}
+
+bool omx_time_stamp_reorder::update_head()
+{
+ time_stamp_list *ptemp;
+ if(!phead) return false;
+ if (phead->next != phead) {
+ ptemp = phead;
+ phead = ptemp->next;
+ phead->prev = ptemp->prev;
+ ptemp->prev->next = phead;
+ delete ptemp;
+ }
+ return true;
+}
+
+bool omx_time_stamp_reorder::add_new_list()
+{
+ bool status = true;
+ time_stamp_list *ptemp = NULL;
+ if (!phead) {
+ ptemp = phead = new time_stamp_list;
+ if (!phead) {
+ handle_error();
+ status = false;
+ return status;
+ }
+ phead->prev = phead->next = phead;
+ } else {
+ ptemp = new time_stamp_list;
+ if (!ptemp) {
+ handle_error();
+ status = false;
+ return status;
+ }
+ ptemp->prev = phead->prev;
+ ptemp->next = phead;
+ phead->prev->next = ptemp;
+ phead->prev = ptemp;
+ }
+ ptemp->entries_filled = 0;
+ for(int i=0; i < TIME_SZ; i++) {
+ ptemp->input_timestamps[i].in_use = false;
+ ptemp->input_timestamps[i].timestamps = -1;
+ }
+ return status;
+}
+
+bool omx_time_stamp_reorder::insert_timestamp(OMX_BUFFERHEADERTYPE *header)
+{
+ OMX_TICKS *table_entry = NULL;
+ if (!reorder_ts || error || !header) {
+ if (error || !header)
+ DEBUG("\n Invalid condition in insert_timestamp %p", header);
+ return false;
+ }
+ if(!get_current_list()) {
+ handle_error();
+ return false;
+ }
+ if (pcurrent->entries_filled > (TIME_SZ - 1)) {
+ DEBUG("\n Table full return error");
+ handle_error();
+ return false;
+ }
+ if (header->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+ return true;
+ }
+ if ((header->nFlags & OMX_BUFFERFLAG_EOS) && !header->nFilledLen)
+ {
+ DEBUG("\n EOS with zero length recieved");
+ if (!add_new_list()) {
+ handle_error();
+ return false;
+ }
+ return true;
+ }
+ for(int i = 0; i < TIME_SZ && !table_entry; i++) {
+ if (!pcurrent->input_timestamps[i].in_use) {
+ table_entry = &pcurrent->input_timestamps[i].timestamps;
+ pcurrent->input_timestamps[i].in_use = true;
+ pcurrent->entries_filled++;
+ }
+ }
+ if (!table_entry) {
+ DEBUG("\n All entries in use");
+ handle_error();
+ return false;
+ }
+ *table_entry = header->nTimeStamp;
+ if (print_debug)
+ DEBUG("Time stamp inserted %lld", header->nTimeStamp);
+ if (header->nFlags & OMX_BUFFERFLAG_EOS) {
+ if (!add_new_list()) {
+ handle_error();
+ return false;
+ }
+ }
+ return true;
+}
+
+bool omx_time_stamp_reorder::remove_time_stamp(OMX_TICKS ts, bool is_interlaced = false)
+{
+ unsigned int num_ent_remove = (is_interlaced)?2:1;
+ if (!reorder_ts || error) {
+ DEBUG("\n not in avi mode");
+ return false;
+ }
+ if (!phead || !phead->entries_filled) return false;
+ for(int i=0; i < TIME_SZ && num_ent_remove; i++) {
+ if (phead->input_timestamps[i].in_use && phead->input_timestamps[i].timestamps == ts) {
+ phead->input_timestamps[i].in_use = false;
+ phead->entries_filled--;
+ num_ent_remove--;
+ if (print_debug)
+ DEBUG("Removed TS %lld", ts);
+ }
+ }
+ if (!phead->entries_filled) {
+ if (!update_head()) {
+ handle_error();
+ return false;
+ }
+ }
+ return true;
+}
+
+void omx_time_stamp_reorder::flush_timestamp()
+{
+ delete_list();
+}
+
+bool omx_time_stamp_reorder::get_next_timestamp(OMX_BUFFERHEADERTYPE *header, bool is_interlaced)
+{
+ timestamp *element = NULL,*duplicate = NULL;
+ bool status = false;
+ if (!reorder_ts || error || !header) {
+ if (error || !header)
+ DEBUG("\n Invalid condition in insert_timestamp %p", header);
+ return false;
+ }
+ if(!phead || !phead->entries_filled) return false;
+ for(int i=0; i < TIME_SZ; i++) {
+ if (phead->input_timestamps[i].in_use) {
+ status = true;
+ if (!element)
+ element = &phead->input_timestamps[i];
+ else {
+ if (element->timestamps > phead->input_timestamps[i].timestamps){
+ element = &phead->input_timestamps[i];
+ duplicate = NULL;
+ } else if(element->timestamps == phead->input_timestamps[i].timestamps)
+ duplicate = &phead->input_timestamps[i];
+ }
+ }
+ }
+ if (element) {
+ phead->entries_filled--;
+ header->nTimeStamp = element->timestamps;
+ if (print_debug)
+ DEBUG("Getnext Time stamp %lld", header->nTimeStamp);
+ element->in_use = false;
+ }
+ if(is_interlaced && duplicate) {
+ phead->entries_filled--;
+ duplicate->in_use = false;
+ }
+ else if(is_interlaced && status)
+ {
+ for(int i=0; i < TIME_SZ; i++) {
+ if (phead->input_timestamps[i].in_use) {
+ if (!duplicate)
+ duplicate = &phead->input_timestamps[i];
+ else {
+ if (duplicate->timestamps > phead->input_timestamps[i].timestamps)
+ duplicate = &phead->input_timestamps[i];
+ }
+ }
+ }
+ if (duplicate) {
+ phead->entries_filled--;
+ if (print_debug)
+ DEBUG("Getnext Duplicate Time stamp %lld", header->nTimeStamp);
+ duplicate->in_use = false;
+ }
+ }
+
+ if (!phead->entries_filled) {
+ if (!update_head()) {
+ handle_error();
+ return false;
+ }
+ }
+ return status;
+}
diff --git a/mm-video/vidc/vdec/test/decoder_driver_test.c b/mm-video/vidc/vdec/test/decoder_driver_test.c
index 2e0bc19f..1998acce 100644..100755
--- a/mm-video/vidc/vdec/test/decoder_driver_test.c
+++ b/mm-video/vidc/vdec/test/decoder_driver_test.c
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -87,22 +87,20 @@ int main (int argc, char **argv)
decoder_context = (struct video_decoder_context *) \
calloc (sizeof (struct video_decoder_context),1);
-
- decoder_context->outputBufferFile = NULL;
- decoder_context->inputBufferFile = NULL;
- decoder_context->video_driver_fd = -1;
-
if (decoder_context == NULL)
{
return -1;
}
-
+ decoder_context->outputBufferFile = NULL;
+ decoder_context->inputBufferFile = NULL;
+ decoder_context->video_driver_fd = -1;
decoder_context->inputBufferFile = file_ptr;
file_ptr = fopen ("/data/output.yuv","wb");
if (file_ptr == NULL)
{
DEBUG_PRINT("\n File can't be created");
+ free (decoder_context);
return -1;
}
decoder_context->outputBufferFile = file_ptr;
@@ -219,7 +217,13 @@ int init_decoder ( struct video_decoder_context *init_decode )
{
struct vdec_ioctl_msg ioctl_msg = {NULL,NULL};
struct video_queue_context *queue_ptr = NULL;
+#ifdef MAX_RES_720P
enum vdec_output_fromat output_format = VDEC_YUV_FORMAT_NV12;
+#endif
+#ifdef MAX_RES_1080P
+ enum vdec_output_fromat output_format = VDEC_YUV_FORMAT_TILE_4x2;
+#endif
+
pthread_mutexattr_t init_values;
DEBUG_PRINT("\n Before calling the open");
@@ -237,8 +241,8 @@ int init_decoder ( struct video_decoder_context *init_decode )
/*Initialize Decoder with codec type and resolution*/
- ioctl_msg.inputparam = &init_decode->decoder_format;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &init_decode->decoder_format;
+ ioctl_msg.out = NULL;
if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_CODEC,
(void*)&ioctl_msg) < 0)
@@ -248,8 +252,8 @@ int init_decoder ( struct video_decoder_context *init_decode )
}
/*Set the output format*/
- ioctl_msg.inputparam = &output_format;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &output_format;
+ ioctl_msg.out = NULL;
if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_OUTPUT_FORMAT,
(void*)&ioctl_msg) < 0)
@@ -258,8 +262,8 @@ int init_decoder ( struct video_decoder_context *init_decode )
return -1;
}
- ioctl_msg.inputparam = &init_decode->video_resoultion;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &init_decode->video_resoultion;
+ ioctl_msg.out = NULL;
if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_PICRES,
(void*)&ioctl_msg) < 0)
@@ -273,8 +277,8 @@ int init_decoder ( struct video_decoder_context *init_decode )
/*Get the Buffer requirements for input and output ports*/
init_decode->input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &init_decode->input_buffer;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = &init_decode->input_buffer;
if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
(void*)&ioctl_msg) < 0)
@@ -290,8 +294,8 @@ int init_decoder ( struct video_decoder_context *init_decode )
init_decode->input_buffer.buffer_type = VDEC_BUFFER_TYPE_INPUT;
- ioctl_msg.inputparam = &init_decode->input_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &init_decode->input_buffer;
+ ioctl_msg.out = NULL;
init_decode->input_buffer.actualcount = init_decode->input_buffer.mincount + 2;
if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_SET_BUFFER_REQ,
@@ -304,8 +308,8 @@ int init_decoder ( struct video_decoder_context *init_decode )
DEBUG_PRINT("\n Query output bufffer requirements");
init_decode->output_buffer.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &init_decode->output_buffer;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = &init_decode->output_buffer;
if (ioctl (init_decode->video_driver_fd,VDEC_IOCTL_GET_BUFFER_REQ,
(void*)&ioctl_msg) < 0)
@@ -488,6 +492,7 @@ int allocate_buffer ( enum vdec_buffer buffer_dir,
if (decode_context->ptr_respbuffer == NULL)
{
DEBUG_PRINT ("\n Allocate failure ptr_respbuffer");
+ return -1;
}
for (i=0; i< buffercount; i++)
@@ -551,11 +556,11 @@ int allocate_buffer ( enum vdec_buffer buffer_dir,
for (i=0; i< buffercount; i++)
{
- ptemp [i]->pmem_fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+ ptemp [i]->pmem_fd = open ("/dev/pmem_adsp",O_RDWR);
if (ptemp [i]->pmem_fd < 0)
{
- DEBUG_PRINT ("\nallocate_buffer: open pmem failed");
+ DEBUG_PRINT ("\nallocate_buffer: open pmem_adsp failed");
return -1;
}
@@ -575,8 +580,8 @@ int allocate_buffer ( enum vdec_buffer buffer_dir,
setbuffers.buffer_type = buffer_dir;
memcpy (&setbuffers.buffer,ptemp [i],sizeof (struct vdec_bufferpayload));
- ioctl_msg.inputparam = &setbuffers;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &setbuffers;
+ ioctl_msg.out = NULL;
if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_SET_BUFFER,
&ioctl_msg) < 0)
@@ -633,8 +638,8 @@ int start_decoding (struct video_decoder_context *decode_context)
decode_context->ptr_outputbuffer [i]->pmem_fd;
fillbuffer.client_data = (void *)decode_context->ptr_respbuffer [i];
DEBUG_PRINT ("\n Client Data on output = %p",fillbuffer.client_data);
- ioctl_msg.inputparam = &fillbuffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &fillbuffer;
+ ioctl_msg.out = NULL;
if (ioctl (decode_context->video_driver_fd,
VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
@@ -669,8 +674,8 @@ int start_decoding (struct video_decoder_context *decode_context)
frameinfo.client_data = (struct vdec_bufferpayload *)\
decode_context->ptr_inputbuffer [i];
/*TODO: Time stamp needs to be updated*/
- ioctl_msg.inputparam = &frameinfo;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &frameinfo;
+ ioctl_msg.out = NULL;
if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
&ioctl_msg) < 0)
@@ -699,8 +704,8 @@ int stop_decoding (struct video_decoder_context *decode_context)
return -1;
}
- ioctl_msg.inputparam = &flush_dir;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &flush_dir;
+ ioctl_msg.out = NULL;
if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_FLUSH,
&ioctl_msg) < 0)
@@ -713,8 +718,8 @@ int stop_decoding (struct video_decoder_context *decode_context)
}
flush_dir = VDEC_FLUSH_TYPE_OUTPUT;
- ioctl_msg.inputparam = &flush_dir;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &flush_dir;
+ ioctl_msg.out = NULL;
if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_CMD_FLUSH,
&ioctl_msg) < 0)
@@ -850,8 +855,8 @@ static void* video_thread (void *context)
frameinfo.client_data = (struct vdec_bufferpayload *)\
tempbuffer;
/*TODO: Time stamp needs to be updated*/
- ioctl_msg.inputparam = &frameinfo;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &frameinfo;
+ ioctl_msg.out = NULL;
total_frames++;
if (ioctl(decode_context->video_driver_fd,VDEC_IOCTL_DECODE_FRAME,
&ioctl_msg) < 0)
@@ -874,10 +879,13 @@ static void* video_thread (void *context)
{
DEBUG_PRINT("\n FATAL ERROR output buffer is bad");
DEBUG_PRINT("\nValues outputbuffer = %p",outputbuffer);
+ if (outputbuffer != NULL)
+ {
DEBUG_PRINT("\nValues outputbuffer->bufferaddr = %p",\
outputbuffer->bufferaddr);
DEBUG_PRINT("\nValues outputbuffer->client_data = %p",\
outputbuffer->client_data);
+ }
sem_post (&decode_context->sem_synchronize);
break;
}
@@ -910,8 +918,8 @@ static void* video_thread (void *context)
fillbuffer.buffer.pmem_fd = tempbuffer->pmem_fd;
fillbuffer.client_data = (void *)outputbuffer;
- ioctl_msg.inputparam = &fillbuffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &fillbuffer;
+ ioctl_msg.out = NULL;
if (ioctl (decode_context->video_driver_fd,
VDEC_IOCTL_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
@@ -931,18 +939,19 @@ static void* video_thread (void *context)
DEBUG_PRINT("\n Flush output complete");
sem_post (&decode_context->sem_synchronize);
break;
- }
+ }
+
+ if (queueitem->cmd == VDEC_MSG_RESP_STOP_DONE)
+ {
+ DEBUG_PRINT("\n Playback has ended thread will exit");
+ return NULL;
+ }
}
else
{
DEBUG_PRINT("\n Error condition recieved NULL from Queue");
}
- if (queueitem->cmd == VDEC_MSG_RESP_STOP_DONE)
- {
- DEBUG_PRINT("\n Playback has ended thread will exit");
- return NULL;
- }
}
}
@@ -965,12 +974,12 @@ static void* async_thread (void *context)
while (1)
{
- ioctl_msg.inputparam = NULL;
+ ioctl_msg.in = NULL;
- ioctl_msg.outputparam = (void*)&vdec_msg;
+ ioctl_msg.out = (void*)&vdec_msg;
DEBUG_PRINT ("\n Sizeof vdec_msginfo = %d ",sizeof (vdec_msg));
DEBUG_PRINT("\n Address of Vdec msg in async thread %p",\
- ioctl_msg.outputparam);
+ ioctl_msg.out);
if (ioctl (decode_context->video_driver_fd,VDEC_IOCTL_GET_NEXT_MSG,\
(void*)&ioctl_msg) < 0)
{
@@ -1063,7 +1072,7 @@ static unsigned int read_frame (unsigned char *dataptr, unsigned int length,
DEBUG_PRINT ("\n Inside the readframe");
- if (dataptr == NULL && length == 0)
+ if (dataptr == NULL || length == 0)
{
DEBUG_PRINT ("\n dataptr = %p length = %u",dataptr,length);
return 0;
@@ -1161,8 +1170,8 @@ static int Read_Buffer_From_DAT_File(unsigned char *dataptr, unsigned int length
int i=0;
unsigned char *read_buffer=NULL;
char c = '1'; //initialize to anything except '\0'(0)
- char inputFrameSize[10];
- int count =0; int cnt =0;
+ char inputFrameSize[12];
+ int count =0; char cnt =0;
memset(temp_buffer, 0, sizeof(temp_buffer));
while (cnt < 10)
@@ -1176,7 +1185,7 @@ static int Read_Buffer_From_DAT_File(unsigned char *dataptr, unsigned int length
inputFrameSize[cnt]='\0';
frameSize = atoi(inputFrameSize);
//length = 0;
- DEBUG_PRINT ("\n Frame Size is %ld",frameSize);
+ DEBUG_PRINT ("\n Frame Size is %d",frameSize);
/* get the frame length */
fseek(inputBufferFile, -1, SEEK_CUR);
diff --git a/mm-video/vidc/vdec/test/omx_vdec_test.cpp b/mm-video/vidc/vdec/test/omx_vdec_test.cpp
index b528fbcd..14e445a5 100644..100755
--- a/mm-video/vidc/vdec/test/omx_vdec_test.cpp
+++ b/mm-video/vidc/vdec/test/omx_vdec_test.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -29,8 +29,6 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
An Open max test application ....
*/
-#define LOG_TAG "OMX-VDEC-TEST"
-
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -44,6 +42,9 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <pthread.h>
#include <semaphore.h>
#include "OMX_QCOMExtns.h"
+#include <sys/time.h>
+
+#include <linux/android_pmem.h>
#ifdef _ANDROID_
#include <binder/MemoryHeapBase.h>
@@ -51,10 +52,22 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
extern "C"{
#include<utils/Log.h>
}
+#define LOG_TAG "OMX-VDEC-TEST"
#define DEBUG_PRINT
-#define DEBUG_PRINT_ERROR
+#define DEBUG_PRINT_ERROR ALOGE
+
+//#define __DEBUG_DIVX__ // Define this macro to print (through logcat)
+ // the kind of frames packed per buffer and
+ // timestamps adjustments for divx.
+
+//#define TEST_TS_FROM_SEI // Define this macro to calculate the timestamps
+ // from the SEI and VUI data for H264
#else
+#include <glib.h>
+#define strlcpy g_strlcpy
+
+#define ALOGE(fmt, args...) fprintf(stderr, fmt, ##args)
#define DEBUG_PRINT printf
#define DEBUG_PRINT_ERROR printf
#endif /* _ANDROID_ */
@@ -66,13 +79,9 @@ extern "C" {
#include "queue.h"
}
+#include <inttypes.h>
#include <linux/msm_mdp.h>
#include <linux/fb.h>
-//#include "qutility.h"
-
-#define DEBUG_PRINT(...) printf(__VA_ARGS__)
-#define DEBUG_PRINT_ERROR(...) printf(__VA_ARGS__)
-#define DEBUG_PRINT_LOW(...) printf(__VA_ARGS__)
/************************************************************************/
/* #DEFINES */
@@ -82,12 +91,17 @@ extern "C" {
#define true 1
#define VOP_START_CODE 0x000001B6
#define SHORT_HEADER_START_CODE 0x00008000
+#define MPEG2_FRAME_START_CODE 0x00000100
+#define MPEG2_SEQ_START_CODE 0x000001B3
#define VC1_START_CODE 0x00000100
#define VC1_FRAME_START_CODE 0x0000010D
+#define VC1_FRAME_FIELD_CODE 0x0000010C
+#define VC1_SEQUENCE_START_CODE 0x0000010F
+#define VC1_ENTRY_POINT_START_CODE 0x0000010E
#define NUMBER_OF_ARBITRARYBYTES_READ (4 * 1024)
#define VC1_SEQ_LAYER_SIZE_WITHOUT_STRUCTC 32
#define VC1_SEQ_LAYER_SIZE_V1_WITHOUT_STRUCTC 16
-
+static int previous_vc1_au = 0;
#define CONFIG_VERSION_SIZE(param) \
param.nVersion.nVersion = CURRENT_OMX_SPEC_VERSION;\
param.nSize = sizeof(param);
@@ -99,6 +113,18 @@ extern "C" {
#define SIZE_NAL_FIELD_MAX 4
#define MDP_DEINTERLACE 0x80000000
+#define ALLOCATE_BUFFER 0
+
+#ifdef MAX_RES_720P
+#define PMEM_DEVICE "/dev/pmem_adsp"
+#elif MAX_RES_1080P_EBI
+#define PMEM_DEVICE "/dev/pmem_adsp"
+#elif MAX_RES_1080P
+#define PMEM_DEVICE "/dev/pmem_smipool"
+#endif
+
+//#define USE_EXTERN_PMEM_BUF
+
/************************************************************************/
/* GLOBAL DECLARATIONS */
/************************************************************************/
@@ -111,7 +137,9 @@ typedef enum {
CODEC_FORMAT_MP4,
CODEC_FORMAT_H263,
CODEC_FORMAT_VC1,
- CODEC_FORMAT_MAX = CODEC_FORMAT_VC1
+ CODEC_FORMAT_DIVX,
+ CODEC_FORMAT_MPEG2,
+ CODEC_FORMAT_MAX = CODEC_FORMAT_MPEG2
} codec_format;
typedef enum {
@@ -127,14 +155,21 @@ typedef enum {
FILE_TYPE_START_OF_VC1_SPECIFIC = 30,
FILE_TYPE_RCV = FILE_TYPE_START_OF_VC1_SPECIFIC,
- FILE_TYPE_VC1
+ FILE_TYPE_VC1,
+
+ FILE_TYPE_START_OF_DIVX_SPECIFIC = 40,
+ FILE_TYPE_DIVX_4_5_6 = FILE_TYPE_START_OF_DIVX_SPECIFIC,
+ FILE_TYPE_DIVX_311,
+
+ FILE_TYPE_START_OF_MPEG2_SPECIFIC = 50,
+ FILE_TYPE_MPEG2_START_CODE = FILE_TYPE_START_OF_MPEG2_SPECIFIC
+
} file_type;
typedef enum {
GOOD_STATE = 0,
PORT_SETTING_CHANGE_STATE,
- ERROR_STATE,
- INVALID_STATE
+ ERROR_STATE
} test_status;
typedef enum {
@@ -144,15 +179,21 @@ typedef enum {
FREE_HANDLE_AT_PAUSE
} freeHandle_test;
+struct temp_egl {
+ int pmem_fd;
+ int offset;
+};
+
static int (*Read_Buffer)(OMX_BUFFERHEADERTYPE *pBufHdr );
-FILE * inputBufferFile;
+int inputBufferFileFd;
+
FILE * outputBufferFile;
FILE * seqFile;
int takeYuvLog = 0;
+int displayYuv = 0;
int displayWindow = 0;
int realtime_display = 0;
-struct timeval t_avsync={0,0};
Queue *etb_queue = NULL;
Queue *fbd_queue = NULL;
@@ -166,11 +207,9 @@ pthread_mutex_t etb_lock;
pthread_mutex_t fbd_lock;
pthread_mutex_t lock;
pthread_cond_t cond;
-pthread_mutex_t elock;
-pthread_cond_t econd;
-pthread_cond_t fcond;
pthread_mutex_t eos_lock;
pthread_cond_t eos_cond;
+pthread_mutex_t enable_lock;
sem_t etb_sem;
sem_t fbd_sem;
@@ -180,6 +219,15 @@ sem_t in_flush_sem, out_flush_sem;
OMX_PARAM_PORTDEFINITIONTYPE portFmt;
OMX_PORT_PARAM_TYPE portParam;
OMX_ERRORTYPE error;
+OMX_COLOR_FORMATTYPE color_fmt;
+static bool input_use_buffer = false,output_use_buffer = false;
+QOMX_VIDEO_DECODER_PICTURE_ORDER picture_order;
+
+#ifdef MAX_RES_1080P
+unsigned int color_fmt_type = 1;
+#else
+unsigned int color_fmt_type = 0;
+#endif
#define CLR_KEY 0xe8fd
#define COLOR_BLACK_RGBA_8888 0x00000000
@@ -188,38 +236,51 @@ OMX_ERRORTYPE error;
static int fb_fd = -1;
static struct fb_var_screeninfo vinfo;
static struct fb_fix_screeninfo finfo;
+static struct mdp_overlay overlay, *overlayp;
+static struct msmfb_overlay_data ov_front;
static int vid_buf_front_id;
+static char tempbuf[16];
int overlay_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr);
void overlay_set();
void overlay_unset();
void render_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr);
-
+int disable_output_port();
+int enable_output_port();
+int output_port_reconfig();
+void free_output_buffers();
+int open_display();
+void close_display();
/************************************************************************/
/* GLOBAL INIT */
/************************************************************************/
-unsigned int input_buf_cnt = 0;
+int input_buf_cnt = 0;
int height =0, width =0;
int sliceheight = 0, stride = 0;
int used_ip_buf_cnt = 0;
+unsigned free_op_buf_cnt = 0;
volatile int event_is_done = 0;
-int ebd_cnt, fbd_cnt;
+int ebd_cnt= 0, fbd_cnt = 0;
int bInputEosReached = 0;
int bOutputEosReached = 0;
char in_filename[512];
char seq_file_name[512];
-unsigned char seq_enabled = 0, flush_in_progress = 0;
-unsigned int cmd_data = 0, etb_count = 0;;
+unsigned char seq_enabled = 0;
+bool anti_flickering = true;
+unsigned char flush_input_progress = 0, flush_output_progress = 0;
+unsigned cmd_data = ~(unsigned)0, etb_count = 0;
char curr_seq_command[100];
-int timeStampLfile = 0;
-int timestampInterval = 33333;
+OMX_S64 timeStampLfile = 0;
+int fps = 30;
+unsigned int timestampInterval = 33333;
codec_format codec_format_option;
file_type file_type_option;
freeHandle_test freeHandle_option;
-int nalSize;
+int nalSize = 0;
int sent_disabled = 0;
int waitForPortSettingsChanged = 1;
test_status currentStatus = GOOD_STATE;
+struct timeval t_start = {0, 0}, t_end = {0, 0};
//* OMX Spec Version supported by the wrappers. Version = 1.1 */
const OMX_U32 CURRENT_OMX_SPEC_VERSION = 0x00000101;
@@ -228,7 +289,18 @@ OMX_COMPONENTTYPE* dec_handle = 0;
OMX_BUFFERHEADERTYPE **pInputBufHdrs = NULL;
OMX_BUFFERHEADERTYPE **pOutYUVBufHdrs= NULL;
+static OMX_BOOL use_external_pmem_buf = OMX_FALSE;
+
int rcv_v1=0;
+static struct temp_egl **p_eglHeaders = NULL;
+static unsigned use_buf_virt_addr[32];
+
+OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList = NULL;
+OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry = NULL;
+OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
+
+
+static int bHdrflag = 0;
/* Performance related variable*/
//QPERF_INIT(render_fb);
@@ -249,16 +321,36 @@ static int open_video_file ();
static int Read_Buffer_From_DAT_File(OMX_BUFFERHEADERTYPE *pBufHdr );
static int Read_Buffer_ArbitraryBytes(OMX_BUFFERHEADERTYPE *pBufHdr);
static int Read_Buffer_From_Vop_Start_Code_File(OMX_BUFFERHEADERTYPE *pBufHdr);
+static int Read_Buffer_From_Mpeg2_Start_Code(OMX_BUFFERHEADERTYPE *pBufHdr);
static int Read_Buffer_From_Size_Nal(OMX_BUFFERHEADERTYPE *pBufHdr);
static int Read_Buffer_From_RCV_File_Seq_Layer(OMX_BUFFERHEADERTYPE *pBufHdr);
static int Read_Buffer_From_RCV_File(OMX_BUFFERHEADERTYPE *pBufHdr);
static int Read_Buffer_From_VC1_File(OMX_BUFFERHEADERTYPE *pBufHdr);
+static int Read_Buffer_From_DivX_4_5_6_File(OMX_BUFFERHEADERTYPE *pBufHdr);
+static int Read_Buffer_From_DivX_311_File(OMX_BUFFERHEADERTYPE *pBufHdr);
static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *dec_handle,
OMX_BUFFERHEADERTYPE ***pBufHdrs,
OMX_U32 nPortIndex,
long bufCntMin, long bufSize);
+static OMX_ERRORTYPE use_input_buffer(OMX_COMPONENTTYPE *dec_handle,
+ OMX_BUFFERHEADERTYPE ***bufferHdr,
+ OMX_U32 nPortIndex,
+ OMX_U32 bufSize,
+ long bufcnt);
+
+static OMX_ERRORTYPE use_output_buffer(OMX_COMPONENTTYPE *dec_handle,
+ OMX_BUFFERHEADERTYPE ***bufferHdr,
+ OMX_U32 nPortIndex,
+ OMX_U32 bufSize,
+ long bufcnt);
+
+static OMX_ERRORTYPE use_output_buffer_multiple_fd(OMX_COMPONENTTYPE *dec_handle,
+ OMX_BUFFERHEADERTYPE ***bufferHdr,
+ OMX_U32 nPortIndex,
+ OMX_U32 bufSize,
+ long bufcnt);
static OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_PTR pAppData,
@@ -274,15 +366,21 @@ static OMX_ERRORTYPE FillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent,
static void do_freeHandle_and_clean_up(bool isDueToError);
-/*static usecs_t get_time(void)
-{
- struct timeval tv;
- gettimeofday(&tv, 0);
- return ((usecs_t)tv.tv_usec) +
- (((usecs_t)tv.tv_sec) * ((usecs_t)1000000));
-}*/
-
-
+#ifndef USE_ION
+static bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
+ OMX_U32 alignment);
+#endif
+void getFreePmem();
+static int clip2(int x)
+ {
+ x = x -1;
+ x = x | x >> 1;
+ x = x | x >> 2;
+ x = x | x >> 4;
+ x = x | x >> 16;
+ x = x + 1;
+ return x;
+ }
void wait_for_event(void)
{
DEBUG_PRINT("Waiting for event\n");
@@ -317,12 +415,11 @@ int get_next_command(FILE *seq_file)
return 0;
}
-void process_current_command(const char *seq_command)
+int process_current_command(const char *seq_command)
{
char *data_str = NULL;
unsigned int data = 0, bufCnt = 0, i = 0;
int frameSize;
- OMX_ERRORTYPE ret;
if(strstr(seq_command, "pause") == seq_command)
{
@@ -332,10 +429,15 @@ void process_current_command(const char *seq_command)
printf("\n After frame number %u", data);
cmd_data = data;
sem_wait(&seq_sem);
- printf("\n Sending PAUSE cmd to OMX compt");
- OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StatePause,0);
- wait_for_event();
- printf("\n EventHandler for PAUSE DONE");
+ if (!bOutputEosReached && !bInputEosReached)
+ {
+ printf("\n Sending PAUSE cmd to OMX compt");
+ OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StatePause,0);
+ wait_for_event();
+ printf("\n EventHandler for PAUSE DONE");
+ }
+ else
+ seq_enabled = 0;
}
else if(strstr(seq_command, "sleep") == seq_command)
{
@@ -349,7 +451,7 @@ void process_current_command(const char *seq_command)
{
printf("\n\n $$$$$ RESUME $$$$$");
printf("\n Immediate effect");
- printf("\n Sending PAUSE cmd to OMX compt");
+ printf("\n Sending RESUME cmd to OMX compt");
OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateExecuting,0);
wait_for_event();
printf("\n EventHandler for RESUME DONE");
@@ -360,18 +462,60 @@ void process_current_command(const char *seq_command)
data_str = (char*)seq_command + strlen("flush") + 1;
data = atoi(data_str);
printf("\n After frame number %u", data);
+ if (previous_vc1_au)
+ {
+ printf("\n Flush not allowed on Field boundary");
+ return 0;
+ }
cmd_data = data;
sem_wait(&seq_sem);
- printf("\n Sending FLUSH cmd to OMX compt");
- flush_in_progress = 1;
- OMX_SendCommand(dec_handle, OMX_CommandFlush, OMX_ALL, 0);
- wait_for_event();
- flush_in_progress = 0;
- printf("\n EventHandler for FLUSH DONE");
- printf("\n Post EBD_thread flush sem");
- sem_post(&in_flush_sem);
- printf("\n Post FBD_thread flush sem");
- sem_post(&out_flush_sem);
+ if (!bOutputEosReached && !bInputEosReached)
+ {
+ printf("\n Sending FLUSH cmd to OMX compt");
+ flush_input_progress = 1;
+ flush_output_progress = 1;
+ OMX_SendCommand(dec_handle, OMX_CommandFlush, OMX_ALL, 0);
+ wait_for_event();
+ printf("\n EventHandler for FLUSH DONE");
+ printf("\n Post EBD_thread flush sem");
+ sem_post(&in_flush_sem);
+ printf("\n Post FBD_thread flush sem");
+ sem_post(&out_flush_sem);
+ }
+ else
+ seq_enabled = 0;
+ }
+ else if(strstr(seq_command, "disable_op") == seq_command)
+ {
+ printf("\n\n $$$$$ DISABLE OP PORT $$$$$");
+ data_str = (char*)seq_command + strlen("disable_op") + 1;
+ data = atoi(data_str);
+ printf("\n After frame number %u", data);
+ cmd_data = data;
+ sem_wait(&seq_sem);
+ printf("\n Sending DISABLE OP cmd to OMX compt");
+ if (disable_output_port() != 0)
+ {
+ printf("\n ERROR: While DISABLE OP...");
+ do_freeHandle_and_clean_up(true);
+ return -1;
+ }
+ else
+ printf("\n EventHandler for DISABLE OP");
+ }
+ else if(strstr(seq_command, "enable_op") == seq_command)
+ {
+ printf("\n\n $$$$$ ENABLE OP PORT $$$$$");
+ data_str = (char*)seq_command + strlen("enable_op") + 1;
+ printf("\n Sending ENABLE OP cmd to OMX compt");
+ if (enable_output_port() != 0)
+ {
+ printf("\n ERROR: While ENABLE OP...");
+ do_freeHandle_and_clean_up(true);
+ return -1;
+ }
+ else
+ printf("\n EventHandler for ENABLE OP");
}
else
{
@@ -379,20 +523,60 @@ void process_current_command(const char *seq_command)
printf("\n seq_command[%s] is invalid", seq_command);
seq_enabled = 0;
}
+ return 0;
}
+void PrintFramePackArrangement(OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement)
+{
+ printf("id (%d)\n",
+ framePackingArrangement.id);
+ printf("cancel_flag (%d)\n",
+ framePackingArrangement.cancel_flag);
+ printf("type (%d)\n",
+ framePackingArrangement.type);
+ printf("quincunx_sampling_flag (%d)\n",
+ framePackingArrangement.quincunx_sampling_flag);
+ printf("content_interpretation_type (%d)\n",
+ framePackingArrangement.content_interpretation_type);
+ printf("spatial_flipping_flag (%d)\n",
+ framePackingArrangement.spatial_flipping_flag);
+ printf("frame0_flipped_flag (%d)\n",
+ framePackingArrangement.frame0_flipped_flag);
+ printf("field_views_flag (%d)\n",
+ framePackingArrangement.field_views_flag);
+ printf("current_frame_is_frame0_flag (%d)\n",
+ framePackingArrangement.current_frame_is_frame0_flag);
+ printf("frame0_self_contained_flag (%d)\n",
+ framePackingArrangement.frame0_self_contained_flag);
+ printf("frame1_self_contained_flag (%d)\n",
+ framePackingArrangement.frame1_self_contained_flag);
+ printf("frame0_grid_position_x (%d)\n",
+ framePackingArrangement.frame0_grid_position_x);
+ printf("frame0_grid_position_y (%d)\n",
+ framePackingArrangement.frame0_grid_position_y);
+ printf("frame1_grid_position_x (%d)\n",
+ framePackingArrangement.frame1_grid_position_x);
+ printf("frame1_grid_position_y (%d)\n",
+ framePackingArrangement.frame1_grid_position_y);
+ printf("reserved_byte (%d)\n",
+ framePackingArrangement.reserved_byte);
+ printf("repetition_period (%d)\n",
+ framePackingArrangement.repetition_period);
+ printf("extension_flag (%d)\n",
+ framePackingArrangement.extension_flag);
+}
void* ebd_thread(void* pArg)
{
- while(currentStatus != INVALID_STATE)
+ while(currentStatus != ERROR_STATE)
{
int readBytes =0;
OMX_BUFFERHEADERTYPE* pBuffer = NULL;
- if(flush_in_progress)
+ if(flush_input_progress)
{
- printf("\n EBD_thread flush wait start");
+ DEBUG_PRINT("\n EBD_thread flush wait start");
sem_wait(&in_flush_sem);
- printf("\n EBD_thread flush wait complete");
+ DEBUG_PRINT("\n EBD_thread flush wait complete");
}
sem_wait(&etb_sem);
@@ -408,27 +592,19 @@ void* ebd_thread(void* pArg)
pBuffer->nOffset = 0;
if((readBytes = Read_Buffer(pBuffer)) > 0) {
pBuffer->nFilledLen = readBytes;
+ DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pBuffer->nTimeStamp);
OMX_EmptyThisBuffer(dec_handle,pBuffer);
etb_count++;
- if(cmd_data == etb_count)
- {
- sem_post(&seq_sem);
- printf("\n Posted seq_sem");
- }
}
else
{
pBuffer->nFlags |= OMX_BUFFERFLAG_EOS;
bInputEosReached = true;
pBuffer->nFilledLen = readBytes;
+ DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pBuffer->nTimeStamp);
OMX_EmptyThisBuffer(dec_handle,pBuffer);
DEBUG_PRINT("EBD::Either EOS or Some Error while reading file\n");
etb_count++;
- if(cmd_data == etb_count)
- {
- sem_post(&seq_sem);
- printf("\n Posted seq_sem");
- }
break;
}
}
@@ -437,120 +613,300 @@ void* ebd_thread(void* pArg)
void* fbd_thread(void* pArg)
{
- while(currentStatus != INVALID_STATE)
+ long unsigned act_time = 0, display_time = 0, render_time = 5e3, lipsync = 15e3;
+ struct timeval t_avsync = {0, 0}, base_avsync = {0, 0};
+ float total_time = 0;
+ int canDisplay = 1, contigous_drop_frame = 0, bytes_written = 0, ret = 0;
+ OMX_S64 base_timestamp = 0, lastTimestamp = 0;
+ OMX_BUFFERHEADERTYPE *pBuffer = NULL, *pPrevBuff = NULL;
+ pthread_mutex_lock(&eos_lock);
+
+ DEBUG_PRINT("First Inside %s\n", __FUNCTION__);
+ while(currentStatus != ERROR_STATE && !bOutputEosReached)
{
- long current_avsync_time = 0, delta_time = 0;
- int canDisplay = 1;
- static int contigous_drop_frame = 0;
- static long base_avsync_time = 0;
- static long base_timestamp = 0;
- long lipsync_time = 250000;
- int bytes_written = 0;
- OMX_BUFFERHEADERTYPE *pBuffer;
-
- if(flush_in_progress)
- {
- printf("\n FBD_thread flush wait start");
+ pthread_mutex_unlock(&eos_lock);
+ DEBUG_PRINT("Inside %s\n", __FUNCTION__);
+ if(flush_output_progress)
+ {
+ DEBUG_PRINT("\n FBD_thread flush wait start");
sem_wait(&out_flush_sem);
- printf("\n FBD_thread flush wait complete");
+ DEBUG_PRINT("\n FBD_thread flush wait complete");
}
-
sem_wait(&fbd_sem);
- DEBUG_PRINT("Inside %s fbd_cnt[%d] \n", __FUNCTION__, fbd_cnt);
-
- fbd_cnt++;
+ pthread_mutex_lock(&enable_lock);
+ if (sent_disabled)
+ {
+ pthread_mutex_unlock(&enable_lock);
+ pthread_mutex_lock(&fbd_lock);
+ if (free_op_buf_cnt == portFmt.nBufferCountActual)
+ free_output_buffers();
+ pthread_mutex_unlock(&fbd_lock);
+ pthread_mutex_lock(&eos_lock);
+ continue;
+ }
+ pthread_mutex_unlock(&enable_lock);
+ if (anti_flickering)
+ pPrevBuff = pBuffer;
pthread_mutex_lock(&fbd_lock);
- pBuffer = (OMX_BUFFERHEADERTYPE *) pop(fbd_queue);
+ pBuffer = (OMX_BUFFERHEADERTYPE *)pop(fbd_queue);
pthread_mutex_unlock(&fbd_lock);
if (pBuffer == NULL)
{
+ if (anti_flickering)
+ pBuffer = pPrevBuff;
DEBUG_PRINT("Error - No pBuffer to dequeue\n");
+ pthread_mutex_lock(&eos_lock);
continue;
}
-
- /*********************************************
- Write the output of the decoder to the file.
- *********************************************/
-
- if (sent_disabled)
+ else if (pBuffer->nFilledLen > 0)
{
- DEBUG_PRINT("Ignoring FillBufferDone\n");
- continue;
- }
-
- if (realtime_display)
- {
- if(!gettimeofday(&t_avsync,NULL))
- {
- current_avsync_time =(t_avsync.tv_sec*1000000)+t_avsync.tv_usec;
- }
-
- if (base_avsync_time != 0)
+ if (!fbd_cnt)
+ {
+ gettimeofday(&t_start, NULL);
+ }
+ fbd_cnt++;
+ DEBUG_PRINT("%s: fbd_cnt(%d) Buf(%p) Timestamp(%lld)",
+ __FUNCTION__, fbd_cnt, pBuffer, pBuffer->nTimeStamp);
+ canDisplay = 1;
+ if (realtime_display)
{
- pthread_mutex_lock(&fbd_lock);
- delta_time = (current_avsync_time - base_avsync_time) - ((long)pBuffer->nTimeStamp - base_timestamp);
- if (delta_time < 0 )
+ if (pBuffer->nTimeStamp != (lastTimestamp + timestampInterval))
{
- DEBUG_PRINT_ERROR("Sleep %d us. AV Sync time is left behind\n",
- -delta_time);
- usleep(-delta_time);
- canDisplay = 1;
+ DEBUG_PRINT("Unexpected timestamp[%lld]! Expected[%lld]\n",
+ pBuffer->nTimeStamp, lastTimestamp + timestampInterval);
}
- else if ((delta_time>lipsync_time) && (contigous_drop_frame < 6))
+ lastTimestamp = pBuffer->nTimeStamp;
+ gettimeofday(&t_avsync, NULL);
+ if (!base_avsync.tv_sec && !base_avsync.tv_usec)
{
- DEBUG_PRINT_ERROR("Error - Drop the frame at the renderer. Video frame with ts %lu usec behind by %ld usec"
- ", pBuffer->nFilledLen %u\n",
- (unsigned long)pBuffer->nTimeStamp, delta_time, pBuffer->nFilledLen);
- canDisplay = 0;
- contigous_drop_frame++;
+ display_time = 0;
+ base_avsync = t_avsync;
+ base_timestamp = pBuffer->nTimeStamp;
+ DEBUG_PRINT("base_avsync Sec(%lu) uSec(%lu) base_timestamp(%lld)",
+ base_avsync.tv_sec, base_avsync.tv_usec, base_timestamp);
}
else
- {
- canDisplay = 1;
+ {
+ act_time = (t_avsync.tv_sec - base_avsync.tv_sec) * 1e6
+ + t_avsync.tv_usec - base_avsync.tv_usec;
+ display_time = pBuffer->nTimeStamp - base_timestamp;
+ DEBUG_PRINT("%s: act_time(%lu) display_time(%lu)",
+ __FUNCTION__, act_time, display_time);
+ //Frame rcvd on time
+ if (((act_time + render_time) >= (display_time - lipsync) &&
+ (act_time + render_time) <= (display_time + lipsync)) ||
+ //Display late frame
+ (contigous_drop_frame > 5))
+ display_time = 0;
+ else if ((act_time + render_time) < (display_time - lipsync))
+ //Delaying early frame
+ display_time -= (lipsync + act_time + render_time);
+ else
+ {
+ //Dropping late frame
+ canDisplay = 0;
+ contigous_drop_frame++;
+ }
}
- pthread_mutex_unlock(&fbd_lock);
}
- else
+ if (displayYuv && canDisplay)
{
- base_avsync_time = current_avsync_time;
- base_timestamp = (long)pBuffer->nTimeStamp;
+ if (display_time)
+ usleep(display_time);
+ ret = overlay_fb(pBuffer);
+ if (ret != 0)
+ {
+ printf("\nERROR in overlay_fb, disabling display!");
+ close_display();
+ displayYuv = 0;
+ }
+ usleep(render_time);
+ contigous_drop_frame = 0;
}
- }
- if (!flush_in_progress && takeYuvLog) {
- pthread_mutex_lock(&fbd_lock);
- bytes_written = fwrite((const char *)pBuffer->pBuffer,
- pBuffer->nFilledLen,1,outputBufferFile);
- pthread_mutex_unlock(&fbd_lock);
- if (bytes_written < 0) {
- DEBUG_PRINT("\nFillBufferDone: Failed to write to the file\n");
- }
- else {
- DEBUG_PRINT("\nFillBufferDone: Wrote %d YUV bytes to the file\n",
- bytes_written);
+ if (takeYuvLog)
+ {
+ bytes_written = fwrite((const char *)pBuffer->pBuffer,
+ pBuffer->nFilledLen,1,outputBufferFile);
+ if (bytes_written < 0) {
+ DEBUG_PRINT("\nFillBufferDone: Failed to write to the file\n");
+ }
+ else {
+ DEBUG_PRINT("\nFillBufferDone: Wrote %d YUV bytes to the file\n",
+ bytes_written);
+ }
+ }
+ if (pBuffer->nFlags & OMX_BUFFERFLAG_EXTRADATA)
+ {
+ OMX_OTHER_EXTRADATATYPE *pExtra;
+ DEBUG_PRINT(">> BUFFER WITH EXTRA DATA RCVD <<<");
+ pExtra = (OMX_OTHER_EXTRADATATYPE *)
+ ((unsigned)(pBuffer->pBuffer + pBuffer->nOffset +
+ pBuffer->nFilledLen + 3)&(~3));
+ while(pExtra &&
+ (OMX_U8*)pExtra < (pBuffer->pBuffer + pBuffer->nAllocLen) &&
+ pExtra->eType != OMX_ExtraDataNone )
+ {
+ DEBUG_PRINT("ExtraData : pBuf(%p) BufTS(%lld) Type(%x) DataSz(%u)",
+ pBuffer, pBuffer->nTimeStamp, pExtra->eType, pExtra->nDataSize);
+ switch (pExtra->eType)
+ {
+ case OMX_ExtraDataInterlaceFormat:
+ {
+ OMX_STREAMINTERLACEFORMAT *pInterlaceFormat = (OMX_STREAMINTERLACEFORMAT *)pExtra->data;
+ DEBUG_PRINT("OMX_ExtraDataInterlaceFormat: Buf(%p) TSmp(%lld) IntPtr(%p) Fmt(%x)",
+ pBuffer->pBuffer, pBuffer->nTimeStamp,
+ pInterlaceFormat, pInterlaceFormat->nInterlaceFormats);
+ break;
+ }
+ case OMX_ExtraDataFrameInfo:
+ {
+ OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)pExtra->data;
+ DEBUG_PRINT("OMX_ExtraDataFrameInfo: Buf(%p) TSmp(%lld) PicType(%u) IntT(%u) ConMB(%u)",
+ pBuffer->pBuffer, pBuffer->nTimeStamp, frame_info->ePicType,
+ frame_info->interlaceType, frame_info->nConcealedMacroblocks);
+ DEBUG_PRINT(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) ",
+ frame_info->nFrameRate, frame_info->aspectRatio.aspectRatioX,
+ frame_info->aspectRatio.aspectRatioY);
+ DEBUG_PRINT("PANSCAN numWindows(%d)", frame_info->panScan.numWindows);
+ for (int i = 0; i < frame_info->panScan.numWindows; i++)
+ {
+ DEBUG_PRINT("WINDOW Lft(%d) Tp(%d) Rgt(%d) Bttm(%d)",
+ frame_info->panScan.window[i].x,
+ frame_info->panScan.window[i].y,
+ frame_info->panScan.window[i].dx,
+ frame_info->panScan.window[i].dy);
+ }
+ break;
+ }
+ break;
+ case OMX_ExtraDataConcealMB:
+ {
+ OMX_U8 data = 0, *data_ptr = (OMX_U8 *)pExtra->data;
+ OMX_U32 concealMBnum = 0, bytes_cnt = 0;
+ while (bytes_cnt < pExtra->nDataSize)
+ {
+ data = *data_ptr;
+ while (data)
+ {
+ concealMBnum += (data&0x01);
+ data >>= 1;
+ }
+ data_ptr++;
+ bytes_cnt++;
+ }
+ DEBUG_PRINT("OMX_ExtraDataConcealMB: Buf(%p) TSmp(%lld) ConcealMB(%u)",
+ pBuffer->pBuffer, pBuffer->nTimeStamp, concealMBnum);
+ }
+ break;
+ default:
+ DEBUG_PRINT_ERROR("Unknown Extrata!");
+ }
+ if (pExtra->nSize < (pBuffer->nAllocLen - (OMX_U32)pExtra))
+ pExtra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) pExtra) + pExtra->nSize);
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: Extradata pointer overflow buffer(%p) extra(%p)",
+ pBuffer, pExtra);
+ pExtra = NULL;
+ }
}
+ }
+ }
+ if(pBuffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
+ {
+ DEBUG_PRINT("\n");
+ DEBUG_PRINT("***************************************************\n");
+ DEBUG_PRINT("FillBufferDone: End Of Sequence Received\n");
+ DEBUG_PRINT("***************************************************\n");
+ }
+ if(pBuffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT)
+ {
+ DEBUG_PRINT("\n");
+ DEBUG_PRINT("***************************************************\n");
+ DEBUG_PRINT("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received\n");
+ DEBUG_PRINT("***************************************************\n");
}
-
/********************************************************************/
/* De-Initializing the open max and relasing the buffers and */
/* closing the files.*/
/********************************************************************/
- if (pBuffer->nFlags & OMX_BUFFERFLAG_EOS ) {
+ if (pBuffer->nFlags & OMX_BUFFERFLAG_EOS )
+ {
+ OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement;
+ OMX_GetConfig(dec_handle,
+ (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement,
+ &framePackingArrangement);
+ PrintFramePackArrangement(framePackingArrangement);
+
+ gettimeofday(&t_end, NULL);
+ total_time = ((float) ((t_end.tv_sec - t_start.tv_sec) * 1e6
+ + t_end.tv_usec - t_start.tv_usec))/ 1e6;
+ //total frames is fbd_cnt - 1 since the start time is
+ //recorded after the first frame is decoded.
+ printf("\nAvg decoding frame rate=%f\n", (fbd_cnt - 1)/total_time);
+
DEBUG_PRINT("***************************************************\n");
DEBUG_PRINT("FillBufferDone: End Of Stream Reached\n");
DEBUG_PRINT("***************************************************\n");
pthread_mutex_lock(&eos_lock);
bOutputEosReached = true;
- pthread_cond_broadcast(&eos_cond);
- pthread_mutex_unlock(&eos_lock);
- //QPERF_END(client_decode);
- //QPERF_SET_ITERATION(client_decode, fbd_cnt);
- DEBUG_PRINT("***************************************************\n");
- DEBUG_PRINT("FBD_THREAD bOutputEosReached %d\n",bOutputEosReached);
break;
}
- OMX_FillThisBuffer(dec_handle, pBuffer);
+
+ pthread_mutex_lock(&enable_lock);
+ if (flush_output_progress || sent_disabled)
+ {
+ pBuffer->nFilledLen = 0;
+ pBuffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
+ pthread_mutex_lock(&fbd_lock);
+ if ( pPrevBuff != NULL ) {
+ push(fbd_queue, (void *)pPrevBuff);
+ pPrevBuff = NULL;
+ }
+ if(push(fbd_queue, (void *)pBuffer) < 0)
+ {
+ DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
+ }
+ else
+ sem_post(&fbd_sem);
+ pthread_mutex_unlock(&fbd_lock);
+ }
+ else
+ {
+ if (!anti_flickering)
+ pPrevBuff = pBuffer;
+ if (pPrevBuff)
+ {
+ pthread_mutex_lock(&fbd_lock);
+ pthread_mutex_lock(&eos_lock);
+ if (!bOutputEosReached)
+ {
+ if ( OMX_FillThisBuffer(dec_handle, pPrevBuff) == OMX_ErrorNone ) {
+ free_op_buf_cnt--;
+ }
+ }
+ pthread_mutex_unlock(&eos_lock);
+ pthread_mutex_unlock(&fbd_lock);
+ }
+ }
+ pthread_mutex_unlock(&enable_lock);
+ if(cmd_data <= fbd_cnt)
+ {
+ sem_post(&seq_sem);
+ printf("\n Posted seq_sem Frm(%d) Req(%d)", fbd_cnt, cmd_data);
+ cmd_data = ~(unsigned)0;
+ }
+ pthread_mutex_lock(&eos_lock);
+ }
+ if(seq_enabled)
+ {
+ seq_enabled = 0;
+ sem_post(&seq_sem);
+ printf("\n Posted seq_sem in EOS \n");
}
+ pthread_cond_broadcast(&eos_cond);
+ pthread_mutex_unlock(&eos_lock);
return NULL;
}
@@ -565,53 +921,103 @@ OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
switch(eEvent) {
case OMX_EventCmdComplete:
DEBUG_PRINT("\n OMX_EventCmdComplete \n");
- // check nData1 for DISABLE event
if(OMX_CommandPortDisable == (OMX_COMMANDTYPE)nData1)
{
DEBUG_PRINT("*********************************************\n");
DEBUG_PRINT("Recieved DISABLE Event Command Complete[%d]\n",nData2);
DEBUG_PRINT("*********************************************\n");
- sent_disabled = 0;
}
else if(OMX_CommandPortEnable == (OMX_COMMANDTYPE)nData1)
{
DEBUG_PRINT("*********************************************\n");
DEBUG_PRINT("Recieved ENABLE Event Command Complete[%d]\n",nData2);
DEBUG_PRINT("*********************************************\n");
+ if (currentStatus == PORT_SETTING_CHANGE_STATE)
+ currentStatus = GOOD_STATE;
+ pthread_mutex_lock(&enable_lock);
+ sent_disabled = 0;
+ pthread_mutex_unlock(&enable_lock);
}
- currentStatus = GOOD_STATE;
- event_complete();
+ else if(OMX_CommandFlush == (OMX_COMMANDTYPE)nData1)
+ {
+ DEBUG_PRINT("*********************************************\n");
+ DEBUG_PRINT("Received FLUSH Event Command Complete[%d]\n",nData2);
+ DEBUG_PRINT("*********************************************\n");
+ if (nData2 == 0)
+ flush_input_progress = 0;
+ else if (nData2 == 1)
+ flush_output_progress = 0;
+ }
+ if (!flush_input_progress && !flush_output_progress)
+ event_complete();
break;
case OMX_EventError:
- DEBUG_PRINT("OMX_EventError \n");
+ printf("*********************************************\n");
+ printf("Received OMX_EventError Event Command !\n");
+ printf("*********************************************\n");
currentStatus = ERROR_STATE;
if (OMX_ErrorInvalidState == (OMX_ERRORTYPE)nData1 ||
OMX_ErrorHardware == (OMX_ERRORTYPE)nData1)
{
- DEBUG_PRINT("Invalid State or hardware error \n");
- currentStatus = INVALID_STATE;
+ printf("Invalid State or hardware error \n");
if(event_is_done == 0)
{
DEBUG_PRINT("Event error in the middle of Decode \n");
pthread_mutex_lock(&eos_lock);
bOutputEosReached = true;
- pthread_cond_broadcast(&eos_cond);
pthread_mutex_unlock(&eos_lock);
-
+ if(seq_enabled)
+ {
+ seq_enabled = 0;
+ sem_post(&seq_sem);
+ printf("\n Posted seq_sem in ERROR");
+ }
}
}
-
- event_complete();
+ if (waitForPortSettingsChanged)
+ {
+ waitForPortSettingsChanged = 0;
+ event_complete();
+ }
break;
case OMX_EventPortSettingsChanged:
- DEBUG_PRINT("OMX_EventPortSettingsChanged port[%d]\n",nData1);
- waitForPortSettingsChanged = 0;
+ DEBUG_PRINT("OMX_EventPortSettingsChanged port[%d]\n", nData1);
currentStatus = PORT_SETTING_CHANGE_STATE;
- // reset the event
- event_complete();
+ if (waitForPortSettingsChanged)
+ {
+ waitForPortSettingsChanged = 0;
+ event_complete();
+ }
+ else
+ {
+ pthread_mutex_lock(&eos_lock);
+ pthread_cond_broadcast(&eos_cond);
+ pthread_mutex_unlock(&eos_lock);
+ }
break;
+ case OMX_EventBufferFlag:
+ DEBUG_PRINT("OMX_EventBufferFlag port[%d] flags[%x]\n", nData1, nData2);
+ if (nData1 == 1 && (nData2 & OMX_BUFFERFLAG_EOS)) {
+ pthread_mutex_lock(&eos_lock);
+ bOutputEosReached = true;
+ pthread_mutex_unlock(&eos_lock);
+ if(seq_enabled)
+ {
+ seq_enabled = 0;
+ sem_post(&seq_sem);
+ printf("\n Posted seq_sem in OMX_EventBufferFlag");
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("OMX_EventBufferFlag Event not handled\n");
+ }
+ break;
+ case OMX_EventIndexsettingChanged:
+ DEBUG_PRINT("OMX_EventIndexSettingChanged Interlace mode[%x]\n", nData1);
+ break;
default:
DEBUG_PRINT_ERROR("ERROR - Unknown Event \n");
break;
@@ -659,23 +1065,23 @@ OMX_ERRORTYPE FillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent,
*/
if(waitForPortSettingsChanged)
{
- currentStatus = GOOD_STATE;
waitForPortSettingsChanged = 0;
-
+ if(displayYuv)
+ overlay_set();
event_complete();
}
- if(!sent_disabled)
+ pthread_mutex_lock(&fbd_lock);
+ free_op_buf_cnt++;
+ if(push(fbd_queue, (void *)pBuffer) < 0)
{
- pthread_mutex_lock(&fbd_lock);
- if(push(fbd_queue, (void *)pBuffer) < 0)
- {
- DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
- return OMX_ErrorUndefined;
- }
pthread_mutex_unlock(&fbd_lock);
- sem_post(&fbd_sem);
+ DEBUG_PRINT_ERROR("Error in enqueueing fbd_data\n");
+ return OMX_ErrorUndefined;
}
+ pthread_mutex_unlock(&fbd_lock);
+ sem_post(&fbd_sem);
+
return OMX_ErrorNone;
}
@@ -686,7 +1092,10 @@ int main(int argc, char **argv)
int num=0;
int outputOption = 0;
int test_option = 0;
+ int pic_order = 0;
OMX_ERRORTYPE result;
+ sliceheight = height = 144;
+ stride = width = 176;
if (argc < 2)
{
@@ -695,12 +1104,52 @@ int main(int argc, char **argv)
return -1;
}
- strncpy(in_filename, argv[1], strlen(argv[1])+1);
-
- if(argc > 5)
+ strlcpy(in_filename, argv[1], strlen(argv[1])+1);
+ if(argc > 2)
{
codec_format_option = (codec_format)atoi(argv[2]);
- file_type_option = (file_type)atoi(argv[3]);
+ // file_type, out_op, tst_op, nal_sz, disp_win, rt_dis, (fps), color, pic_order
+ int param[9] = {2, 1, 1, 0, 0, 0, 0xFF, 0xFF, 0xFF};
+ int next_arg = 3, idx = 0;
+ while (argc > next_arg && idx < 9)
+ {
+ if (strlen(argv[next_arg]) > 2)
+ {
+ strlcpy(seq_file_name, argv[next_arg],strlen(argv[next_arg]) + 1);
+ next_arg = argc;
+ }
+ else
+ param[idx++] = atoi(argv[next_arg++]);
+ }
+ idx = 0;
+ file_type_option = (file_type)param[idx++];
+ if (codec_format_option == CODEC_FORMAT_H264 && file_type_option == 3)
+ {
+ nalSize = param[idx++];
+ if (nalSize != 2 && nalSize != 4)
+ {
+ printf("Error - Can't pass NAL length size = %d\n", nalSize);
+ return -1;
+ }
+ }
+ outputOption = param[idx++];
+ test_option = param[idx++];
+ displayWindow = param[idx++];
+ if (displayWindow > 0)
+ printf("Only entire display window supported! Ignoring value\n");
+ realtime_display = param[idx++];
+ if (realtime_display)
+ {
+ takeYuvLog = 0;
+ if(param[idx] != 0xFF)
+ {
+ fps = param[idx++];
+ timestampInterval = 1e6 / fps;
+ }
+ }
+ color_fmt_type = (param[idx] != 0xFF)? param[idx++] : color_fmt_type;
+ pic_order = (param[idx] != 0xFF)? param[idx++] : 0;
+ printf("Executing DynPortReconfig QCIF 144 x 176 \n");
}
else
{
@@ -708,7 +1157,6 @@ int main(int argc, char **argv)
printf("To use it: ./mm-vdec-omx-test <clip location> <codec_type> \n");
printf(" <input_type: 1. per AU(.dat), 2. arbitrary, 3.per NAL/frame>\n");
printf(" <output_type> <test_case> <size_nal if H264>\n\n\n");
-
printf(" *********************************************\n");
printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
printf(" *********************************************\n");
@@ -716,21 +1164,22 @@ int main(int argc, char **argv)
printf(" 2--> MP4\n");
printf(" 3--> H263\n");
printf(" 4--> VC1\n");
+ printf(" 5--> DivX\n");
+ printf(" 6--> MPEG2\n");
fflush(stdin);
- scanf("%d", (int *)&codec_format_option);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&codec_format_option);
fflush(stdin);
-
if (codec_format_option > CODEC_FORMAT_MAX)
{
printf(" Wrong test case...[%d] \n", codec_format_option);
return -1;
}
-
printf(" *********************************************\n");
printf(" ENTER THE TEST CASE YOU WOULD LIKE TO EXECUTE\n");
printf(" *********************************************\n");
printf(" 1--> PER ACCESS UNIT CLIP (.dat). Clip only available for H264 and Mpeg4\n");
- printf(" 2--> ARBITRARY BYTES (need .264/.264c/.mv4/.263/.rcv/.vc1)\n");
+ printf(" 2--> ARBITRARY BYTES (need .264/.264c/.m4v/.263/.rcv/.vc1/.m2v)\n");
if (codec_format_option == CODEC_FORMAT_H264)
{
printf(" 3--> NAL LENGTH SIZE CLIP (.264c)\n");
@@ -744,130 +1193,33 @@ int main(int argc, char **argv)
printf(" 3--> VC1 clip Simple/Main Profile (.rcv)\n");
printf(" 4--> VC1 clip Advance Profile (.vc1)\n");
}
- fflush(stdin);
- scanf("%d", (int *)&file_type_option);
- fflush(stdin);
- }
-
- if (file_type_option >= FILE_TYPE_COMMON_CODEC_MAX)
- {
- switch (codec_format_option)
+ else if (codec_format_option == CODEC_FORMAT_DIVX)
{
- case CODEC_FORMAT_H264:
- file_type_option = (file_type)(FILE_TYPE_START_OF_H264_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
- break;
- case CODEC_FORMAT_MP4:
- case CODEC_FORMAT_H263:
- file_type_option = (file_type)(FILE_TYPE_START_OF_MP4_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
- break;
- case CODEC_FORMAT_VC1:
- file_type_option = (file_type)(FILE_TYPE_START_OF_VC1_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
- break;
- default:
- printf("Error: Unknown code %d\n", codec_format_option);
- }
- }
-
- if(argc > 5)
- {
- outputOption = atoi(argv[4]);
- test_option = atoi(argv[5]);
- if (argc > 6)
- {
- nalSize = atoi(argv[6]);
+ printf(" 3--> DivX 4, 5, 6 clip (.cmp)\n");
+#ifdef MAX_RES_1080P
+ printf(" 4--> DivX 3.11 clip \n");
+#endif
}
- else
+ else if (codec_format_option == CODEC_FORMAT_MPEG2)
{
- nalSize = 0;
+ printf(" 3--> MPEG2 START CODE CLIP (.m2v)\n");
}
- if(argc > 7)
+ fflush(stdin);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&file_type_option);
+ fflush(stdin);
+ if (codec_format_option == CODEC_FORMAT_H264 && file_type_option == 3)
{
- displayWindow = atoi(argv[7]);
- if(displayWindow > 0)
+ printf(" Enter Nal length size [2 or 4] \n");
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&nalSize);
+ if (nalSize != 2 && nalSize != 4)
{
- printf(" Curently display window 0 only supported; ignoring other values\n");
- displayWindow = 0;
+ printf("Error - Can't pass NAL length size = %d\n", nalSize);
+ return -1;
}
}
- else
- {
- displayWindow = 0;
- }
-
- if(file_type_option == FILE_TYPE_PICTURE_START_CODE ||
- file_type_option == FILE_TYPE_RCV ||
- (file_type_option == FILE_TYPE_VC1 && argc > 8))
- {
- realtime_display = atoi(argv[8]);
- }
-
- if(realtime_display)
- {
- takeYuvLog = 0;
- if(argc > 9)
- {
- int fps = atoi(argv[9]);
- timestampInterval = 1000000/fps;
- }
- else if(argc > 10)
- {
- strncpy(seq_file_name, argv[10], strlen(argv[10])+1);
- }
- }
- else
- {
- if(argc > 9)
- {
- strncpy(seq_file_name, argv[9], strlen(argv[9])+1);
- }
- }
- height=144;width=176; // Assume Default as QCIF
- sliceheight = 144;
- stride = 176;
- printf("Executing DynPortReconfig QCIF 144 x 176 \n");
- }
- else
- {
- int fps = 30;
- switch(file_type_option)
- {
- case FILE_TYPE_DAT_PER_AU:
- case FILE_TYPE_ARBITRARY_BYTES:
- case FILE_TYPE_264_NAL_SIZE_LENGTH:
- case FILE_TYPE_PICTURE_START_CODE:
- case FILE_TYPE_RCV:
- case FILE_TYPE_VC1:
- {
- nalSize = 0;
- if ((file_type_option == FILE_TYPE_264_NAL_SIZE_LENGTH) ||
- ((codec_format_option == CODEC_FORMAT_H264) && (file_type_option == FILE_TYPE_ARBITRARY_BYTES)))
- {
- printf(" Enter Nal length size [2 or 4] \n");
- if (file_type_option == FILE_TYPE_ARBITRARY_BYTES)
- {
- printf(" Enter 0 if it is a start code based clip\n");
- }
- scanf("%d", &nalSize);
- if ((file_type_option == FILE_TYPE_264_NAL_SIZE_LENGTH) &&
- (nalSize == 0))
- {
- printf("Error - Can't pass NAL length size = 0\n");
- return -1;
- }
- }
-
- height=144;width=176; // Assume Default as QCIF
- printf("Executing DynPortReconfig QCIF 144 x 176 \n");
- break;
- }
-
- default:
- {
- printf(" Wrong test case...[%d] \n",file_type_option);
- return -1;
- }
- }
printf(" *********************************************\n");
printf(" Output buffer option:\n");
@@ -877,7 +1229,8 @@ int main(int argc, char **argv)
printf(" 2 --> Take YUV log\n");
printf(" 3 --> Display YUV and take YUV log\n");
fflush(stdin);
- scanf("%d", &outputOption);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&outputOption);
fflush(stdin);
printf(" *********************************************\n");
@@ -885,33 +1238,35 @@ int main(int argc, char **argv)
printf(" *********************************************\n");
printf(" 1 --> Play the clip till the end\n");
printf(" 2 --> Run compliance test. Do NOT expect any display for most option. \n");
- printf(" Please only see \"TEST SUCCESSFULL\" to indidcate test pass\n");
- fflush(stdin);
- scanf("%d", &test_option);
- fflush(stdin);
-
- printf(" *********************************************\n");
- printf(" ENTER THE PORTION OF DISPLAY TO USE\n");
- printf(" *********************************************\n");
- printf(" 0 --> Entire Screen\n");
- printf(" 1 --> 1/4 th of the screen starting from top left corner to middle \n");
- printf(" 2 --> 1/4 th of the screen starting from middle to top right corner \n");
- printf(" 3 --> 1/4 th of the screen starting from middle to bottom left \n");
- printf(" 4 --> 1/4 th of the screen starting from middle to bottom right \n");
- printf(" Please only see \"TEST SUCCESSFULL\" to indidcate test pass\n");
+ printf(" Please only see \"TEST SUCCESSFULL\" to indicate test pass\n");
fflush(stdin);
- scanf("%d", &displayWindow);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&test_option);
fflush(stdin);
- if(displayWindow > 0)
+ if (outputOption == 1 || outputOption == 3)
{
- printf(" Curently display window 0 only supported; ignoring other values\n");
- displayWindow = 0;
+ printf(" *********************************************\n");
+ printf(" ENTER THE PORTION OF DISPLAY TO USE\n");
+ printf(" *********************************************\n");
+ printf(" 0 --> Entire Screen\n");
+ printf(" 1 --> 1/4 th of the screen starting from top left corner to middle \n");
+ printf(" 2 --> 1/4 th of the screen starting from middle to top right corner \n");
+ printf(" 3 --> 1/4 th of the screen starting from middle to bottom left \n");
+ printf(" 4 --> 1/4 th of the screen starting from middle to bottom right \n");
+ printf(" Please only see \"TEST SUCCESSFULL\" to indidcate test pass\n");
+ fflush(stdin);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&displayWindow);
+ fflush(stdin);
+ if(displayWindow > 0)
+ {
+ printf(" Curently display window 0 only supported; ignoring other values\n");
+ displayWindow = 0;
+ }
}
- if((file_type_option == FILE_TYPE_PICTURE_START_CODE) ||
- (file_type_option == FILE_TYPE_RCV) ||
- (file_type_option == FILE_TYPE_VC1))
+ if (outputOption == 1 || outputOption == 3)
{
printf(" *********************************************\n");
printf(" DO YOU WANT TEST APP TO RENDER in Real time \n");
@@ -920,7 +1275,8 @@ int main(int argc, char **argv)
printf(" For Arbitrary bytes option, Real time display is not recommended\n");
printf(" *********************************************\n");
fflush(stdin);
- scanf("%d", &realtime_display);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&realtime_display);
fflush(stdin);
}
@@ -932,27 +1288,69 @@ int main(int argc, char **argv)
printf(" Exception: Timestamp extracted from clips will be used.\n");
printf(" *********************************************\n");
fflush(stdin);
- scanf("%d", &fps);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&fps);
fflush(stdin);
timestampInterval = 1000000/fps;
}
+
printf(" *********************************************\n");
- printf(" ENTER THE SEQ FILE NAME\n");
+ printf(" ENTER THE COLOR FORMAT \n");
+ printf(" 0 --> Semiplanar \n 1 --> Tile Mode\n");
printf(" *********************************************\n");
fflush(stdin);
- scanf("%[^\n]", (char *)&seq_file_name);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&color_fmt_type);
+ fflush(stdin);
+
+ printf(" *********************************************\n");
+ printf(" Output picture order option: \n");
+ printf(" *********************************************\n");
+ printf(" 0 --> Display order\n 1 --> Decode order\n");
+ fflush(stdin);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&pic_order);
fflush(stdin);
}
+ if (file_type_option >= FILE_TYPE_COMMON_CODEC_MAX)
+ {
+ switch (codec_format_option)
+ {
+ case CODEC_FORMAT_H264:
+ file_type_option = (file_type)(FILE_TYPE_START_OF_H264_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+ break;
+ case CODEC_FORMAT_DIVX:
+ file_type_option = (file_type)(FILE_TYPE_START_OF_DIVX_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+ break;
+ case CODEC_FORMAT_MP4:
+ case CODEC_FORMAT_H263:
+ file_type_option = (file_type)(FILE_TYPE_START_OF_MP4_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+ break;
+ case CODEC_FORMAT_VC1:
+ file_type_option = (file_type)(FILE_TYPE_START_OF_VC1_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+ break;
+ case CODEC_FORMAT_MPEG2:
+ file_type_option = (file_type)(FILE_TYPE_START_OF_MPEG2_SPECIFIC + file_type_option - FILE_TYPE_COMMON_CODEC_MAX);
+ break;
+ default:
+ printf("Error: Unknown code %d\n", codec_format_option);
+ }
+ }
+
+ CONFIG_VERSION_SIZE(picture_order);
+ picture_order.eOutputPictureOrder = QOMX_VIDEO_DISPLAY_ORDER;
+ if (pic_order == 1)
+ picture_order.eOutputPictureOrder = QOMX_VIDEO_DECODE_ORDER;
if (outputOption == 0)
{
+ displayYuv = 0;
takeYuvLog = 0;
realtime_display = 0;
}
else if (outputOption == 1)
{
- printf("Sorry, cannot display to screen\n");
- return -1;
+ displayYuv = 1;
}
else if (outputOption == 2)
{
@@ -961,14 +1359,13 @@ int main(int argc, char **argv)
}
else if (outputOption == 3)
{
- printf("Sorry, cannot display to screen\n");
- return -1;
+ displayYuv = 1;
+ takeYuvLog = !realtime_display;
}
else
{
- printf("Wrong option. Assume you want to take YUV log\n");
- takeYuvLog = 1;
- realtime_display = 0;
+ printf("Wrong option. Assume you want to see the YUV display\n");
+ displayYuv = 1;
}
if (test_option == 2)
@@ -981,7 +1378,8 @@ int main(int argc, char **argv)
printf(" 3 --> Call Free Handle at the OMX_StateExecuting\n");
printf(" 4 --> Call Free Handle at the OMX_StatePause\n");
fflush(stdin);
- scanf("%d", (int *)&freeHandle_option);
+ fgets(tempbuf,sizeof(tempbuf),stdin);
+ sscanf(tempbuf,"%d",&freeHandle_option);
fflush(stdin);
}
else
@@ -997,6 +1395,7 @@ int main(int argc, char **argv)
pthread_mutex_init(&lock, 0);
pthread_mutex_init(&etb_lock, 0);
pthread_mutex_init(&fbd_lock, 0);
+ pthread_mutex_init(&enable_lock, 0);
if (-1 == sem_init(&etb_sem, 0, 0))
{
printf("Error - sem_init failed %d\n", errno);
@@ -1040,11 +1439,21 @@ int main(int argc, char **argv)
return -1;
}
+ if (displayYuv)
+ {
+ if (open_display() != 0)
+ {
+ printf("\n Error opening display! Video won't be displayed...");
+ displayYuv = 0;
+ }
+ }
+
run_tests();
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&lock);
pthread_mutex_destroy(&etb_lock);
pthread_mutex_destroy(&fbd_lock);
+ pthread_mutex_destroy(&enable_lock);
pthread_cond_destroy(&eos_cond);
pthread_mutex_destroy(&eos_lock);
if (-1 == sem_destroy(&etb_sem))
@@ -1067,15 +1476,16 @@ int main(int argc, char **argv)
{
DEBUG_PRINT_ERROR("Error - sem_destroy failed %d\n", errno);
}
- //QPERF_TERMINATE(client_decode);
+ if (displayYuv)
+ close_display();
return 0;
}
int run_tests()
{
+ int cmd_error = 0;
DEBUG_PRINT("Inside %s\n", __FUNCTION__);
waitForPortSettingsChanged = 1;
- currentStatus = GOOD_STATE;
if(file_type_option == FILE_TYPE_DAT_PER_AU) {
Read_Buffer = Read_Buffer_From_DAT_File;
@@ -1090,6 +1500,17 @@ int run_tests()
(codec_format_option == CODEC_FORMAT_MP4)) {
Read_Buffer = Read_Buffer_From_Vop_Start_Code_File;
}
+ else if (codec_format_option == CODEC_FORMAT_MPEG2) {
+ Read_Buffer = Read_Buffer_From_Mpeg2_Start_Code;
+ }
+ else if(file_type_option == FILE_TYPE_DIVX_4_5_6) {
+ Read_Buffer = Read_Buffer_From_DivX_4_5_6_File;
+ }
+#ifdef MAX_RES_1080P
+ else if(file_type_option == FILE_TYPE_DIVX_311) {
+ Read_Buffer = Read_Buffer_From_DivX_311_File;
+ }
+#endif
else if(file_type_option == FILE_TYPE_RCV) {
Read_Buffer = Read_Buffer_From_RCV_File;
}
@@ -1105,8 +1526,13 @@ int run_tests()
case FILE_TYPE_ARBITRARY_BYTES:
case FILE_TYPE_264_NAL_SIZE_LENGTH:
case FILE_TYPE_PICTURE_START_CODE:
+ case FILE_TYPE_MPEG2_START_CODE:
case FILE_TYPE_RCV:
case FILE_TYPE_VC1:
+ case FILE_TYPE_DIVX_4_5_6:
+#ifdef MAX_RES_1080P
+ case FILE_TYPE_DIVX_311:
+#endif
if(Init_Decoder()!= 0x00)
{
DEBUG_PRINT_ERROR("Error - Decoder Init failed\n");
@@ -1122,6 +1548,7 @@ int run_tests()
break;
}
+ anti_flickering = true;
if(strlen(seq_file_name))
{
seqFile = fopen (seq_file_name, "rb");
@@ -1129,112 +1556,46 @@ int run_tests()
{
DEBUG_PRINT_ERROR("Error - Seq file %s could NOT be opened\n",
seq_file_name);
+ return -1;
}
else
{
DEBUG_PRINT("Seq file %s is opened \n", seq_file_name);
seq_enabled = 1;
+ anti_flickering = false;
}
}
pthread_mutex_lock(&eos_lock);
- while (bOutputEosReached == false)
+ while (bOutputEosReached == false && cmd_error == 0)
{
if(seq_enabled)
{
+ pthread_mutex_unlock(&eos_lock);
if(!get_next_command(seqFile))
- {
- process_current_command(curr_seq_command);
- }
+ cmd_error = process_current_command(curr_seq_command);
else
{
printf("\n Error in get_next_cmd or EOF");
seq_enabled = 0;
}
+ pthread_mutex_lock(&eos_lock);
}
else
- {
pthread_cond_wait(&eos_cond, &eos_lock);
+
+ if (currentStatus == PORT_SETTING_CHANGE_STATE)
+ {
+ pthread_mutex_unlock(&eos_lock);
+ cmd_error = output_port_reconfig();
+ pthread_mutex_lock(&eos_lock);
}
}
pthread_mutex_unlock(&eos_lock);
// Wait till EOS is reached...
- if(bOutputEosReached)
- {
- unsigned int bufCnt = 0;
-
- DEBUG_PRINT("Moving the decoder to idle state \n");
- OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateIdle,0);
- wait_for_event();
- if (currentStatus == INVALID_STATE)
- {
- do_freeHandle_and_clean_up(true);
- return 0;
- }
-
- DEBUG_PRINT("Moving the decoder to loaded state \n");
- OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateLoaded,0);
-
- DEBUG_PRINT("[OMX Vdec Test] - Deallocating i/p and o/p buffers \n");
- for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt)
- {
- OMX_FreeBuffer(dec_handle, 0, pInputBufHdrs[bufCnt]);
- }
-
- for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt)
- {
- OMX_FreeBuffer(dec_handle, 1, pOutYUVBufHdrs[bufCnt]);
- }
-
- fbd_cnt = 0; ebd_cnt=0;
- bInputEosReached = false;
- bOutputEosReached = false;
-
- wait_for_event();
-
- DEBUG_PRINT("[OMX Vdec Test] - Free handle decoder\n");
- OMX_ERRORTYPE result = OMX_FreeHandle(dec_handle);
- if (result != OMX_ErrorNone)
- {
- DEBUG_PRINT_ERROR("[OMX Vdec Test] - Terminate: OMX_FreeHandle error. Error code: %d\n", result);
- }
- dec_handle = NULL;
-
- /* Deinit OpenMAX */
- DEBUG_PRINT("[OMX Vdec Test] - Terminate: De-initializing OMX \n");
- OMX_Deinit();
-
- DEBUG_PRINT("[OMX Vdec Test] - Terminate: closing all files\n");
- if(inputBufferFile)
- {
- fclose(inputBufferFile);
- inputBufferFile = NULL;
- }
-
-
- if (takeYuvLog && outputBufferFile) {
- fclose(outputBufferFile);
- outputBufferFile = NULL;
- }
-
- if(etb_queue)
- {
- free_queue(etb_queue);
- etb_queue = NULL;
- }
- if(fbd_queue)
- {
- free_queue(fbd_queue);
- fbd_queue = NULL;
- }
-
- printf("*****************************************\n");
- printf("******...TEST SUCCESSFULL...*******\n");
- printf("*****************************************\n");
-
- }
-
+ if(bOutputEosReached)
+ do_freeHandle_and_clean_up(currentStatus == ERROR_STATE);
return 0;
}
@@ -1245,11 +1606,11 @@ int Init_Decoder()
OMX_U32 total = 0;
char vdecCompNames[50];
typedef OMX_U8* OMX_U8_PTR;
- char role[] ="video_decoder";
+ char *role ="video_decoder";
static OMX_CALLBACKTYPE call_back = {&EventHandler, &EmptyBufferDone, &FillBufferDone};
- unsigned int i = 0;
+ int i = 0;
long bufCnt = 0;
/* Init. the OpenMAX Core */
@@ -1272,9 +1633,17 @@ int Init_Decoder()
{
/* Allocate memory for pointers to component name */
OMX_U8** vidCompNames = (OMX_U8**)malloc((sizeof(OMX_U8*))*total);
+ if (vidCompNames == NULL) {
+ DEBUG_PRINT_ERROR("\nFailed to allocate vidCompNames\n");
+ return -1;
+ }
for (i = 0; i < total; ++i) {
vidCompNames[i] = (OMX_U8*)malloc(sizeof(OMX_U8)*OMX_MAX_STRINGNAME_SIZE);
+ if (vidCompNames[i] == NULL) {
+ DEBUG_PRINT_ERROR("\nFailed to allocate vidCompNames[%d]\n", i);
+ return -1;
+ }
}
OMX_GetComponentsOfRole(role, &total, vidCompNames);
DEBUG_PRINT("\nComponents of Role:%s\n", role);
@@ -1290,20 +1659,39 @@ int Init_Decoder()
if (codec_format_option == CODEC_FORMAT_H264)
{
- strncpy(vdecCompNames, "OMX.qcom.video.decoder.avc", 27);
+ strlcpy(vdecCompNames, "OMX.qcom.video.decoder.avc", 27);
+ //strlcpy(vdecCompNames, "OMX.SEC.qcom.video.decoder.avc", 31);
}
else if (codec_format_option == CODEC_FORMAT_MP4)
{
- strncpy(vdecCompNames, "OMX.qcom.video.decoder.mpeg4", 29);
+ strlcpy(vdecCompNames, "OMX.qcom.video.decoder.mpeg4", 29);
}
else if (codec_format_option == CODEC_FORMAT_H263)
{
- strncpy(vdecCompNames, "OMX.qcom.video.decoder.h263", 28);
+ strlcpy(vdecCompNames, "OMX.qcom.video.decoder.h263", 28);
}
else if (codec_format_option == CODEC_FORMAT_VC1)
{
- strncpy(vdecCompNames, "OMX.qcom.video.decoder.vc1", 27);
+ strlcpy(vdecCompNames, "OMX.qcom.video.decoder.vc1", 27);
+ }
+ else if (codec_format_option == CODEC_FORMAT_MPEG2)
+ {
+ strlcpy(vdecCompNames, "OMX.qcom.video.decoder.mpeg2", 29);
+ }
+ else if (file_type_option == FILE_TYPE_RCV)
+ {
+ strlcpy(vdecCompNames, "OMX.qcom.video.decoder.wmv", 27);
+ }
+ else if (file_type_option == FILE_TYPE_DIVX_4_5_6)
+ {
+ strlcpy(vdecCompNames, "OMX.qcom.video.decoder.divx", 28);
+ }
+#ifdef MAX_RES_1080P
+ else if (file_type_option == FILE_TYPE_DIVX_311)
+ {
+ strlcpy(vdecCompNames, "OMX.qcom.video.decoder.divx311", 31);
}
+#endif
else
{
DEBUG_PRINT_ERROR("Error: Unsupported codec %d\n", codec_format_option);
@@ -1343,16 +1731,6 @@ int Init_Decoder()
DEBUG_PRINT("portParam.nStartPortNumber:%d\n", portParam.nStartPortNumber);
}
- DEBUG_PRINT("Set parameter immediately followed by getparameter");
- omxresult = OMX_SetParameter(dec_handle,
- OMX_IndexParamPortDefinition,
- &portFmt);
-
- if(OMX_ErrorNone != omxresult)
- {
- DEBUG_PRINT_ERROR("ERROR - Set parameter failed");
- }
-
/* Set the compression format on i/p port */
if (codec_format_option == CODEC_FORMAT_H264)
{
@@ -1370,6 +1748,15 @@ int Init_Decoder()
{
portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingWMV;
}
+ else if (codec_format_option == CODEC_FORMAT_DIVX)
+ {
+ portFmt.format.video.eCompressionFormat =
+ (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
+ }
+ else if (codec_format_option == CODEC_FORMAT_MPEG2)
+ {
+ portFmt.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG2;
+ }
else
{
DEBUG_PRINT_ERROR("Error: Unsupported codec %d\n", codec_format_option);
@@ -1381,13 +1768,12 @@ int Init_Decoder()
int Play_Decoder()
{
- int i;
- unsigned int bufCnt;
+ OMX_VIDEO_PARAM_PORTFORMATTYPE videoportFmt = {0};
+ int i, bufCnt, index = 0;
int frameSize=0;
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE* pBuffer = NULL;
DEBUG_PRINT("Inside %s \n", __FUNCTION__);
- OMX_ERRORTYPE ret;
-
- DEBUG_PRINT("sizeof[%d]\n", sizeof(OMX_BUFFERHEADERTYPE));
/* open the i/p and o/p files based on the video file format passed */
if(open_video_file()) {
@@ -1403,8 +1789,12 @@ int Play_Decoder()
{
case FILE_TYPE_DAT_PER_AU:
case FILE_TYPE_PICTURE_START_CODE:
+ case FILE_TYPE_MPEG2_START_CODE:
case FILE_TYPE_RCV:
case FILE_TYPE_VC1:
+#ifdef MAX_RES_1080P
+ case FILE_TYPE_DIVX_311:
+#endif
{
inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_OnlyOneCompleteFrame;
break;
@@ -1412,6 +1802,7 @@ int Play_Decoder()
case FILE_TYPE_ARBITRARY_BYTES:
case FILE_TYPE_264_NAL_SIZE_LENGTH:
+ case FILE_TYPE_DIVX_4_5_6:
{
inputPortFmt.nFramePackingFormat = OMX_QCOM_FramePacking_Arbitrary;
break;
@@ -1422,7 +1813,48 @@ int Play_Decoder()
}
OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexPortDefn,
(OMX_PTR)&inputPortFmt);
-
+#ifdef USE_EXTERN_PMEM_BUF
+ OMX_QCOM_PARAM_PORTDEFINITIONTYPE outPortFmt;
+ memset(&outPortFmt, 0, sizeof(OMX_QCOM_PARAM_PORTDEFINITIONTYPE));
+ CONFIG_VERSION_SIZE(outPortFmt);
+ outPortFmt.nPortIndex = 1; // output port
+ outPortFmt.nCacheAttr = OMX_QCOM_CacheAttrNone;
+ outPortFmt.nMemRegion = OMX_QCOM_MemRegionSMI;
+ OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexPortDefn,
+ (OMX_PTR)&outPortFmt);
+
+ OMX_QCOM_PLATFORMPRIVATE_EXTN outPltPvtExtn;
+ memset(&outPltPvtExtn, 0, sizeof(OMX_QCOM_PLATFORMPRIVATE_EXTN));
+ CONFIG_VERSION_SIZE(outPltPvtExtn);
+ outPltPvtExtn.nPortIndex = 1; // output port
+ outPltPvtExtn.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+ OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexPlatformPvt,
+ (OMX_PTR)&outPltPvtExtn);
+ use_external_pmem_buf = OMX_TRUE;
+#endif
+ QOMX_ENABLETYPE extra_data;
+ extra_data.bEnable = OMX_TRUE;
+#if 0
+ OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamInterlaceExtraData,
+ (OMX_PTR)&extra_data);
+#endif
+#if 0
+ OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamConcealMBMapExtraData,
+ (OMX_PTR)&extra_data);
+#endif
+#if 1
+ OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamFrameInfoExtraData,
+ (OMX_PTR)&extra_data);
+#endif
+#ifdef TEST_TS_FROM_SEI
+ OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamH264TimeInfo,
+ (OMX_PTR)&extra_data);
+#endif
+#if 0
+ extra_data.bEnable = OMX_FALSE;
+ OMX_SetParameter(dec_handle,(OMX_INDEXTYPE)OMX_QcomIndexParamConcealMBMapExtraData,
+ (OMX_PTR)&extra_data);
+#endif
/* Query the decoder outport's min buf requirements */
CONFIG_VERSION_SIZE(portFmt);
@@ -1437,19 +1869,97 @@ int Play_Decoder()
printf ("\nDec: Expect Input Port\n");
return -1;
}
+#ifdef MAX_RES_1080P
+ if( (codec_format_option == CODEC_FORMAT_DIVX) &&
+ (file_type_option == FILE_TYPE_DIVX_311) ) {
+
+ int off;
+
+ if ( read(inputBufferFileFd, &width, 4 ) == -1 ) {
+ DEBUG_PRINT_ERROR("\nFailed to read width for divx\n");
+ return -1;
+ }
+
+ DEBUG_PRINT("\nWidth for DIVX = %d\n", width);
+
+ if ( read(inputBufferFileFd, &height, 4 ) == -1 ) {
+ DEBUG_PRINT_ERROR("\nFailed to read height for divx\n");
+ return -1;
+ }
+
+ DEBUG_PRINT("\nHeight for DIVX = %u\n", height);
+ sliceheight = height;
+ stride = width;
+ }
+#endif
bufCnt = 0;
portFmt.format.video.nFrameHeight = height;
portFmt.format.video.nFrameWidth = width;
- OMX_SetParameter(dec_handle,OMX_IndexParamPortDefinition,
- (OMX_PTR)&portFmt);
- OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition,
- &portFmt);
+ portFmt.format.video.xFramerate = fps;
+ OMX_SetParameter(dec_handle,OMX_IndexParamPortDefinition, (OMX_PTR)&portFmt);
+ OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition, &portFmt);
DEBUG_PRINT("\nDec: New Min Buffer Count %d", portFmt.nBufferCountMin);
+ CONFIG_VERSION_SIZE(videoportFmt);
+#ifdef MAX_RES_720P
+ if(color_fmt_type == 0)
+ {
+ color_fmt = OMX_COLOR_FormatYUV420SemiPlanar;
+ }
+ else
+ {
+ color_fmt = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+ }
+#elif _COPPER_
+ color_fmt = OMX_COLOR_FormatYUV420SemiPlanar;
+#else
+ color_fmt = (OMX_COLOR_FORMATTYPE)
+ QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+#endif
+
+ while (ret == OMX_ErrorNone)
+ {
+ videoportFmt.nPortIndex = 1;
+ videoportFmt.nIndex = index;
+ ret = OMX_GetParameter(dec_handle, OMX_IndexParamVideoPortFormat,
+ (OMX_PTR)&videoportFmt);
+ if((ret == OMX_ErrorNone) && (videoportFmt.eColorFormat ==
+ color_fmt))
+ {
+ DEBUG_PRINT("\n Format[%u] supported by OMX Decoder", color_fmt);
+ break;
+ }
+ index++;
+ }
- DEBUG_PRINT("\nVideo format, height = %d", portFmt.format.video.nFrameHeight);
- DEBUG_PRINT("\nVideo format, height = %d\n", portFmt.format.video.nFrameWidth);
+ if(ret == OMX_ErrorNone)
+ {
+ if(OMX_SetParameter(dec_handle, OMX_IndexParamVideoPortFormat,
+ (OMX_PTR)&videoportFmt) != OMX_ErrorNone)
+ {
+ DEBUG_PRINT_ERROR("\n Setting Tile format failed");
+ return -1;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\n Error in retrieving supported color formats");
+ return -1;
+ }
+ picture_order.nPortIndex = 1;
+ DEBUG_PRINT("\nSet picture order\n");
+ if(OMX_SetParameter(dec_handle,
+ (OMX_INDEXTYPE)OMX_QcomIndexParamVideoDecoderPictureOrder,
+ (OMX_PTR)&picture_order) != OMX_ErrorNone)
+ {
+ printf("\n ERROR: Setting picture order!");
+ return -1;
+ }
+ DEBUG_PRINT("\nVideo format: W x H (%d x %d)",
+ portFmt.format.video.nFrameWidth,
+ portFmt.format.video.nFrameHeight);
if(codec_format_option == CODEC_FORMAT_H264)
{
OMX_VIDEO_CONFIG_NALSIZE naluSize;
@@ -1463,19 +1973,37 @@ int Play_Decoder()
input_buf_cnt = portFmt.nBufferCountActual;
DEBUG_PRINT("Transition to Idle State succesful...\n");
- /* Allocate buffer on decoder's i/p port */
- error = Allocate_Buffer(dec_handle, &pInputBufHdrs, portFmt.nPortIndex,
- portFmt.nBufferCountActual, portFmt.nBufferSize);
- if (error != OMX_ErrorNone) {
- DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Input buffer error\n");
- return -1;
- }
- else {
- DEBUG_PRINT("\nOMX_AllocateBuffer Input buffer success\n");
- }
- portFmt.nPortIndex = portParam.nStartPortNumber+1;
- /* Port for which the Client needs to obtain info */
+#if ALLOCATE_BUFFER
+ // Allocate buffer on decoder's i/p port
+ error = Allocate_Buffer(dec_handle, &pInputBufHdrs, portFmt.nPortIndex,
+ portFmt.nBufferCountActual, portFmt.nBufferSize);
+ if (error != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Input buffer error\n");
+ return -1;
+ }
+ else {
+ DEBUG_PRINT("\nOMX_AllocateBuffer Input buffer success\n");
+ }
+#else
+ // Use buffer on decoder's i/p port
+ input_use_buffer = true;
+ DEBUG_PRINT_ERROR("\n before OMX_UseBuffer %p", &pInputBufHdrs);
+ error = use_input_buffer(dec_handle,
+ &pInputBufHdrs,
+ portFmt.nPortIndex,
+ portFmt.nBufferSize,
+ portFmt.nBufferCountActual);
+ if (error != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
+ return -1;
+ }
+ else {
+ DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
+ }
+#endif
+ portFmt.nPortIndex = portParam.nStartPortNumber+1;
+ // Port for which the Client needs to obtain info
OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition,&portFmt);
DEBUG_PRINT("nMin Buffer Count=%d", portFmt.nBufferCountMin);
@@ -1485,9 +2013,23 @@ int Play_Decoder()
return -1;
}
- /* Allocate buffer on decoder's o/p port */
- error = Allocate_Buffer(dec_handle, &pOutYUVBufHdrs, portFmt.nPortIndex,
- portFmt.nBufferCountActual, portFmt.nBufferSize);
+#ifndef USE_EGL_IMAGE_TEST_APP
+ if (use_external_pmem_buf)
+ {
+ DEBUG_PRINT_ERROR("\n Use External pmem buf: OMX_UseBuffer %p", &pInputBufHdrs);
+ error = use_output_buffer_multiple_fd(dec_handle,
+ &pOutYUVBufHdrs,
+ portFmt.nPortIndex,
+ portFmt.nBufferSize,
+ portFmt.nBufferCountActual);
+ }
+ else
+ {
+ /* Allocate buffer on decoder's o/p port */
+ error = Allocate_Buffer(dec_handle, &pOutYUVBufHdrs, portFmt.nPortIndex,
+ portFmt.nBufferCountActual, portFmt.nBufferSize);
+ }
+ free_op_buf_cnt = portFmt.nBufferCountActual;
if (error != OMX_ErrorNone) {
DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Output buffer error\n");
return -1;
@@ -1496,9 +2038,24 @@ int Play_Decoder()
{
DEBUG_PRINT("OMX_AllocateBuffer Output buffer success\n");
}
-
+#else
+ DEBUG_PRINT_ERROR("\n before OMX_UseBuffer %p", &pInputBufHdrs);
+ error = use_output_buffer(dec_handle,
+ &pOutYUVBufHdrs,
+ portFmt.nPortIndex,
+ portFmt.nBufferSize,
+ portFmt.nBufferCountActual);
+ free_op_buf_cnt = portFmt.nBufferCountActual;
+ if (error != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
+ return -1;
+ }
+ else {
+ DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
+ }
+#endif
wait_for_event();
- if (currentStatus == INVALID_STATE)
+ if (currentStatus == ERROR_STATE)
{
do_freeHandle_and_clean_up(true);
return -1;
@@ -1525,22 +2082,32 @@ int Play_Decoder()
DEBUG_PRINT("OMX_SendCommand Decoder -> Executing\n");
OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateExecuting,0);
wait_for_event();
- if (currentStatus == INVALID_STATE)
+ if (currentStatus == ERROR_STATE)
{
do_freeHandle_and_clean_up(true);
return -1;
}
-
+ if (pOutYUVBufHdrs == NULL)
+ {
+ DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs is NULL\n");
+ return -1;
+ }
for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
DEBUG_PRINT("OMX_FillThisBuffer on output buf no.%d\n",bufCnt);
+ if (pOutYUVBufHdrs[bufCnt] == NULL)
+ {
+ DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs[%d] is NULL\n", bufCnt);
+ return -1;
+ }
pOutYUVBufHdrs[bufCnt]->nOutputPortIndex = 1;
pOutYUVBufHdrs[bufCnt]->nFlags &= ~OMX_BUFFERFLAG_EOS;
ret = OMX_FillThisBuffer(dec_handle, pOutYUVBufHdrs[bufCnt]);
- if (OMX_ErrorNone != ret) {
+ if (OMX_ErrorNone != ret)
DEBUG_PRINT_ERROR("Error - OMX_FillThisBuffer failed with result %d\n", ret);
- }
- else {
+ else
+ {
DEBUG_PRINT("OMX_FillThisBuffer success!\n");
+ free_op_buf_cnt--;
}
}
@@ -1561,7 +2128,9 @@ int Play_Decoder()
}
else if(file_type_option == FILE_TYPE_VC1)
{
+ bHdrflag = 1;
pInputBufHdrs[0]->nFilledLen = Read_Buffer(pInputBufHdrs[0]);
+ bHdrflag = 0;
DEBUG_PRINT_ERROR("After 1st Read_Buffer for VC1, "
"pInputBufHdrs[0]->nFilledLen %d\n", pInputBufHdrs[0]->nFilledLen);
}
@@ -1587,11 +2156,6 @@ int Play_Decoder()
{
etb_count++;
DEBUG_PRINT("OMX_EmptyThisBuffer success!\n");
- if(cmd_data == etb_count)
- {
- sem_post(&seq_sem);
- printf("\n Posted seq_sem");
- }
}
i = 1;
}
@@ -1612,11 +2176,6 @@ int Play_Decoder()
OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[i]);
etb_count++;
- if(cmd_data == etb_count)
- {
- sem_post(&seq_sem);
- printf("\n Posted seq_sem");
- }
DEBUG_PRINT("File is small::Either EOS or Some Error while reading file\n");
break;
}
@@ -1624,6 +2183,7 @@ int Play_Decoder()
pInputBufHdrs[i]->nInputPortIndex = 0;
pInputBufHdrs[i]->nFlags = 0;
//pBufHdr[bufCnt]->pAppPrivate = this;
+ DEBUG_PRINT("%s: Timestamp sent(%lld)", __FUNCTION__, pInputBufHdrs[i]->nTimeStamp);
ret = OMX_EmptyThisBuffer(dec_handle, pInputBufHdrs[i]);
if (OMX_ErrorNone != ret) {
DEBUG_PRINT_ERROR("ERROR - OMX_EmptyThisBuffer failed with result %d\n", ret);
@@ -1633,11 +2193,6 @@ int Play_Decoder()
else {
DEBUG_PRINT("OMX_EmptyThisBuffer success!\n");
etb_count++;
- if(cmd_data == etb_count)
- {
- sem_post(&seq_sem);
- printf("\n Posted seq_sem");
- }
}
}
@@ -1650,90 +2205,20 @@ int Play_Decoder()
}
// wait for event port settings changed event
+ DEBUG_PRINT("wait_for_event: dyn reconfig");
wait_for_event();
- DEBUG_PRINT("RECIEVED EVENT PORT TO DETERMINE IF DYN PORT RECONFIGURATION NEEDED, currentStatus %d\n",
+ DEBUG_PRINT("wait_for_event: dyn reconfig rcvd, currentStatus %d\n",
currentStatus);
- if (currentStatus == INVALID_STATE)
+ if (currentStatus == ERROR_STATE)
{
- DEBUG_PRINT_ERROR("Error - INVALID_STATE\n");
+ printf("Error - ERROR_STATE\n");
do_freeHandle_and_clean_up(true);
return -1;
}
else if (currentStatus == PORT_SETTING_CHANGE_STATE)
{
- DEBUG_PRINT("PORT_SETTING_CHANGE_STATE\n");
- // Send DISABLE command
- sent_disabled = 1;
- OMX_SendCommand(dec_handle, OMX_CommandPortDisable, 1, 0);
-
- DEBUG_PRINT("FREEING BUFFERS\n");
- // Free output Buffer
- for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
- OMX_FreeBuffer(dec_handle, 1, pOutYUVBufHdrs[bufCnt]);
- }
-
- // wait for Disable event to come back
- wait_for_event();
- if (currentStatus == INVALID_STATE)
- {
- do_freeHandle_and_clean_up(true);
- return -1;
- }
- DEBUG_PRINT("DISABLE EVENT RECD\n");
- // GetParam and SetParam
-
- // Send Enable command
- OMX_SendCommand(dec_handle, OMX_CommandPortEnable, 1, 0);
- // AllocateBuffers
- /* Allocate buffer on decoder's o/p port */
-
- portFmt.nPortIndex = 1;
- /* Port for which the Client needs to obtain info */
-
- OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition,&portFmt);
- DEBUG_PRINT("Min Buffer Count=%d", portFmt.nBufferCountMin);
- DEBUG_PRINT("Buffer Size=%d", portFmt.nBufferSize);
- if(OMX_DirOutput != portFmt.eDir) {
- DEBUG_PRINT_ERROR("Error - Expect Output Port\n");
- return -1;
- }
- height = portFmt.format.video.nFrameHeight;
- width = portFmt.format.video.nFrameWidth;
- stride = portFmt.format.video.nStride;
- sliceheight = portFmt.format.video.nSliceHeight;
-
- error = Allocate_Buffer(dec_handle, &pOutYUVBufHdrs, portFmt.nPortIndex,
- portFmt.nBufferCountActual, portFmt.nBufferSize);
- if (error != OMX_ErrorNone) {
- DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Output buffer error\n");
- return -1;
- }
- else
- {
- DEBUG_PRINT("OMX_AllocateBuffer Output buffer success\n");
- }
-
- // wait for enable event to come back
- wait_for_event();
- if (currentStatus == INVALID_STATE)
- {
- do_freeHandle_and_clean_up(true);
- return -1;
- }
- DEBUG_PRINT("ENABLE EVENT HANDLER RECD\n");
-
- for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
- DEBUG_PRINT("OMX_FillThisBuffer on output buf no.%d\n",bufCnt);
- pOutYUVBufHdrs[bufCnt]->nOutputPortIndex = 1;
- pOutYUVBufHdrs[bufCnt]->nFlags &= ~OMX_BUFFERFLAG_EOS;
- ret = OMX_FillThisBuffer(dec_handle, pOutYUVBufHdrs[bufCnt]);
- if (OMX_ErrorNone != ret) {
- DEBUG_PRINT_ERROR("ERROR - OMX_FillThisBuffer failed with result %d\n", ret);
- }
- else {
- DEBUG_PRINT("OMX_FillThisBuffer success!\n");
- }
- }
+ if (output_port_reconfig() != 0)
+ return -1;
}
if (freeHandle_option == FREE_HANDLE_AT_EXECUTING)
@@ -1797,18 +2282,259 @@ static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *dec_handle,
return error;
}
-static void do_freeHandle_and_clean_up(bool isDueToError)
+static OMX_ERRORTYPE use_input_buffer ( OMX_COMPONENTTYPE *dec_handle,
+ OMX_BUFFERHEADERTYPE ***pBufHdrs,
+ OMX_U32 nPortIndex,
+ OMX_U32 bufSize,
+ long bufCntMin)
{
- unsigned int bufCnt = 0;
+ DEBUG_PRINT("Inside %s \n", __FUNCTION__);
+ OMX_ERRORTYPE error=OMX_ErrorNone;
+ long bufCnt=0;
+ OMX_U8* pvirt = NULL;
- for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt)
- {
- OMX_FreeBuffer(dec_handle, 0, pInputBufHdrs[bufCnt]);
+ *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
+ malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
+ if(*pBufHdrs == NULL){
+ DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
+
+ for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
+ // allocate input buffers
+ DEBUG_PRINT("OMX_UseBuffer No %d %d \n", bufCnt, bufSize);
+ pvirt = (OMX_U8*) malloc (bufSize);
+ if(pvirt == NULL){
+ DEBUG_PRINT_ERROR("\n pvirt Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
+ error = OMX_UseBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
+ nPortIndex, NULL, bufSize, pvirt);
+ }
+ return error;
+}
+
+static OMX_ERRORTYPE use_output_buffer ( OMX_COMPONENTTYPE *dec_handle,
+ OMX_BUFFERHEADERTYPE ***pBufHdrs,
+ OMX_U32 nPortIndex,
+ OMX_U32 bufSize,
+ long bufCntMin)
+{
+ DEBUG_PRINT("Inside %s \n", __FUNCTION__);
+ OMX_ERRORTYPE error=OMX_ErrorNone;
+ long bufCnt=0;
+ OMX_U8* pvirt = NULL;
+
+ *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
+ malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
+ if(*pBufHdrs == NULL){
+ DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
+ output_use_buffer = true;
+ p_eglHeaders = (struct temp_egl **)
+ malloc(sizeof(struct temp_egl *)* bufCntMin);
+ if (!p_eglHeaders){
+ DEBUG_PRINT_ERROR("\n EGL allocation failed");
+ return OMX_ErrorInsufficientResources;
}
- for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt)
+ for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
+ // allocate input buffers
+ DEBUG_PRINT("OMX_UseBuffer No %d %d \n", bufCnt, bufSize);
+ p_eglHeaders[bufCnt] = (struct temp_egl*)
+ malloc(sizeof(struct temp_egl));
+ if(!p_eglHeaders[bufCnt]) {
+ DEBUG_PRINT_ERROR("\n EGL allocation failed");
+ return OMX_ErrorInsufficientResources;
+ }
+ p_eglHeaders[bufCnt]->pmem_fd = open(PMEM_DEVICE,O_RDWR);
+ p_eglHeaders[bufCnt]->offset = 0;
+ if(p_eglHeaders[bufCnt]->pmem_fd < 0) {
+ DEBUG_PRINT_ERROR("\n open failed %s",PMEM_DEVICE);
+ return OMX_ErrorInsufficientResources;
+ }
+
+#ifndef USE_ION
+ /* TBD - this commenting is dangerous */
+ align_pmem_buffers(p_eglHeaders[bufCnt]->pmem_fd, bufSize,
+ 8192);
+#endif
+ DEBUG_PRINT_ERROR("\n allocation size %d pmem fd %d",bufSize,p_eglHeaders[bufCnt]->pmem_fd);
+ pvirt = (unsigned char *)mmap(NULL,bufSize,PROT_READ|PROT_WRITE,
+ MAP_SHARED,p_eglHeaders[bufCnt]->pmem_fd,0);
+ DEBUG_PRINT_ERROR("\n Virtaul Address %p Size %d",pvirt,bufSize);
+ if (pvirt == MAP_FAILED) {
+ DEBUG_PRINT_ERROR("\n mmap failed for buffers");
+ return OMX_ErrorInsufficientResources;
+ }
+ use_buf_virt_addr[bufCnt] = (unsigned)pvirt;
+ error = OMX_UseEGLImage(dec_handle, &((*pBufHdrs)[bufCnt]),
+ nPortIndex, pvirt,(void *)p_eglHeaders[bufCnt]);
+ }
+ return error;
+}
+
+static OMX_ERRORTYPE use_output_buffer_multiple_fd ( OMX_COMPONENTTYPE *dec_handle,
+ OMX_BUFFERHEADERTYPE ***pBufHdrs,
+ OMX_U32 nPortIndex,
+ OMX_U32 bufSize,
+ long bufCntMin)
+{
+ DEBUG_PRINT("Inside %s \n", __FUNCTION__);
+ OMX_ERRORTYPE error=OMX_ErrorNone;
+ long bufCnt=0;
+ OMX_U8* pvirt = NULL;
+
+ *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
+ malloc(sizeof(OMX_BUFFERHEADERTYPE)* bufCntMin);
+ if(*pBufHdrs == NULL){
+ DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
+ pPlatformList = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)
+ malloc(sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST)* bufCntMin);
+
+ if(pPlatformList == NULL){
+ DEBUG_PRINT_ERROR("\n pPlatformList Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
+
+ pPlatformEntry = (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
+ malloc(sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY)* bufCntMin);
+
+ if(pPlatformEntry == NULL){
+ DEBUG_PRINT_ERROR("\n pPlatformEntry Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
+
+ pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+ malloc(sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO)* bufCntMin);
+
+ if(pPMEMInfo == NULL){
+ DEBUG_PRINT_ERROR("\n pPMEMInfo Allocation failed ");
+ return OMX_ErrorInsufficientResources;
+ }
+
+ //output_use_buffer = true;
+ for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
+ // allocate input buffers
+ DEBUG_PRINT("OMX_UseBuffer_multiple_fd No %d %d \n", bufCnt, bufSize);
+
+ pPlatformEntry[bufCnt].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
+ pPlatformEntry[bufCnt].entry = &pPMEMInfo[bufCnt];
+ // Initialize the Platform List
+ pPlatformList[bufCnt].nEntries = 1;
+ pPlatformList[bufCnt].entryList = &pPlatformEntry[bufCnt];
+ pPMEMInfo[bufCnt].offset = 0;
+ pPMEMInfo[bufCnt].pmem_fd = open(PMEM_DEVICE,O_RDWR);;
+ if(pPMEMInfo[bufCnt].pmem_fd < 0) {
+ DEBUG_PRINT_ERROR("\n open failed %s",PMEM_DEVICE);
+ return OMX_ErrorInsufficientResources;
+ }
+#ifndef USE_ION
+ /* TBD - this commenting is dangerous */
+ align_pmem_buffers(pPMEMInfo[bufCnt].pmem_fd, bufSize,
+ 8192);
+#endif
+ DEBUG_PRINT("\n allocation size %d pmem fd 0x%x",bufSize,pPMEMInfo[bufCnt].pmem_fd);
+ pvirt = (unsigned char *)mmap(NULL,bufSize,PROT_READ|PROT_WRITE,
+ MAP_SHARED,pPMEMInfo[bufCnt].pmem_fd,0);
+ getFreePmem();
+ DEBUG_PRINT("\n Virtaul Address %p Size %d pmem_fd=0x%x",pvirt,bufSize,pPMEMInfo[bufCnt].pmem_fd);
+ if (pvirt == MAP_FAILED) {
+ DEBUG_PRINT_ERROR("\n mmap failed for buffers");
+ return OMX_ErrorInsufficientResources;
+ }
+ use_buf_virt_addr[bufCnt] = (unsigned)pvirt;
+ error = OMX_UseBuffer(dec_handle, &((*pBufHdrs)[bufCnt]),
+ nPortIndex, &pPlatformList[bufCnt], bufSize, pvirt);
+ }
+ return error;
+}
+static void do_freeHandle_and_clean_up(bool isDueToError)
+{
+ int bufCnt = 0;
+ OMX_STATETYPE state = OMX_StateInvalid;
+ OMX_GetState(dec_handle, &state);
+ if (state == OMX_StateExecuting || state == OMX_StatePause)
{
+ DEBUG_PRINT("Requesting transition to Idle");
+ OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateIdle, 0);
+ wait_for_event();
+ }
+ OMX_GetState(dec_handle, &state);
+ if (state == OMX_StateIdle)
+ {
+ DEBUG_PRINT("Requesting transition to Loaded");
+ OMX_SendCommand(dec_handle, OMX_CommandStateSet, OMX_StateLoaded, 0);
+ for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt)
+ {
+ if (pInputBufHdrs[bufCnt]->pBuffer && input_use_buffer)
+ {
+ free(pInputBufHdrs[bufCnt]->pBuffer);
+ pInputBufHdrs[bufCnt]->pBuffer = NULL;
+ DEBUG_PRINT_ERROR("\nFree(pInputBufHdrs[%d]->pBuffer)",bufCnt);
+ }
+ OMX_FreeBuffer(dec_handle, 0, pInputBufHdrs[bufCnt]);
+ }
+ if (pInputBufHdrs)
+ {
+ free(pInputBufHdrs);
+ pInputBufHdrs = NULL;
+ }
+ for(bufCnt = 0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
+ if (output_use_buffer && p_eglHeaders) {
+ if(p_eglHeaders[bufCnt]) {
+ munmap (pOutYUVBufHdrs[bufCnt]->pBuffer,
+ pOutYUVBufHdrs[bufCnt]->nAllocLen);
+ close(p_eglHeaders[bufCnt]->pmem_fd);
+ p_eglHeaders[bufCnt]->pmem_fd = -1;
+ free(p_eglHeaders[bufCnt]);
+ p_eglHeaders[bufCnt] = NULL;
+ }
+ }
+ if (use_external_pmem_buf)
+ {
+ DEBUG_PRINT("Freeing in external pmem case: buffer=0x%x, pmem_fd=0x%d",
+ pOutYUVBufHdrs[bufCnt]->pBuffer,
+ pPMEMInfo[bufCnt].pmem_fd);
+ if (pOutYUVBufHdrs[bufCnt]->pBuffer)
+ {
+ munmap (pOutYUVBufHdrs[bufCnt]->pBuffer,
+ pOutYUVBufHdrs[bufCnt]->nAllocLen);
+ }
+ if (&pPMEMInfo[bufCnt])
+ {
+ close(pPMEMInfo[bufCnt].pmem_fd);
+ pPMEMInfo[bufCnt].pmem_fd = -1;
+ }
+ }
OMX_FreeBuffer(dec_handle, 1, pOutYUVBufHdrs[bufCnt]);
+ }
+ if(p_eglHeaders) {
+ free(p_eglHeaders);
+ p_eglHeaders = NULL;
+ }
+ if (pPMEMInfo)
+ {
+ DEBUG_PRINT("Freeing in external pmem case:PMEM");
+ free(pPMEMInfo);
+ pPMEMInfo = NULL;
+ }
+ if (pPlatformEntry)
+ {
+ DEBUG_PRINT("Freeing in external pmem case:ENTRY");
+ free(pPlatformEntry);
+ pPlatformEntry = NULL;
+ }
+ if (pPlatformList)
+ {
+ DEBUG_PRINT("Freeing in external pmem case:LIST");
+ free(pPlatformList);
+ pPlatformList = NULL;
+ }
+ wait_for_event();
}
DEBUG_PRINT("[OMX Vdec Test] - Free handle decoder\n");
@@ -1824,10 +2550,10 @@ static void do_freeHandle_and_clean_up(bool isDueToError)
OMX_Deinit();
DEBUG_PRINT("[OMX Vdec Test] - closing all files\n");
- if(inputBufferFile)
+ if(inputBufferFileFd != -1)
{
- fclose(inputBufferFile);
- inputBufferFile = NULL;
+ close(inputBufferFileFd);
+ inputBufferFileFd = -1;
}
DEBUG_PRINT("[OMX Vdec Test] - after free inputfile\n");
@@ -1850,17 +2576,11 @@ static void do_freeHandle_and_clean_up(bool isDueToError)
fbd_queue = NULL;
}
DEBUG_PRINT("[OMX Vdec Test] - after free iftb_queue\n");
-
-
printf("*****************************************\n");
if (isDueToError)
- {
printf("************...TEST FAILED...************\n");
- }
else
- {
printf("**********...TEST SUCCESSFULL...*********\n");
- }
printf("*****************************************\n");
}
@@ -1873,9 +2593,8 @@ static int Read_Buffer_From_DAT_File(OMX_BUFFERHEADERTYPE *pBufHdr)
int i=0;
unsigned char *read_buffer=NULL;
char c = '1'; //initialize to anything except '\0'(0)
- char inputFrameSize[10];
- int count =0;
- int cnt = 0;
+ char inputFrameSize[12];
+ int count =0; char cnt =0;
memset(temp_buffer, 0, sizeof(temp_buffer));
DEBUG_PRINT("Inside %s \n", __FUNCTION__);
@@ -1884,7 +2603,7 @@ static int Read_Buffer_From_DAT_File(OMX_BUFFERHEADERTYPE *pBufHdr)
/* Check the input file format, may result in infinite loop */
{
DEBUG_PRINT("loop[%d] count[%d]\n",cnt,count);
- count = fread(&inputFrameSize[cnt], 1, 1, inputBufferFile);
+ count = read( inputBufferFileFd, &inputFrameSize[cnt], 1);
if(inputFrameSize[cnt] == '\0' )
break;
cnt++;
@@ -1894,8 +2613,8 @@ static int Read_Buffer_From_DAT_File(OMX_BUFFERHEADERTYPE *pBufHdr)
pBufHdr->nFilledLen = 0;
/* get the frame length */
- fseek(inputBufferFile, -1, SEEK_CUR);
- bytes_read = fread(pBufHdr->pBuffer, 1, frameSize, inputBufferFile);
+ lseek64(inputBufferFileFd, -1, SEEK_CUR);
+ bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer, frameSize);
DEBUG_PRINT("Actual frame Size [%d] bytes_read using fread[%d]\n",
frameSize, bytes_read);
@@ -1913,27 +2632,23 @@ static int Read_Buffer_From_DAT_File(OMX_BUFFERHEADERTYPE *pBufHdr)
static int Read_Buffer_ArbitraryBytes(OMX_BUFFERHEADERTYPE *pBufHdr)
{
- char temp_buffer[10];
- char temp_byte;
int bytes_read=0;
- int i=0;
- unsigned char *read_buffer=NULL;
- char c = '1'; //initialize to anything except '\0'(0)
- char inputFrameSize[10];
- int count =0; char cnt =0;
- memset(temp_buffer, 0, sizeof(temp_buffer));
-
DEBUG_PRINT("Inside %s \n", __FUNCTION__);
-
- bytes_read = fread(pBufHdr->pBuffer, 1, NUMBER_OF_ARBITRARYBYTES_READ, inputBufferFile);
-
+ bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer, NUMBER_OF_ARBITRARYBYTES_READ);
if(bytes_read == 0) {
DEBUG_PRINT("Bytes read Zero After Read frame Size \n");
DEBUG_PRINT("Checking VideoPlayback Count:video_playback_count is:%d\n",
video_playback_count);
return 0;
}
+#ifdef TEST_TS_FROM_SEI
+ if (timeStampLfile == 0)
+ pBufHdr->nTimeStamp = 0;
+ else
+ pBufHdr->nTimeStamp = LLONG_MAX;
+#else
pBufHdr->nTimeStamp = timeStampLfile;
+#endif
timeStampLfile += timestampInterval;
return bytes_read;
}
@@ -1946,13 +2661,13 @@ static int Read_Buffer_From_Vop_Start_Code_File(OMX_BUFFERHEADERTYPE *pBufHdr)
pBufHdr->nFilledLen = 0;
static unsigned int header_code = 0;
- DEBUG_PRINT("Inside %s \n", __FUNCTION__);
+ DEBUG_PRINT("Inside %s", __FUNCTION__);
do
{
//Start codes are always byte aligned.
- bytes_read = fread(&pBufHdr->pBuffer[readOffset],1, 1,inputBufferFile);
- if(!bytes_read)
+ bytes_read = read(inputBufferFileFd, &pBufHdr->pBuffer[readOffset], 1);
+ if(bytes_read == 0 || bytes_read == -1)
{
DEBUG_PRINT("Bytes read Zero \n");
break;
@@ -1974,18 +2689,17 @@ static int Read_Buffer_From_Vop_Start_Code_File(OMX_BUFFERHEADERTYPE *pBufHdr)
}
if ((header_code == VOP_START_CODE) && (code == VOP_START_CODE))
{
- //Seek backwards by 4
- fseek(inputBufferFile, -4, SEEK_CUR);
- readOffset-=3;
- break;
-
+ //Seek backwards by 4
+ lseek64(inputBufferFileFd, -4, SEEK_CUR);
+ readOffset-=3;
+ break;
}
else if (( header_code == SHORT_HEADER_START_CODE ) && ( SHORT_HEADER_START_CODE == (code & 0xFFFFFC00)))
{
- //Seek backwards by 4
- fseek(inputBufferFile, -4, SEEK_CUR);
- readOffset-=3;
- break;
+ //Seek backwards by 4
+ lseek64(inputBufferFileFd, -4, SEEK_CUR);
+ readOffset-=3;
+ break;
}
}
readOffset++;
@@ -1994,6 +2708,88 @@ static int Read_Buffer_From_Vop_Start_Code_File(OMX_BUFFERHEADERTYPE *pBufHdr)
timeStampLfile += timestampInterval;
return readOffset;
}
+static int Read_Buffer_From_Mpeg2_Start_Code(OMX_BUFFERHEADERTYPE *pBufHdr)
+{
+ unsigned int readOffset = 0;
+ int bytesRead = 0;
+ unsigned int code = 0;
+ pBufHdr->nFilledLen = 0;
+ static unsigned int firstParse = true;
+ unsigned int seenFrame = false;
+
+ DEBUG_PRINT("Inside %s", __FUNCTION__);
+
+ /* Read one byte at a time. Construct the code every byte in order to
+ * compare to the start codes. Keep looping until we've read in a complete
+ * frame, which can be either just a picture start code + picture, or can
+ * include the sequence header as well
+ */
+ while (1) {
+ bytesRead = read(inputBufferFileFd, &pBufHdr->pBuffer[readOffset], 1);
+
+ /* Exit the loop if we can't read any more bytes */
+ if (bytesRead == 0 || bytesRead == -1) {
+ break;
+ }
+
+ /* Construct the code one byte at a time */
+ code <<= 8;
+ code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
+
+ /* Can't compare the code to MPEG2 start codes until we've read the
+ * first four bytes
+ */
+ if (readOffset >= 3) {
+
+ /* If this is the first time we're reading from the file, then we
+ * need to throw away the system start code information at the
+ * beginning. We can just look for the first sequence header.
+ */
+ if (firstParse) {
+ if (code == MPEG2_SEQ_START_CODE) {
+ /* Seek back by 4 bytes and reset code so that we can skip
+ * down to the common case below.
+ */
+ lseek(inputBufferFileFd, -4, SEEK_CUR);
+ code = 0;
+ readOffset -= 3;
+ firstParse = false;
+ continue;
+ }
+ }
+
+ /* If we have already parsed a frame and we see a sequence header, then
+ * the sequence header is part of the next frame so we seek back and
+ * break.
+ */
+ if (code == MPEG2_SEQ_START_CODE) {
+ if (seenFrame) {
+ lseek(inputBufferFileFd, -4, SEEK_CUR);
+ readOffset -= 3;
+ break;
+ }
+ /* If we haven't seen a frame yet, then read in all the data until we
+ * either see another frame start code or sequence header start code.
+ */
+ } else if (code == MPEG2_FRAME_START_CODE) {
+ if (!seenFrame) {
+ seenFrame = true;
+ } else {
+ lseek(inputBufferFileFd, -4, SEEK_CUR);
+ readOffset -= 3;
+ break;
+ }
+ }
+ }
+
+ readOffset++;
+ }
+
+ pBufHdr->nTimeStamp = timeStampLfile;
+ timeStampLfile += timestampInterval;
+ return readOffset;
+}
+
static int Read_Buffer_From_Size_Nal(OMX_BUFFERHEADERTYPE *pBufHdr)
{
@@ -2002,11 +2798,11 @@ static int Read_Buffer_From_Size_Nal(OMX_BUFFERHEADERTYPE *pBufHdr)
int i = 0;
int j = 0;
unsigned int size = 0; // Need to make sure that uint32 has SIZE_NAL_FIELD_MAX (4) bytes
- unsigned int bytes_read = 0;
+ int bytes_read = 0;
// read the "size_nal_field"-byte size field
- bytes_read = fread(pBufHdr->pBuffer + pBufHdr->nOffset, 1, nalSize, inputBufferFile);
- if (bytes_read == 0)
+ bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer + pBufHdr->nOffset, nalSize);
+ if (bytes_read == 0 || bytes_read == -1)
{
DEBUG_PRINT("Failed to read frame or it might be EOF\n");
return 0;
@@ -2025,12 +2821,15 @@ static int Read_Buffer_From_Size_Nal(OMX_BUFFERHEADERTYPE *pBufHdr)
size = (unsigned int)(*((unsigned int *)(temp_size)));
// now read the data
- bytes_read = fread(pBufHdr->pBuffer + pBufHdr->nOffset + nalSize, 1, size, inputBufferFile);
+ bytes_read = read(inputBufferFileFd, pBufHdr->pBuffer + pBufHdr->nOffset + nalSize, size);
if (bytes_read != size)
{
DEBUG_PRINT_ERROR("Failed to read frame\n");
}
+ pBufHdr->nTimeStamp = timeStampLfile;
+ timeStampLfile += timestampInterval;
+
return bytes_read + nalSize;
}
@@ -2043,20 +2842,21 @@ static int Read_Buffer_From_RCV_File_Seq_Layer(OMX_BUFFERHEADERTYPE *pBufHdr)
DEBUG_PRINT("Inside %s \n", __FUNCTION__);
- fread(&startcode, 4, 1, inputBufferFile);
+ read(inputBufferFileFd, &startcode, 4);
/* read size of struct C as it need not be 4 always*/
- fread(&size_struct_C, 1, 4, inputBufferFile);
+ read(inputBufferFileFd, &size_struct_C, 4);
/* reseek to beginning of sequence header */
- fseek(inputBufferFile, -8, SEEK_CUR);
+ lseek64(inputBufferFileFd, -8, SEEK_CUR);
if ((startcode & 0xFF000000) == 0xC5000000)
{
DEBUG_PRINT("Read_Buffer_From_RCV_File_Seq_Layer size_struct_C: %d\n", size_struct_C);
- readOffset = fread(pBufHdr->pBuffer, 1, VC1_SEQ_LAYER_SIZE_WITHOUT_STRUCTC + size_struct_C, inputBufferFile);
+ readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, VC1_SEQ_LAYER_SIZE_WITHOUT_STRUCTC + size_struct_C);
+
}
else if((startcode & 0xFF000000) == 0x85000000)
{
@@ -2066,7 +2866,8 @@ static int Read_Buffer_From_RCV_File_Seq_Layer(OMX_BUFFERHEADERTYPE *pBufHdr)
DEBUG_PRINT("Read_Buffer_From_RCV_File_Seq_Layer size_struct_C: %d\n", size_struct_C);
- readOffset = fread(pBufHdr->pBuffer, 1, VC1_SEQ_LAYER_SIZE_V1_WITHOUT_STRUCTC + size_struct_C, inputBufferFile);
+ readOffset = read(inputBufferFileFd, pBufHdr->pBuffer, VC1_SEQ_LAYER_SIZE_V1_WITHOUT_STRUCTC + size_struct_C);
+
}
else
{
@@ -2102,17 +2903,17 @@ static int Read_Buffer_From_RCV_File(OMX_BUFFERHEADERTYPE *pBufHdr)
{
/* for the case of RCV V1 format, the frame header is only of 4 bytes and has
only the frame size information */
- readOffset = fread(&len, 1, 4, inputBufferFile);
- DEBUG_PRINT("Read_Buffer_From_RCV_File - framesize %d %x\n", len, len);
+ readOffset = read(inputBufferFileFd, &len, 4);
+ DEBUG_PRINT("Read_Buffer_From_RCV_File - framesize %d %x\n", len, len);
}
else
{
/* for a regular RCV file, 3 bytes comprise the frame size and 1 byte for key*/
- readOffset = fread(&len, 1, 3, inputBufferFile);
- DEBUG_PRINT("Read_Buffer_From_RCV_File - framesize %d %x\n", len, len);
+ readOffset = read(inputBufferFileFd, &len, 3);
+ DEBUG_PRINT("Read_Buffer_From_RCV_File - framesize %d %x\n", len, len);
- readOffset = fread(&key, 1, 1, inputBufferFile);
+ readOffset = read(inputBufferFileFd, &key, 1);
if ( (key & 0x80) == false)
{
DEBUG_PRINT("Read_Buffer_From_RCV_File - Non IDR frame key %x\n", key);
@@ -2123,9 +2924,9 @@ static int Read_Buffer_From_RCV_File(OMX_BUFFERHEADERTYPE *pBufHdr)
if(!rcv_v1)
{
/* There is timestamp field only for regular RCV format and not for RCV V1 format*/
- readOffset = fread(&pBufHdr->nTimeStamp, 1, 4, inputBufferFile);
- DEBUG_PRINT("Read_Buffer_From_RCV_File - timeStamp %d\n", pBufHdr->nTimeStamp);
- pBufHdr->nTimeStamp *= 1000;
+ readOffset = read(inputBufferFileFd, &pBufHdr->nTimeStamp, 4);
+ DEBUG_PRINT("Read_Buffer_From_RCV_File - timeStamp %d\n", pBufHdr->nTimeStamp);
+ pBufHdr->nTimeStamp *= 1000;
}
else
{
@@ -2136,12 +2937,16 @@ static int Read_Buffer_From_RCV_File(OMX_BUFFERHEADERTYPE *pBufHdr)
if(len > pBufHdr->nAllocLen)
{
DEBUG_PRINT_ERROR("Error in sufficient buffer framesize %d, allocalen %d noffset %d\n",len,pBufHdr->nAllocLen, pBufHdr->nOffset);
- readOffset = fread(pBufHdr->pBuffer+pBufHdr->nOffset, 1, pBufHdr->nAllocLen - pBufHdr->nOffset , inputBufferFile);
- fseek(inputBufferFile, len - readOffset,SEEK_CUR);
+ readOffset = read(inputBufferFileFd, pBufHdr->pBuffer+pBufHdr->nOffset,
+ pBufHdr->nAllocLen - pBufHdr->nOffset);
+
+ loff_t off = (len - readOffset)*1LL;
+ lseek64(inputBufferFileFd, off ,SEEK_CUR);
return readOffset;
}
- else
- readOffset = fread(pBufHdr->pBuffer+pBufHdr->nOffset, 1, len, inputBufferFile);
+ else {
+ readOffset = read(inputBufferFileFd, pBufHdr->pBuffer+pBufHdr->nOffset, len);
+ }
if (readOffset != len)
{
DEBUG_PRINT("EOS reach or Reading error %d, %s \n", readOffset, strerror( errno ));
@@ -2171,30 +2976,70 @@ static int Read_Buffer_From_VC1_File(OMX_BUFFERHEADERTYPE *pBufHdr)
static int timeStampLfile = 0;
OMX_U8 *pBuffer = pBufHdr->pBuffer + pBufHdr->nOffset;
DEBUG_PRINT("Inside %s \n", __FUNCTION__);
-
unsigned int readOffset = 0;
int bytes_read = 0;
- unsigned int code = 0;
+ unsigned int code = 0, total_bytes = 0;
+ int startCode_cnt = 0;
+ int bSEQflag = 0;
+ int bEntryflag = 0;
+ unsigned int SEQbytes = 0;
+ int numStartcodes = 0;
+
+ numStartcodes = bHdrflag?1:2;
do
{
+ if (total_bytes == pBufHdr->nAllocLen)
+ {
+ DEBUG_PRINT_ERROR("Buffer overflow!");
+ break;
+ }
//Start codes are always byte aligned.
- bytes_read = fread(&pBuffer[readOffset],1, 1,inputBufferFile);
+ bytes_read = read(inputBufferFileFd, &pBuffer[readOffset],1 );
+
if(!bytes_read)
{
DEBUG_PRINT("\n Bytes read Zero \n");
break;
}
+ total_bytes++;
code <<= 8;
code |= (0x000000FF & pBufHdr->pBuffer[readOffset]);
+
+ if(!bSEQflag && (code == VC1_SEQUENCE_START_CODE)) {
+ if(startCode_cnt) bSEQflag = 1;
+ }
+
+ if(!bEntryflag && ( code == VC1_ENTRY_POINT_START_CODE)) {
+ if(startCode_cnt) bEntryflag = 1;
+ }
+
+ if(code == VC1_FRAME_START_CODE || code == VC1_FRAME_FIELD_CODE)
+ {
+ startCode_cnt++ ;
+ }
+
//VOP start code comparision
- if (readOffset>3)
+ if(startCode_cnt == numStartcodes)
{
- if (VC1_FRAME_START_CODE == (code & 0xFFFFFFFF))
+ if (VC1_FRAME_START_CODE == (code & 0xFFFFFFFF) ||
+ VC1_FRAME_FIELD_CODE == (code & 0xFFFFFFFF))
{
- //Seek backwards by 4
- fseek(inputBufferFile, -4, SEEK_CUR);
- readOffset-=3;
+ previous_vc1_au = 0;
+ if(VC1_FRAME_FIELD_CODE == (code & 0xFFFFFFFF))
+ {
+ previous_vc1_au = 1;
+ }
+
+ if(!bHdrflag && (bSEQflag || bEntryflag)) {
+ lseek(inputBufferFileFd,-(SEQbytes+4),SEEK_CUR);
+ readOffset -= (SEQbytes+3);
+ }
+ else {
+ //Seek backwards by 4
+ lseek64(inputBufferFileFd, -4, SEEK_CUR);
+ readOffset-=3;
+ }
while(pBufHdr->pBuffer[readOffset-1] == 0)
readOffset--;
@@ -2203,6 +3048,9 @@ static int Read_Buffer_From_VC1_File(OMX_BUFFERHEADERTYPE *pBufHdr)
}
}
readOffset++;
+ if(bSEQflag || bEntryflag) {
+ SEQbytes++;
+ }
}while (1);
pBufHdr->nTimeStamp = timeStampLfile;
@@ -2226,24 +3074,208 @@ static int Read_Buffer_From_VC1_File(OMX_BUFFERHEADERTYPE *pBufHdr)
return readOffset;
}
+static int Read_Buffer_From_DivX_4_5_6_File(OMX_BUFFERHEADERTYPE *pBufHdr)
+{
+#define MAX_NO_B_FRMS 3 // Number of non-b-frames packed in each buffer
+#define N_PREV_FRMS_B 1 // Number of previous non-b-frames packed
+ // with a set of consecutive b-frames
+#define FRM_ARRAY_SIZE (MAX_NO_B_FRMS + N_PREV_FRMS_B)
+ char *p_buffer = NULL;
+ unsigned int offset_array[FRM_ARRAY_SIZE];
+ int byte_cntr, pckt_end_idx;
+ unsigned int read_code = 0, bytes_read, byte_pos = 0, frame_type;
+ unsigned int i, b_frm_idx, b_frames_found = 0, vop_set_cntr = 0;
+ bool pckt_ready = false;
+#ifdef __DEBUG_DIVX__
+ char pckt_type[20];
+ int pckd_frms = 0;
+ static unsigned long long int total_bytes = 0;
+ static unsigned long long int total_frames = 0;
+#endif //__DEBUG_DIVX__
+
+ DEBUG_PRINT("Inside %s \n", __FUNCTION__);
+
+ do {
+ p_buffer = (char *)pBufHdr->pBuffer + byte_pos;
+
+ bytes_read = read(inputBufferFileFd, p_buffer, NUMBER_OF_ARBITRARYBYTES_READ);
+ byte_pos += bytes_read;
+ for (byte_cntr = 0; byte_cntr < bytes_read && !pckt_ready; byte_cntr++) {
+ read_code <<= 8;
+ ((char*)&read_code)[0] = p_buffer[byte_cntr];
+ if (read_code == VOP_START_CODE) {
+ if (++byte_cntr < bytes_read) {
+ frame_type = p_buffer[byte_cntr];
+ frame_type &= 0x000000C0;
+#ifdef __DEBUG_DIVX__
+ switch (frame_type) {
+ case 0x00: pckt_type[pckd_frms] = 'I'; break;
+ case 0x40: pckt_type[pckd_frms] = 'P'; break;
+ case 0x80: pckt_type[pckd_frms] = 'B'; break;
+ default: pckt_type[pckd_frms] = 'X';
+ }
+ pckd_frms++;
+#endif // __DEBUG_DIVX__
+ offset_array[vop_set_cntr] = byte_pos - bytes_read + byte_cntr - 4;
+ if (frame_type == 0x80) { // B Frame found!
+ if (!b_frames_found) {
+ // Try to packet N_PREV_FRMS_B previous frames
+ // with the next consecutive B frames
+ i = N_PREV_FRMS_B;
+ while ((vop_set_cntr - i) < 0 && i > 0) i--;
+ b_frm_idx = vop_set_cntr - i;
+ if (b_frm_idx > 0) {
+ pckt_end_idx = b_frm_idx;
+ pckt_ready = true;
+#ifdef __DEBUG_DIVX__
+ pckt_type[b_frm_idx] = '\0';
+ total_frames += b_frm_idx;
+#endif //__DEBUG_DIVX__
+ }
+ }
+ b_frames_found++;
+ } else if (b_frames_found) {
+ pckt_end_idx = vop_set_cntr;
+ pckt_ready = true;
+#ifdef __DEBUG_DIVX__
+ pckt_type[pckd_frms - 1] = '\0';
+ total_frames += pckd_frms - 1;
+#endif //__DEBUG_DIVX__
+ } else if (vop_set_cntr == (FRM_ARRAY_SIZE -1)) {
+ pckt_end_idx = MAX_NO_B_FRMS;
+ pckt_ready = true;
+#ifdef __DEBUG_DIVX__
+ pckt_type[pckt_end_idx] = '\0';
+ total_frames += pckt_end_idx;
+#endif //__DEBUG_DIVX__
+ } else
+ vop_set_cntr++;
+ } else {
+ // The vop start code was found in the last 4 bytes,
+ // seek backwards by 4 to include this start code
+ // with the next buffer.
+ lseek64(inputBufferFileFd, -4, SEEK_CUR);
+ byte_pos -= 4;
+#ifdef __DEBUG_DIVX__
+ pckd_frms--;
+#endif //__DEBUG_DIVX__
+ }
+ }
+ }
+ if (pckt_ready) {
+ loff_t off = (byte_pos - offset_array[pckt_end_idx]);
+ if ( lseek64(inputBufferFileFd, -1LL*off , SEEK_CUR) == -1 ){
+ DEBUG_PRINT_ERROR("lseek64 with offset = %lld failed with errno %d"
+ ", current position =0x%llx", -1LL*off,
+ errno, lseek64(inputBufferFileFd, 0, SEEK_CUR));
+ }
+ }
+ else {
+ char eofByte;
+ int ret = read(inputBufferFileFd, &eofByte, 1 );
+ if ( ret == 0 ) {
+ offset_array[vop_set_cntr] = byte_pos;
+ pckt_end_idx = vop_set_cntr;
+ pckt_ready = true;
+#ifdef __DEBUG_DIVX__
+ pckt_type[pckd_frms] = '\0';
+ total_frames += pckd_frms;
+#endif //__DEBUG_DIVX__
+ }
+ else if (ret == 1){
+ if ( lseek64(inputBufferFileFd, -1, SEEK_CUR ) == -1 ){
+ DEBUG_PRINT_ERROR("lseek64 failed with errno = %d, "
+ "current fileposition = %llx",
+ errno,
+ lseek64(inputBufferFileFd, 0, SEEK_CUR));
+ }
+ }
+ else {
+ DEBUG_PRINT_ERROR("Error when checking for EOF");
+ }
+ }
+ } while (!pckt_ready);
+ pBufHdr->nFilledLen = offset_array[pckt_end_idx];
+ pBufHdr->nTimeStamp = timeStampLfile;
+ timeStampLfile += timestampInterval;
+#ifdef __DEBUG_DIVX__
+ total_bytes += pBufHdr->nFilledLen;
+ ALOGE("[DivX] Packet: Type[%s] Size[%u] TS[%lld] TB[%llx] NFrms[%lld]\n",
+ pckt_type, pBufHdr->nFilledLen, pBufHdr->nTimeStamp,
+ total_bytes, total_frames);
+#endif //__DEBUG_DIVX__
+ return pBufHdr->nFilledLen;
+}
+
+static int Read_Buffer_From_DivX_311_File(OMX_BUFFERHEADERTYPE *pBufHdr)
+{
+ static OMX_S64 timeStampLfile = 0;
+ char *p_buffer = NULL;
+ bool pkt_ready = false;
+ unsigned int frame_type = 0;
+ unsigned int bytes_read = 0;
+ unsigned int frame_size = 0;
+ unsigned int num_bytes_size = 4;
+ unsigned int num_bytes_frame_type = 1;
+ unsigned int n_offset = pBufHdr->nOffset;
+
+ DEBUG_PRINT("Inside %s \n", __FUNCTION__);
+
+ pBufHdr->nTimeStamp = timeStampLfile;
+
+ if (pBufHdr != NULL)
+ {
+ p_buffer = (char *)pBufHdr->pBuffer + pBufHdr->nOffset;
+ }
+ else
+ {
+ DEBUG_PRINT("\n ERROR:Read_Buffer_From_DivX_311_File: pBufHdr is NULL\n");
+ return 0;
+ }
+
+ if (p_buffer == NULL)
+ {
+ DEBUG_PRINT("\n ERROR:Read_Buffer_From_DivX_311_File: p_bufhdr is NULL\n");
+ return 0;
+ }
+
+ //Read first frame based on size
+ //DivX 311 frame - 4 byte header with size followed by the frame
+
+ bytes_read = read(inputBufferFileFd, &frame_size, num_bytes_size);
+
+ DEBUG_PRINT("Read_Buffer_From_DivX_311_File: Frame size = %d\n", frame_size);
+ n_offset += read(inputBufferFileFd, p_buffer, frame_size);
+
+ pBufHdr->nTimeStamp = timeStampLfile;
+
+ timeStampLfile += timestampInterval;
+
+ //the packet is ready to be sent
+ DEBUG_PRINT("\nReturning Read Buffer from Divx 311: TS=[%ld], Offset=[%d]\n",
+ (long int)pBufHdr->nTimeStamp,
+ n_offset );
+
+ return n_offset;
+}
+
static int open_video_file ()
{
int error_code = 0;
char outputfilename[512];
DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, in_filename);
- inputBufferFile = fopen (in_filename, "rb");
- if (inputBufferFile == NULL) {
- DEBUG_PRINT_ERROR("Error - i/p file %s could NOT be opened\n",
- in_filename);
+ if ( (inputBufferFileFd = open( in_filename, O_RDONLY | O_LARGEFILE) ) == -1 ){
+ DEBUG_PRINT_ERROR("Error - i/p file %s could NOT be opened errno = %d\n",
+ in_filename, errno);
error_code = -1;
}
else {
- DEBUG_PRINT("I/p file %s is opened \n", in_filename);
+ DEBUG_PRINT_ERROR("i/p file %s is opened \n", in_filename);
}
if (takeYuvLog) {
- strcpy(outputfilename, "/data/misc/yuv");
+ strlcpy(outputfilename, "yuvframes.yuv", 14);
outputBufferFile = fopen (outputfilename, "ab");
if (outputBufferFile == NULL)
{
@@ -2273,7 +3305,7 @@ void swap_byte(char *pByte, int nbyte)
int drawBG(void)
{
int result;
- unsigned int i;
+ int i;
#ifdef FRAMEBUFFER_32
long * p;
#else
@@ -2310,6 +3342,130 @@ int drawBG(void)
return 0;
}
+void overlay_set()
+{
+ overlayp = &overlay;
+ overlayp->src.width = stride;
+ overlayp->src.height = sliceheight;
+#ifdef MAX_RES_720P
+ overlayp->src.format = MDP_Y_CRCB_H2V2;
+ if(color_fmt == (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
+ {
+ overlayp->src.format = MDP_Y_CRCB_H2V2_TILE;
+ }
+#endif
+#ifdef MAX_RES_1080P
+ overlayp->src.format = MDP_Y_CBCR_H2V2_TILE;
+#endif
+ overlayp->src_rect.x = 0;
+ overlayp->src_rect.y = 0;
+ overlayp->src_rect.w = width;
+ overlayp->src_rect.h = height;
+
+ if(width >= vinfo.xres)
+ {
+ overlayp->dst_rect.x = 0;
+ overlayp->dst_rect.w = vinfo.xres;
+ }
+ else
+ {
+ overlayp->dst_rect.x = (vinfo.xres - width)/2;
+ overlayp->dst_rect.w = width;
+ }
+
+ if(height >= vinfo.yres)
+ {
+ overlayp->dst_rect.h = (overlayp->dst_rect.w * height)/width;
+ overlayp->dst_rect.y = 0;
+ if (overlayp->dst_rect.h < vinfo.yres)
+ overlayp->dst_rect.y = (vinfo.yres - overlayp->dst_rect.h)/2;
+ }
+ else
+ {
+ overlayp->dst_rect.y = (vinfo.yres - height)/2;
+ overlayp->dst_rect.h = height;
+ }
+
+ overlayp->z_order = 0;
+ printf("overlayp->dst_rect.x = %u \n", overlayp->dst_rect.x);
+ printf("overlayp->dst_rect.y = %u \n", overlayp->dst_rect.y);
+ printf("overlayp->dst_rect.w = %u \n", overlayp->dst_rect.w);
+ printf("overlayp->dst_rect.h = %u \n", overlayp->dst_rect.h);
+
+ overlayp->alpha = 0x0;
+ overlayp->transp_mask = 0xFFFFFFFF;
+ overlayp->flags = 0;
+ overlayp->is_fg = 0;
+
+ overlayp->id = MSMFB_NEW_REQUEST;
+ vid_buf_front_id = ioctl(fb_fd, MSMFB_OVERLAY_SET, overlayp);
+ if (vid_buf_front_id < 0)
+ {
+ printf("ERROR: MSMFB_OVERLAY_SET failed! line=%d\n", __LINE__);
+ }
+ vid_buf_front_id = overlayp->id;
+ DEBUG_PRINT("\n vid_buf_front_id = %u", vid_buf_front_id);
+ drawBG();
+ displayYuv = 2;
+}
+
+int overlay_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr)
+{
+ OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
+ struct msmfb_overlay_data ov_front;
+ memset(&ov_front, 0, sizeof(struct msmfb_overlay_data));
+#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
+ MemoryHeapBase *vheap = NULL;
+#endif
+
+ DEBUG_PRINT("overlay_fb:");
+ ov_front.id = overlayp->id;
+ if (pBufHdr->pPlatformPrivate == NULL)
+ {
+ ALOGE("overlay_fb: pPlatformPrivate is null");
+ return -1;
+ }
+ pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
+ ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
+ pBufHdr->pPlatformPrivate)->entryList->entry;
+ if (pPMEMInfo == NULL)
+ {
+
+ ALOGE("overlay_fb: pmem_info is null");
+ return -1;
+ }
+#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
+ vheap = (MemoryHeapBase*)pPMEMInfo->pmem_fd;
+#endif
+
+#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
+ ov_front.data.memory_id = vheap->getHeapID();
+#else
+ ov_front.data.memory_id = pPMEMInfo->pmem_fd;
+#endif
+
+ ov_front.data.offset = pPMEMInfo->offset;
+
+ DEBUG_PRINT("\n ov_front.data.memory_id = %d", ov_front.data.memory_id);
+ DEBUG_PRINT("\n ov_front.data.offset = %u", ov_front.data.offset);
+ if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, (void*)&ov_front))
+ {
+ printf("\nERROR! MSMFB_OVERLAY_PLAY failed at frame (Line %d)\n",
+ __LINE__);
+ return -1;
+ }
+ DEBUG_PRINT("\nMSMFB_OVERLAY_PLAY successfull");
+ return 0;
+}
+
+void overlay_unset()
+{
+ if (ioctl(fb_fd, MSMFB_OVERLAY_UNSET, &vid_buf_front_id))
+ {
+ printf("\nERROR! MSMFB_OVERLAY_UNSET failed! (Line %d)\n", __LINE__);
+ }
+}
+
void render_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr)
{
unsigned int addr = 0;
@@ -2317,7 +3473,7 @@ void render_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr)
OMX_QCOM_EXTRADATA_FRAMEINFO *pExtraFrameInfo = 0;
OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
unsigned int destx, desty,destW, destH;
-#ifdef _ANDROID_
+#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
MemoryHeapBase *vheap = NULL;
#endif
@@ -2346,13 +3502,13 @@ void render_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr)
// read to the end of existing extra data sections
pExtraData = (OMX_OTHER_EXTRADATATYPE*)addr;
- while (addr < end && pExtraData->eType != (enum OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo)
+ while (addr < end && pExtraData->eType != OMX_ExtraDataFrameInfo)
{
addr += pExtraData->nSize;
pExtraData = (OMX_OTHER_EXTRADATATYPE*)addr;
}
- if (pExtraData->eType != (enum OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo)
+ if (pExtraData->eType != OMX_ExtraDataFrameInfo)
{
DEBUG_PRINT_ERROR("pExtraData->eType %d pExtraData->nSize %d\n",pExtraData->eType,pExtraData->nSize);
}
@@ -2361,7 +3517,7 @@ void render_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr)
pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
pBufHdr->pPlatformPrivate)->entryList->entry;
-#ifdef _ANDROID_
+#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
vheap = (MemoryHeapBase *)pPMEMInfo->pmem_fd;
#endif
@@ -2375,7 +3531,7 @@ void render_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr)
e->src.height = portFmt.format.video.nSliceHeight;
e->src.format = MDP_Y_CBCR_H2V2;
e->src.offset = pPMEMInfo->offset;
-#ifdef _ANDROID_
+#if defined(_ANDROID_) && !defined(USE_EGL_IMAGE_TEST_APP) && !defined(USE_EXTERN_PMEM_BUF)
e->src.memory_id = vheap->getHeapID();
#else
e->src.memory_id = pPMEMInfo->pmem_fd;
@@ -2468,3 +3624,293 @@ void render_fb(struct OMX_BUFFERHEADERTYPE *pBufHdr)
DEBUG_PRINT("render_fb complete!\n");
}
+int disable_output_port()
+{
+ DEBUG_PRINT("DISABLING OP PORT\n");
+ pthread_mutex_lock(&enable_lock);
+ sent_disabled = 1;
+ // Send DISABLE command
+ OMX_SendCommand(dec_handle, OMX_CommandPortDisable, 1, 0);
+ pthread_mutex_unlock(&enable_lock);
+ // wait for Disable event to come back
+ wait_for_event();
+ if(p_eglHeaders) {
+ free(p_eglHeaders);
+ p_eglHeaders = NULL;
+ }
+ if (pPMEMInfo)
+ {
+ DEBUG_PRINT("Freeing in external pmem case:PMEM");
+ free(pPMEMInfo);
+ pPMEMInfo = NULL;
+ }
+ if (pPlatformEntry)
+ {
+ DEBUG_PRINT("Freeing in external pmem case:ENTRY");
+ free(pPlatformEntry);
+ pPlatformEntry = NULL;
+ }
+ if (pPlatformList)
+ {
+ DEBUG_PRINT("Freeing in external pmem case:LIST");
+ free(pPlatformList);
+ pPlatformList = NULL;
+ }
+ if (currentStatus == ERROR_STATE)
+ {
+ do_freeHandle_and_clean_up(true);
+ return -1;
+ }
+ DEBUG_PRINT("OP PORT DISABLED!\n");
+ return 0;
+}
+
+int enable_output_port()
+{
+ int bufCnt = 0;
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ DEBUG_PRINT("ENABLING OP PORT\n");
+ // Send Enable command
+ OMX_SendCommand(dec_handle, OMX_CommandPortEnable, 1, 0);
+#ifndef USE_EGL_IMAGE_TEST_APP
+ /* Allocate buffer on decoder's o/p port */
+ portFmt.nPortIndex = 1;
+ if (use_external_pmem_buf)
+ {
+ DEBUG_PRINT("Enable op port: calling use_buffer_mult_fd\n");
+ error = use_output_buffer_multiple_fd(dec_handle,
+ &pOutYUVBufHdrs,
+ portFmt.nPortIndex,
+ portFmt.nBufferSize,
+ portFmt.nBufferCountActual);
+ }
+ else
+ {
+ error = Allocate_Buffer(dec_handle, &pOutYUVBufHdrs, portFmt.nPortIndex,
+ portFmt.nBufferCountActual, portFmt.nBufferSize);
+ }
+ if (error != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("Error - OMX_AllocateBuffer Output buffer error\n");
+ return -1;
+ }
+ else
+ {
+ DEBUG_PRINT("OMX_AllocateBuffer Output buffer success\n");
+ free_op_buf_cnt = portFmt.nBufferCountActual;
+ }
+#else
+ error = use_output_buffer(dec_handle,
+ &pOutYUVBufHdrs,
+ portFmt.nPortIndex,
+ portFmt.nBufferSize,
+ portFmt.nBufferCountActual);
+ free_op_buf_cnt = portFmt.nBufferCountActual;
+ if (error != OMX_ErrorNone) {
+ DEBUG_PRINT_ERROR("ERROR - OMX_UseBuffer Input buffer failed");
+ return -1;
+ }
+ else {
+ DEBUG_PRINT("OMX_UseBuffer Input buffer success\n");
+ }
+
+#endif
+ // wait for enable event to come back
+ wait_for_event();
+ if (currentStatus == ERROR_STATE)
+ {
+ do_freeHandle_and_clean_up(true);
+ return -1;
+ }
+ if (pOutYUVBufHdrs == NULL)
+ {
+ DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs is NULL\n");
+ return -1;
+ }
+ for(bufCnt=0; bufCnt < portFmt.nBufferCountActual; ++bufCnt) {
+ DEBUG_PRINT("OMX_FillThisBuffer on output buf no.%d\n",bufCnt);
+ if (pOutYUVBufHdrs[bufCnt] == NULL)
+ {
+ DEBUG_PRINT_ERROR("Error - pOutYUVBufHdrs[%d] is NULL\n", bufCnt);
+ return -1;
+ }
+ pOutYUVBufHdrs[bufCnt]->nOutputPortIndex = 1;
+ pOutYUVBufHdrs[bufCnt]->nFlags &= ~OMX_BUFFERFLAG_EOS;
+ ret = OMX_FillThisBuffer(dec_handle, pOutYUVBufHdrs[bufCnt]);
+ if (OMX_ErrorNone != ret) {
+ DEBUG_PRINT_ERROR("ERROR - OMX_FillThisBuffer failed with result %d\n", ret);
+ }
+ else
+ {
+ DEBUG_PRINT("OMX_FillThisBuffer success!\n");
+ free_op_buf_cnt--;
+ }
+ }
+ DEBUG_PRINT("OP PORT ENABLED!\n");
+ return 0;
+}
+
+int output_port_reconfig()
+{
+ DEBUG_PRINT("PORT_SETTING_CHANGE_STATE\n");
+ if (disable_output_port() != 0)
+ return -1;
+
+ /* Port for which the Client needs to obtain info */
+ portFmt.nPortIndex = 1;
+ OMX_GetParameter(dec_handle,OMX_IndexParamPortDefinition,&portFmt);
+ DEBUG_PRINT("Min Buffer Count=%d", portFmt.nBufferCountMin);
+ DEBUG_PRINT("Buffer Size=%d", portFmt.nBufferSize);
+ if(OMX_DirOutput != portFmt.eDir) {
+ DEBUG_PRINT_ERROR("Error - Expect Output Port\n");
+ return -1;
+ }
+ height = portFmt.format.video.nFrameHeight;
+ width = portFmt.format.video.nFrameWidth;
+ stride = portFmt.format.video.nStride;
+ sliceheight = portFmt.format.video.nSliceHeight;
+
+ if (displayYuv == 2)
+ {
+ DEBUG_PRINT("Reconfiguration at middle of playback...");
+ close_display();
+ if (open_display() != 0)
+ {
+ printf("\n Error opening display! Video won't be displayed...");
+ displayYuv = 0;
+ }
+ }
+
+ if (displayYuv)
+ overlay_set();
+
+ if (enable_output_port() != 0)
+ return -1;
+ DEBUG_PRINT("PORT_SETTING_CHANGE DONE!\n");
+ return 0;
+}
+
+void free_output_buffers()
+{
+ int index = 0;
+ OMX_BUFFERHEADERTYPE *pBuffer = (OMX_BUFFERHEADERTYPE *)pop(fbd_queue);
+ while (pBuffer) {
+ DEBUG_PRINT("\n pOutYUVBufHdrs %p p_eglHeaders %p output_use_buffer %d",
+ pOutYUVBufHdrs,p_eglHeaders,output_use_buffer);
+ if(pOutYUVBufHdrs && p_eglHeaders && output_use_buffer)
+ {
+ index = pBuffer - pOutYUVBufHdrs[0];
+ DEBUG_PRINT("\n Index of free buffer %d",index);
+ DEBUG_PRINT("\n Address freed %p size freed %d",pBuffer->pBuffer,
+ pBuffer->nAllocLen);
+ munmap((void *)use_buf_virt_addr[index],pBuffer->nAllocLen);
+ if(p_eglHeaders[index])
+ {
+ close(p_eglHeaders[index]->pmem_fd);
+ free(p_eglHeaders[index]);
+ p_eglHeaders[index] = NULL;
+ }
+ }
+
+ if (pOutYUVBufHdrs && use_external_pmem_buf)
+ {
+ index = pBuffer - pOutYUVBufHdrs[0];
+ DEBUG_PRINT("\n Address freed %p size freed %d,virt=0x%x,pmem_fd=0x%x",
+ pBuffer->pBuffer,
+ pBuffer->nAllocLen,
+ use_buf_virt_addr[index],
+ pPMEMInfo[index].pmem_fd);
+ munmap((void *)use_buf_virt_addr[index],pBuffer->nAllocLen);
+ getFreePmem();
+ use_buf_virt_addr[index] = -1;
+ if (&pPMEMInfo[index])
+ {
+ close(pPMEMInfo[index].pmem_fd);
+ pPMEMInfo[index].pmem_fd = -1;
+ }
+ }
+ DEBUG_PRINT("\n Free output buffer");
+ OMX_FreeBuffer(dec_handle, 1, pBuffer);
+ pBuffer = (OMX_BUFFERHEADERTYPE *)pop(fbd_queue);
+ }
+}
+
+#ifndef USE_ION
+static bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
+ 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 failed with pmem driver");
+ return false;
+ }
+ return true;
+}
+#endif
+
+int open_display()
+{
+#ifdef _ANDROID_
+ DEBUG_PRINT("\n Opening /dev/graphics/fb0");
+ fb_fd = open("/dev/graphics/fb0", O_RDWR);
+#else
+ DEBUG_PRINT("\n Opening /dev/fb0");
+ fb_fd = open("/dev/fb0", O_RDWR);
+#endif
+ if (fb_fd < 0) {
+ printf("[omx_vdec_test] - ERROR - can't open framebuffer!\n");
+ return -1;
+ }
+
+ DEBUG_PRINT("\n fb_fd = %d", fb_fd);
+ if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) < 0)
+ {
+ printf("[omx_vdec_test] - ERROR - can't retrieve fscreenInfo!\n");
+ close(fb_fd);
+ return -1;
+ }
+ if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo) < 0)
+ {
+ printf("[omx_vdec_test] - ERROR - can't retrieve vscreenInfo!\n");
+ close(fb_fd);
+ return -1;
+ }
+ return 0;
+}
+
+void close_display()
+{
+ overlay_unset();
+ close(fb_fd);
+ fb_fd = -1;
+}
+
+void getFreePmem()
+{
+#ifndef USE_ION
+ int ret = -1;
+ /*Open pmem device and query free pmem*/
+ int pmem_fd = open (PMEM_DEVICE,O_RDWR);
+
+ if(pmem_fd < 0) {
+ ALOGE("Unable to open pmem device");
+ return;
+ }
+ struct pmem_freespace fs;
+ ret = ioctl(pmem_fd, PMEM_GET_FREE_SPACE, &fs);
+ if(ret) {
+ ALOGE("IOCTL to query pmem free space failed");
+ goto freespace_query_failed;
+ }
+ ALOGE("Available free space %lx largest chunk %lx\n", fs.total, fs.largest);
+freespace_query_failed:
+ close(pmem_fd);
+#endif
+}
diff --git a/mm-video/vidc/venc/Android.mk b/mm-video/vidc/venc/Android.mk
index fd86b3f9..e6abcac9 100644..100755
--- a/mm-video/vidc/venc/Android.mk
+++ b/mm-video/vidc/venc/Android.mk
@@ -1,30 +1,4 @@
-#--------------------------------------------------------------------------
-#Copyright (c) 2010, Code Aurora Forum. All rights reserved.
-
-#Redistribution and use in source and binary forms, with or without
-#modification, are permitted provided that the following conditions are met:
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# * Neither the name of Code Aurora nor
-# the names of its contributors may be used to endorse or promote
-# products derived from this software without specific prior written
-# permission.
-
-#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-#IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-#NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-#CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-#EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-#PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-#OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-#WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-#OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-#ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#--------------------------------------------------------------------------
+ifneq ($(BUILD_TINY_ANDROID),true)
ROOT_DIR := $(call my-dir)
@@ -35,7 +9,6 @@ LOCAL_PATH:= $(ROOT_DIR)
# Common definitons
# ---------------------------------------------------------------------------------
-libmm-venc-def := -g -O3 -Dlrintf=_ffix_r
libmm-venc-def += -D__align=__alignx
libmm-venc-def += -D__alignx\(x\)=__attribute__\(\(__aligned__\(x\)\)\)
libmm-venc-def += -DT_ARM
@@ -44,25 +17,61 @@ libmm-venc-def += -D_ANDROID_
libmm-venc-def += -UENABLE_DEBUG_LOW
libmm-venc-def += -DENABLE_DEBUG_HIGH
libmm-venc-def += -DENABLE_DEBUG_ERROR
-
+libmm-venc-def += -UINPUT_BUFFER_LOG
+libmm-venc-def += -UOUTPUT_BUFFER_LOG
+libmm-venc-def += -USINGLE_ENCODER_INSTANCE
+ifeq ($(TARGET_BOARD_PLATFORM),msm8660)
+libmm-venc-def += -DMAX_RES_1080P
+endif
+ifeq ($(TARGET_BOARD_PLATFORM),msm8960)
+libmm-venc-def += -DMAX_RES_1080P
+libmm-venc-def += -DMAX_RES_1080P_EBI
+endif
+ifeq ($(TARGET_BOARD_PLATFORM),msm8974)
+libmm-venc-def += -DMAX_RES_1080P
+libmm-venc-def += -DMAX_RES_1080P_EBI
+libmm-venc-def += -DBADGER
+endif
+ifeq ($(TARGET_USES_ION),true)
+libmm-venc-def += -DUSE_ION
+endif
+libmm-venc-def += -D_ANDROID_ICS_
# ---------------------------------------------------------------------------------
# Make the Shared library (libOmxVenc)
# ---------------------------------------------------------------------------------
include $(CLEAR_VARS)
-libmm-venc-inc := $(LOCAL_PATH)/inc
-libmm-venc-inc += $(TARGET_OUT_HEADERS)/mm-core/omxcore
+libmm-venc-inc := bionic/libc/include
+libmm-venc-inc += bionic/libstdc++/include
+libmm-venc-inc := $(LOCAL_PATH)/inc
+libmm-venc-inc += $(OMX_VIDEO_PATH)/vidc/common/inc
+libmm-venc-inc += hardware/qcom/media/mm-core/inc
+#libmm-venc-inc += bionic/libc/kernel/common/linux
+libmm-venc-inc += hardware/qcom/media/libstagefrighthw
+libmm-venc-inc += hardware/qcom/display/libgralloc
+libmm-venc-inc += frameworks/native/include/media/hardware
+libmm-venc-inc += frameworks/native/include/media/openmax
+
+
+LOCAL_MODULE := libOmxVenc
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS := $(libmm-venc-def)
+LOCAL_C_INCLUDES := $(libmm-venc-inc)
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_SHARED_LIBRARIES := liblog libutils libbinder libcutils
-LOCAL_MODULE := libOmxVenc
-LOCAL_CFLAGS := $(libmm-venc-def)
-LOCAL_C_INCLUDES := $(libmm-venc-inc)
+LOCAL_SRC_FILES := src/omx_video_base.cpp
+LOCAL_SRC_FILES += src/omx_video_encoder.cpp
+ifeq ($(TARGET_BOARD_PLATFORM),msm8974)
+LOCAL_SRC_FILES += src/video_encoder_device_copper.cpp
+else
+LOCAL_SRC_FILES += src/video_encoder_device.cpp
+endif
-LOCAL_SHARED_LIBRARIES := liblog libutils libbinder
-LOCAL_SRC_FILES := src/omx_video_base.cpp
-LOCAL_SRC_FILES += src/omx_video_encoder.cpp
-LOCAL_SRC_FILES += src/video_encoder_device.cpp
+LOCAL_SRC_FILES += ../common/src/extra_data_handler.cpp
include $(BUILD_SHARED_LIBRARY)
@@ -72,13 +81,18 @@ include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
-mm-venc-test720p-inc := $(TARGET_OUT_HEADERS)/mm-core/omxcore
+mm-venc-test720p-inc := $(TARGET_OUT_HEADERS)/mm-core
mm-venc-test720p-inc += $(LOCAL_PATH)/inc
+mm-venc-test720p-inc += $(OMX_VIDEO_PATH)/vidc/common/inc
+mm-venc-test720p-inc += hardware/qcom/media/mm-core/inc
+mm-venc-test720p-inc += hardware/qcom/display/libgralloc
-LOCAL_MODULE_TAGS := eng
LOCAL_MODULE := mm-venc-omx-test720p
+LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS := $(libmm-venc-def)
LOCAL_C_INCLUDES := $(mm-venc-test720p-inc)
+#LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
+LOCAL_PRELINK_MODULE := false
LOCAL_SHARED_LIBRARIES := libmm-omxcore libOmxVenc libbinder
LOCAL_SRC_FILES := test/venc_test.cpp
@@ -96,11 +110,22 @@ include $(CLEAR_VARS)
venc-test-inc += $(LOCAL_PATH)/inc
-LOCAL_MODULE_TAGS := eng
LOCAL_MODULE := mm-video-encdrv-test
+LOCAL_MODULE_TAGS := optional
LOCAL_C_INCLUDES := $(venc-test-inc)
+LOCAL_C_INCLUDES += hardware/qcom/media/mm-core/inc
+
+#LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
+LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES := test/video_encoder_test.c
LOCAL_SRC_FILES += test/queue.c
include $(BUILD_EXECUTABLE)
+
+endif #BUILD_TINY_ANDROID
+
+# ---------------------------------------------------------------------------------
+# END
+# ---------------------------------------------------------------------------------
+
diff --git a/mm-video/vidc/venc/inc/camera_test.h b/mm-video/vidc/venc/inc/camera_test.h
index f531ac99..b277ce4a 100644..100755
--- a/mm-video/vidc/venc/inc/camera_test.h
+++ b/mm-video/vidc/venc/inc/camera_test.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/venc/inc/fb_test.h b/mm-video/vidc/venc/inc/fb_test.h
index 44fdf232..04082144 100644..100755
--- a/mm-video/vidc/venc/inc/fb_test.h
+++ b/mm-video/vidc/venc/inc/fb_test.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/venc/inc/omx_video_base.h b/mm-video/vidc/venc/inc/omx_video_base.h
index 034a43bb..b7f8ffd7 100644..100755
--- a/mm-video/vidc/venc/inc/omx_video_base.h
+++ b/mm-video/vidc/venc/inc/omx_video_base.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -43,8 +43,12 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include<stdlib.h>
#include <stdio.h>
+#include <sys/mman.h>
#ifdef _ANDROID_
#include <binder/MemoryHeapBase.h>
+#ifdef _ANDROID_ICS_
+ #include "QComOMXMetadata.h"
+#endif
#endif // _ANDROID_
#include <pthread.h>
#include <semaphore.h>
@@ -53,7 +57,8 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "OMX_QCOMExtns.h"
#include "qc_omx_component.h"
#include "omx_video_common.h"
-
+#include "extra_data_handler.h"
+#include <linux/videodev2.h>
#ifdef _ANDROID_
using namespace android;
@@ -66,14 +71,14 @@ public:
};
#include <utils/Log.h>
-//#define LOG_TAG "OMX-VENC-720p"
+#define LOG_TAG "OMX-VENC-720p"
#ifdef ENABLE_DEBUG_LOW
-#define DEBUG_PRINT_LOW ALOGE
+#define DEBUG_PRINT_LOW ALOGV
#else
#define DEBUG_PRINT_LOW
#endif
#ifdef ENABLE_DEBUG_HIGH
-#define DEBUG_PRINT_HIGH ALOGE
+#define DEBUG_PRINT_HIGH ALOGV
#else
#define DEBUG_PRINT_HIGH
#endif
@@ -82,7 +87,26 @@ public:
#else
#define DEBUG_PRINT_ERROR
#endif
+
+#else //_ANDROID_
+#define DEBUG_PRINT_LOW
+#define DEBUG_PRINT_HIGH
+#define DEBUG_PRINT_ERROR
#endif // _ANDROID_
+
+#ifdef USE_ION
+ static const char* MEM_DEVICE = "/dev/ion";
+ #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
+#elif MAX_RES_720P
+static const char* MEM_DEVICE = "/dev/pmem_adsp";
+#elif MAX_RES_1080P_EBI
+static const char* MEM_DEVICE = "/dev/pmem_adsp";
+#elif MAX_RES_1080P
+static const char* MEM_DEVICE = "/dev/pmem_smipool";
+#else
+#error MEM_DEVICE cannot be determined.
+#endif
+
//////////////////////////////////////////////////////////////////////////////
// Module specific globals
//////////////////////////////////////////////////////////////////////////////
@@ -116,12 +140,20 @@ public:
& BITMASK_FLAG(mIndex))
#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
& BITMASK_FLAG(mIndex)) == 0x0)
-
+#ifdef _ANDROID_ICS_
+#define MAX_NUM_INPUT_BUFFERS 32
+#endif
void* message_thread(void *);
// OMX video class
class omx_video: public qc_omx_component
{
-
+protected:
+#ifdef _ANDROID_ICS_
+ bool meta_mode_enable;
+ encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
+ OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
+ bool mUseProxyColorFormat;
+#endif
public:
omx_video(); // constructor
virtual ~omx_video(); // destructor
@@ -147,13 +179,21 @@ public:
virtual OMX_U32 dev_start(void) = 0;
virtual OMX_U32 dev_flush(unsigned) = 0;
virtual OMX_U32 dev_resume(void) = 0;
- virtual bool dev_use_buf(void *,unsigned) = 0;
+ virtual OMX_U32 dev_start_done(void) = 0;
+ virtual OMX_U32 dev_stop_done(void) = 0;
+ virtual bool dev_use_buf(void *,unsigned,unsigned) = 0;
virtual bool dev_free_buf(void *,unsigned) = 0;
- virtual bool dev_empty_buf(void *, void *) = 0;
- virtual bool dev_fill_buf(void *buffer, void *) = 0;
+ virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
+ virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
-
-
+ virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0;
+ virtual bool dev_loaded_start(void) = 0;
+ virtual bool dev_loaded_stop(void) = 0;
+ virtual bool dev_loaded_start_done(void) = 0;
+ virtual bool dev_loaded_stop_done(void) = 0;
+#ifdef _ANDROID_ICS_
+ void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
+#endif
OMX_ERRORTYPE component_role_enum(
OMX_HANDLETYPE hComp,
OMX_U8 *role,
@@ -263,6 +303,11 @@ public:
//int *output_pmem_fd;
struct pmem *m_pInput_pmem;
struct pmem *m_pOutput_pmem;
+#ifdef USE_ION
+ struct venc_ion *m_pInput_ion;
+ struct venc_ion *m_pOutput_ion;
+#endif
+
public:
@@ -289,7 +334,9 @@ public:
OMX_COMPONENT_OUTPUT_FLUSH_PENDING =0x9,
OMX_COMPONENT_INPUT_FLUSH_PENDING =0xA,
OMX_COMPONENT_PAUSE_PENDING =0xB,
- OMX_COMPONENT_EXECUTE_PENDING =0xC
+ OMX_COMPONENT_EXECUTE_PENDING =0xC,
+ OMX_COMPONENT_LOADED_START_PENDING = 0xD,
+ OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
};
@@ -359,7 +406,11 @@ public:
OMX_U32 port,
OMX_PTR appData,
OMX_U32 bytes);
-
+#ifdef _ANDROID_ICS_
+ OMX_ERRORTYPE allocate_input_meta_buffer(OMX_BUFFERHEADERTYPE **bufferHdr,
+ OMX_PTR appData,
+ OMX_U32 bytes);
+#endif
OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE hComp,
OMX_BUFFERHEADERTYPE **bufferHdr,
OMX_U32 port,OMX_PTR appData,
@@ -405,19 +456,18 @@ public:
unsigned int p2,
unsigned int id
);
-
+ OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
inline void omx_report_error ()
{
- m_state = OMX_StateInvalid;
- if(m_pCallbacks.EventHandler)
+ if(m_pCallbacks.EventHandler && !m_error_propogated)
{
+ m_error_propogated = true;
m_pCallbacks.EventHandler(&m_cmp,m_app_data,
OMX_EventError,OMX_ErrorHardware,0,NULL);
- m_pCallbacks.EventHandler(&m_cmp,m_app_data,
- OMX_EventError, OMX_ErrorInvalidState,0, NULL);
}
}
+ void complete_pending_buffer_done_cbs();
//*************************************************************
//*******************MEMBER VARIABLES *************************
@@ -425,7 +475,7 @@ public:
pthread_mutex_t m_lock;
sem_t m_cmd_lock;
-
+ bool m_error_propogated;
//sem to handle the minimum procesing of commands
@@ -461,6 +511,11 @@ public:
OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
+ QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
+ OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
+ OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
+ OMX_U32 m_sExtraData;
+ OMX_U32 m_sDebugSliceinfo;
// fill this buffer queue
omx_cmd_queue m_ftb_q;
@@ -491,6 +546,14 @@ public:
// to know whether Event Port Settings change has been triggered or not.
bool m_event_port_settings_sent;
OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE];
+ extra_data_handler extra_data_handle;
+
+private:
+#ifdef USE_ION
+ int alloc_map_ion_memory(int size,struct ion_allocation_data *alloc_data,
+ struct ion_fd_data *fd_data,int flag);
+ void free_ion_memory(struct venc_ion *buf_ion_info);
+#endif
};
#endif // __OMX_VIDEO_BASE_H__
diff --git a/mm-video/vidc/venc/inc/omx_video_common.h b/mm-video/vidc/venc/inc/omx_video_common.h
index 74803ab8..b57a9fac 100644..100755
--- a/mm-video/vidc/venc/inc/omx_video_common.h
+++ b/mm-video/vidc/venc/inc/omx_video_common.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -34,6 +34,9 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include<stdlib.h>
#include <stdio.h>
+#ifdef USE_ION
+#include <ion_msm.h>
+#endif
#define OMX_VIDEO_DEC_NUM_INPUT_BUFFERS 2
#define OMX_VIDEO_DEC_NUM_OUTPUT_BUFFERS 2
@@ -67,7 +70,14 @@ struct pmem
unsigned offset;
unsigned size;
};
-
+#ifdef USE_ION
+struct venc_ion
+{
+ int ion_device_fd;
+ struct ion_fd_data fd_ion_data;
+ struct ion_allocation_data ion_alloc_data;
+};
+#endif
#endif // __OMX_VIDEO_COMMON_H__
diff --git a/mm-video/vidc/venc/inc/omx_video_encoder.h b/mm-video/vidc/venc/inc/omx_video_encoder.h
index df3e1fa3..44045530 100644..100755
--- a/mm-video/vidc/venc/inc/omx_video_encoder.h
+++ b/mm-video/vidc/venc/inc/omx_video_encoder.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -28,8 +28,13 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef __OMX_VENC__H
#define __OMX_VENC__H
+#include <unistd.h>
#include "omx_video_base.h"
+#ifdef _COPPER_
+#include "video_encoder_device_copper.h"
+#else
#include "video_encoder_device.h"
+#endif
extern "C" {
OMX_API void * get_omx_component_factory_fn(void);
@@ -59,12 +64,20 @@ private:
OMX_U32 dev_start(void);
OMX_U32 dev_flush(unsigned);
OMX_U32 dev_resume(void);
- bool dev_use_buf( void *,unsigned);
+ OMX_U32 dev_start_done(void);
+ OMX_U32 dev_stop_done(void);
+ bool dev_use_buf( void *,unsigned,unsigned);
bool dev_free_buf( void *,unsigned);
- bool dev_empty_buf(void *, void *);
- bool dev_fill_buf(void *, void *);
+ bool dev_empty_buf(void *, void *,unsigned,unsigned);
+ bool dev_fill_buf(void *, void *,unsigned,unsigned);
bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32);
bool dev_set_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32);
+ bool update_profile_level();
+ bool dev_get_seq_hdr(void *, unsigned, unsigned *);
+ bool dev_loaded_start(void);
+ bool dev_loaded_stop(void);
+ bool dev_loaded_start_done(void);
+ bool dev_loaded_stop_done(void);
};
#endif //__OMX_VENC__H
diff --git a/mm-video/vidc/venc/inc/queue.h b/mm-video/vidc/venc/inc/queue.h
index 35200e00..991b7cc2 100644..100755
--- a/mm-video/vidc/venc/inc/queue.h
+++ b/mm-video/vidc/venc/inc/queue.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/venc/inc/venc_util.h b/mm-video/vidc/venc/inc/venc_util.h
index b315e4c6..b256496b 100644..100755
--- a/mm-video/vidc/venc/inc/venc_util.h
+++ b/mm-video/vidc/venc/inc/venc_util.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/venc/inc/video_encoder_device.h b/mm-video/vidc/venc/inc/video_encoder_device.h
index 56870187..6cd8e977 100644..100755
--- a/mm-video/vidc/venc/inc/video_encoder_device.h
+++ b/mm-video/vidc/venc/inc/video_encoder_device.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -34,14 +34,18 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "qc_omx_component.h"
#include "omx_video_common.h"
#include <linux/msm_vidc_enc.h>
-
+#include <pthread.h>
+#include <linux/videodev2.h>
+#include <poll.h>
+#define TIMEOUT 5000
+#define MAX_RECON_BUFFERS 4
void* async_venc_message_thread (void *);
class venc_dev
{
public:
- venc_dev(); //constructor
+ venc_dev(class omx_venc *venc_class); //constructor
~venc_dev(); //des
bool venc_open(OMX_U32);
@@ -50,12 +54,16 @@ public:
unsigned venc_pause(void);
unsigned venc_start(void);
unsigned venc_flush(unsigned);
-
+#ifdef _ANDROID_ICS_
+ bool venc_set_meta_mode(bool);
+#endif
unsigned venc_resume(void);
- bool venc_use_buf(void*, unsigned);
+ unsigned venc_start_done(void);
+ unsigned venc_stop_done(void);
+ bool venc_use_buf(void*, unsigned,unsigned);
bool venc_free_buf(void*, unsigned);
- bool venc_empty_buf(void *, void *);
- bool venc_fill_buf(void *, void *);
+ bool venc_empty_buf(void *, void *,unsigned,unsigned);
+ bool venc_fill_buf(void *, void *,unsigned,unsigned);
bool venc_get_buf_req(unsigned long *,unsigned long *,
unsigned long *,unsigned long);
@@ -64,14 +72,41 @@ public:
bool venc_set_param(void *,OMX_INDEXTYPE);
bool venc_set_config(void *configData, OMX_INDEXTYPE index);
bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
+ bool venc_max_allowed_bitrate_check(OMX_U32 nTargetBitrate);
+ bool venc_get_seq_hdr(void *, unsigned, unsigned *);
+ bool venc_loaded_start(void);
+ bool venc_loaded_stop(void);
+ bool venc_loaded_start_done(void);
+ bool venc_loaded_stop_done(void);
OMX_U32 m_nDriver_fd;
bool m_profile_set;
bool m_level_set;
+ pthread_mutex_t loaded_start_stop_mlock;
+ pthread_cond_t loaded_start_stop_cond;
+ struct recon_buffer {
+ unsigned char* virtual_address;
+ int pmem_fd;
+ int size;
+ int alignment;
+ int offset;
+#ifdef USE_ION
+ int ion_device_fd;
+ struct ion_allocation_data alloc_data;
+ struct ion_fd_data ion_alloc_fd;
+#endif
+ };
+
+ recon_buffer recon_buff[MAX_RECON_BUFFERS];
+ int recon_buffers_count;
+ bool m_max_allowed_bitrate_check;
+ int m_eProfile;
+ int m_eLevel;
+ int etb_count;
private:
struct venc_basecfg m_sVenc_cfg;
struct venc_ratectrlcfg rate_ctrl;
- struct venc_targetbitrate bit_rate;
+ struct venc_targetbitrate bitrate;
struct venc_intraperiod intra_period;
struct venc_profile codec_profile;
struct ven_profilelevel profile_level;
@@ -80,18 +115,47 @@ private:
struct venc_allocatorproperty m_sInput_buff_property;
struct venc_allocatorproperty m_sOutput_buff_property;
struct venc_sessionqp session_qp;
- struct venc_multiclicecfg multislice_cfg;
+ struct venc_multiclicecfg multislice;
+ struct venc_entropycfg entropy;
+ struct venc_dbcfg dbkfilter;
+ struct venc_intrarefresh intra_refresh;
+ struct venc_headerextension hec;
+ struct venc_voptimingcfg voptimecfg;
+ struct venc_seqheader seqhdr;
bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel);
- bool venc_set_intra_period(OMX_U32 nPFrames);
- bool venc_set_target_bitrate(OMX_U32 nTargetBitrate);
+ bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames);
+ bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config);
bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate);
bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp);
- bool venc_set_encode_framerate(OMX_U32 encode_framerate);
+ bool venc_set_extradata(OMX_U32 extra_data);
+ bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config);
bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
- bool venc_set_multislice_cfg(OMX_VIDEO_AVCSLICEMODETYPE eSliceMode);
+ bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
+ bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
+ bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
+ bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs);
+ bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience);
+ bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
+ void venc_config_print();
+ bool venc_set_slice_delivery_mode(OMX_BOOL enable);
+#ifdef MAX_RES_1080P
+ OMX_U32 pmem_free();
+ OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
+ OMX_U32 venc_allocate_recon_buffers();
+ inline int clip2(int x)
+ {
+ x = x -1;
+ x = x | x >> 1;
+ x = x | x >> 2;
+ x = x | x >> 4;
+ x = x | x >> 16;
+ x = x + 1;
+ return x;
+ }
+#endif
};
#endif
diff --git a/mm-video/vidc/venc/inc/video_encoder_device_copper.h b/mm-video/vidc/venc/inc/video_encoder_device_copper.h
new file mode 100755
index 00000000..95f0a1bb
--- /dev/null
+++ b/mm-video/vidc/venc/inc/video_encoder_device_copper.h
@@ -0,0 +1,288 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#ifndef __OMX_VENC_DEV__
+#define __OMX_VENC_DEV__
+
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+#include "OMX_QCOMExtns.h"
+#include "qc_omx_component.h"
+#include "omx_video_common.h"
+#include "omx_video_base.h"
+#include "omx_video_encoder.h"
+#include <linux/videodev2.h>
+#include <poll.h>
+#define TIMEOUT 5000
+#define MAX_RECON_BUFFERS 4
+
+void* async_venc_message_thread (void *);
+
+struct msm_venc_switch{
+ unsigned char status;
+};
+
+struct msm_venc_allocatorproperty{
+ unsigned long mincount;
+ unsigned long maxcount;
+ unsigned long actualcount;
+ unsigned long datasize;
+ unsigned long suffixsize;
+ unsigned long alignment;
+ unsigned long bufpoolid;
+};
+
+struct msm_venc_basecfg{
+ unsigned long input_width;
+ unsigned long input_height;
+ unsigned long dvs_width;
+ unsigned long dvs_height;
+ unsigned long codectype;
+ unsigned long fps_num;
+ unsigned long fps_den;
+ unsigned long targetbitrate;
+ unsigned long inputformat;
+};
+
+struct msm_venc_profile{
+ unsigned long profile;
+};
+struct msm_venc_profilelevel{
+ unsigned long level;
+};
+
+struct msm_venc_sessionqp{
+ unsigned long iframeqp;
+ unsigned long pframqp;
+ unsigned long bframqp;
+};
+
+struct msm_venc_qprange{
+ unsigned long maxqp;
+ unsigned long minqp;
+};
+struct msm_venc_intraperiod{
+ unsigned long num_pframes;
+ unsigned long num_bframes;
+};
+struct msm_venc_seqheader{
+ unsigned char *hdrbufptr;
+ unsigned long bufsize;
+ unsigned long hdrlen;
+};
+
+struct msm_venc_capability{
+ unsigned long codec_types;
+ unsigned long maxframe_width;
+ unsigned long maxframe_height;
+ unsigned long maxtarget_bitrate;
+ unsigned long maxframe_rate;
+ unsigned long input_formats;
+ unsigned char dvs;
+};
+
+struct msm_venc_entropycfg{
+ unsigned longentropysel;
+ unsigned long cabacmodel;
+};
+
+struct msm_venc_dbcfg{
+ unsigned long db_mode;
+ unsigned long slicealpha_offset;
+ unsigned long slicebeta_offset;
+};
+
+struct msm_venc_intrarefresh{
+ unsigned long irmode;
+ unsigned long mbcount;
+};
+
+struct msm_venc_multiclicecfg{
+ unsigned long mslice_mode;
+ unsigned long mslice_size;
+};
+
+struct msm_venc_bufferflush{
+ unsigned long flush_mode;
+};
+
+struct msm_venc_ratectrlcfg{
+ unsigned long rcmode;
+};
+
+struct msm_venc_voptimingcfg{
+ unsigned long voptime_resolution;
+};
+struct msm_venc_framerate{
+ unsigned long fps_denominator;
+ unsigned long fps_numerator;
+};
+
+struct msm_venc_targetbitrate{
+ unsigned long target_bitrate;
+};
+
+
+struct msm_venc_rotation{
+ unsigned long rotation;
+};
+
+struct msm_venc_timeout{
+ unsigned long millisec;
+};
+
+struct msm_venc_headerextension{
+ unsigned long header_extension;
+};
+
+class venc_dev
+{
+public:
+ venc_dev(class omx_venc *venc_class); //constructor
+ ~venc_dev(); //des
+
+ bool venc_open(OMX_U32);
+ void venc_close();
+ unsigned venc_stop(void);
+ unsigned venc_pause(void);
+ unsigned venc_start(void);
+ unsigned venc_flush(unsigned);
+#ifdef _ANDROID_ICS_
+ bool venc_set_meta_mode(bool);
+#endif
+ unsigned venc_resume(void);
+ unsigned venc_start_done(void);
+ unsigned venc_stop_done(void);
+ bool venc_use_buf(void*, unsigned,unsigned);
+ bool venc_free_buf(void*, unsigned);
+ bool venc_empty_buf(void *, void *,unsigned,unsigned);
+ bool venc_fill_buf(void *, void *,unsigned,unsigned);
+
+ bool venc_get_buf_req(unsigned long *,unsigned long *,
+ unsigned long *,unsigned long);
+ bool venc_set_buf_req(unsigned long *,unsigned long *,
+ unsigned long *,unsigned long);
+ bool venc_set_param(void *,OMX_INDEXTYPE);
+ bool venc_set_config(void *configData, OMX_INDEXTYPE index);
+ bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
+ bool venc_get_seq_hdr(void *, unsigned, unsigned *);
+ bool venc_loaded_start(void);
+ bool venc_loaded_stop(void);
+ bool venc_loaded_start_done(void);
+ bool venc_loaded_stop_done(void);
+ OMX_U32 m_nDriver_fd;
+ bool m_profile_set;
+ bool m_level_set;
+ struct recon_buffer {
+ unsigned char* virtual_address;
+ int pmem_fd;
+ int size;
+ int alignment;
+ int offset;
+#ifdef USE_ION
+ int ion_device_fd;
+ struct ion_allocation_data alloc_data;
+ struct ion_fd_data ion_alloc_fd;
+#endif
+ };
+
+ recon_buffer recon_buff[MAX_RECON_BUFFERS];
+ int recon_buffers_count;
+ bool m_max_allowed_bitrate_check;
+ int etb_count;
+ class omx_venc *venc_handle;
+private:
+ struct msm_venc_basecfg m_sVenc_cfg;
+ struct msm_venc_ratectrlcfg rate_ctrl;
+ struct msm_venc_targetbitrate bitrate;
+ struct msm_venc_intraperiod intra_period;
+ struct msm_venc_profile codec_profile;
+ struct msm_venc_profilelevel profile_level;
+ struct msm_venc_switch set_param;
+ struct msm_venc_voptimingcfg time_inc;
+ struct msm_venc_allocatorproperty m_sInput_buff_property;
+ struct msm_venc_allocatorproperty m_sOutput_buff_property;
+ struct msm_venc_sessionqp session_qp;
+ struct msm_venc_multiclicecfg multislice;
+ struct msm_venc_entropycfg entropy;
+ struct msm_venc_dbcfg dbkfilter;
+ struct msm_venc_intrarefresh intra_refresh;
+ struct msm_venc_headerextension hec;
+ struct msm_venc_voptimingcfg voptimecfg;
+
+ bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel);
+ bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames);
+ bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config);
+ bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate);
+ bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp);
+ bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config);
+ bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
+ bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
+ bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
+ bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
+ bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
+ bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
+ bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs);
+ bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience);
+ bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
+ void venc_config_print();
+#ifdef MAX_RES_1080P
+ OMX_U32 pmem_free();
+ OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
+ OMX_U32 venc_allocate_recon_buffers();
+ inline int clip2(int x)
+ {
+ x = x -1;
+ x = x | x >> 1;
+ x = x | x >> 2;
+ x = x | x >> 4;
+ x = x | x >> 16;
+ x = x + 1;
+ return x;
+ }
+#endif
+};
+
+enum instance_state {
+ MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
+ MSM_VIDC_CORE_INIT,
+ MSM_VIDC_CORE_INIT_DONE,
+ MSM_VIDC_OPEN,
+ MSM_VIDC_OPEN_DONE,
+ MSM_VIDC_LOAD_RESOURCES,
+ MSM_VIDC_LOAD_RESOURCES_DONE,
+ MSM_VIDC_START,
+ MSM_VIDC_START_DONE,
+ MSM_VIDC_STOP,
+ MSM_VIDC_STOP_DONE,
+ MSM_VIDC_RELEASE_RESOURCES,
+ MSM_VIDC_RELEASE_RESOURCES_DONE,
+ MSM_VIDC_CLOSE,
+ MSM_VIDC_CLOSE_DONE,
+ MSM_VIDC_CORE_UNINIT,
+};
+#endif
diff --git a/mm-video/vidc/venc/inc/video_encoder_test.h b/mm-video/vidc/venc/inc/video_encoder_test.h
index d67ffeff..b48e76ed 100644..100755
--- a/mm-video/vidc/venc/inc/video_encoder_test.h
+++ b/mm-video/vidc/venc/inc/video_encoder_test.h
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/venc/src/omx_video_base.cpp b/mm-video/vidc/venc/src/omx_video_base.cpp
index 2255b552..1d486d31 100644..100755
--- a/mm-video/vidc/venc/src/omx_video_base.cpp
+++ b/mm-video/vidc/venc/src/omx_video_base.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -44,7 +44,15 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
-
+#include <sys/prctl.h>
+#ifdef _ANDROID_ICS_
+#include <media/hardware/HardwareAPI.h>
+#include <gralloc_priv.h>
+#endif
+#ifndef _ANDROID_
+#include <glib.h>
+#define strlcpy g_strlcpy
+#endif
#define H264_SUPPORTED_WIDTH (480)
#define H264_SUPPORTED_HEIGHT (368)
@@ -83,6 +91,10 @@ typedef struct OMXComponentCapabilityFlagsType
} OMXComponentCapabilityFlagsType;
#define OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347
+#ifdef OUTPUT_BUFFER_LOG
+extern FILE *outputBufferFile1;
+#endif
+
void* message_thread(void *input)
{
omx_video* omx = reinterpret_cast<omx_video*>(input);
@@ -90,6 +102,7 @@ void* message_thread(void *input)
int n;
DEBUG_PRINT_LOW("omx_venc: message thread start\n");
+ prctl(PR_SET_NAME, (unsigned long)"VideoEncMsgThread", 0, 0, 0);
while(1)
{
n = read(omx->m_pipe_in, &id, 1);
@@ -190,7 +203,7 @@ unsigned omx_video::omx_cmd_queue::get_q_msg_type()
VideoHeap::VideoHeap(int fd, size_t size, void* base)
{
// dup file descriptor, map once, use pmem
- init(dup(fd), base, size, 0 , "/dev/pmem_adsp");
+ init(dup(fd), base, size, 0 , MEM_DEVICE);
}
#endif // _ANDROID_
@@ -211,6 +224,12 @@ omx_video::omx_video(): m_state(OMX_StateInvalid),
m_app_data(NULL),
m_inp_mem_ptr(NULL),
m_out_mem_ptr(NULL),
+ m_pInput_pmem(NULL),
+ m_pOutput_pmem(NULL),
+#ifdef USE_ION
+ m_pInput_ion(NULL),
+ m_pOutput_ion(NULL),
+#endif
pending_input_buffers(0),
pending_output_buffers(0),
m_out_bm_count(0),
@@ -224,7 +243,8 @@ omx_video::omx_video(): m_state(OMX_StateInvalid),
m_use_input_pmem(OMX_FALSE),
m_use_output_pmem(OMX_FALSE),
m_etb_count(0),
- m_fbd_count(0)
+ m_fbd_count(0),
+ m_error_propogated(false)
{
DEBUG_PRINT_HIGH("\n omx_video(): Inside Constructor()");
memset(&m_cmp,0,sizeof(m_cmp));
@@ -350,20 +370,10 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
case OMX_EventError:
DEBUG_PRINT_ERROR("\nERROR: OMX_EventError: p2 = %d\n", p2);
- if(p2 == OMX_StateInvalid)
+ if(p2 == OMX_ErrorHardware)
{
- pThis->m_state = (OMX_STATETYPE) p2;
- pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
- }
- else if(p2 == OMX_ErrorHardware)
- {
- pThis->m_state = OMX_StateInvalid;
pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
OMX_EventError,OMX_ErrorHardware,0,NULL);
- pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
- OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
-
}
else
{
@@ -387,6 +397,7 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
break;
default:
+ DEBUG_PRINT_LOW("\n process_event_cb forwarding EventCmdComplete %d \n", p1);
pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
OMX_EventCmdComplete, p1, p2, NULL );
break;
@@ -461,7 +472,7 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
{
if(!pThis->output_flush_progress)
{
- printf("\n dev_stop called after input flush complete\n");
+ DEBUG_PRINT_LOW("\n dev_stop called after input flush complete\n");
if(dev_stop() != 0)
{
DEBUG_PRINT_ERROR("\nERROR: dev_stop() failed in i/p flush!\n");
@@ -492,7 +503,7 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
}
else if(BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
{
- printf("\n dev_stop called after Output flush complete\n");
+ DEBUG_PRINT_LOW("\n dev_stop called after Output flush complete\n");
if(!pThis->input_flush_progress)
{
if(dev_stop() != 0)
@@ -531,6 +542,24 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
pThis->omx_report_error ();
}
}
+ else if (BITMASK_PRESENT(&pThis->m_flags,
+ OMX_COMPONENT_LOADED_START_PENDING))
+ {
+ if(dev_loaded_start_done())
+ {
+ DEBUG_PRINT_LOW("successful loaded Start Done!");
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: failed in loaded Start Done!");
+ pThis->omx_report_error ();
+ }
+ BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_LOADED_START_PENDING);
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: unknown flags=%x\n",pThis->m_flags);
+ }
}
else
{
@@ -545,6 +574,8 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
{
//Send the callback now
+ pThis->complete_pending_buffer_done_cbs();
+ DEBUG_PRINT_LOW("omx_video::process_event_cb() Sending PAUSE complete after all pending EBD/FBD\n");
BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
pThis->m_state = OMX_StatePause;
pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,
@@ -576,6 +607,7 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE msg");
if(pThis->m_pCallbacks.EventHandler)
{
+ pThis->complete_pending_buffer_done_cbs();
if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
{
// Send the callback now
@@ -585,6 +617,24 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
OMX_EventCmdComplete,OMX_CommandStateSet,
OMX_StateIdle,NULL);
}
+ else if (BITMASK_PRESENT(&pThis->m_flags,
+ OMX_COMPONENT_LOADED_STOP_PENDING))
+ {
+ if(dev_loaded_stop_done())
+ {
+ DEBUG_PRINT_LOW("successful loaded Stop Done!");
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: failed in loaded Stop Done!");
+ pThis->omx_report_error ();
+ }
+ BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_LOADED_STOP_PENDING);
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: unknown flags=%x\n",pThis->m_flags);
+ }
}
break;
@@ -595,6 +645,7 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
break;
default:
+ DEBUG_PRINT_LOW("\n process_event_cb unknown msg id 0x%02x", id);
break;
}
}
@@ -607,7 +658,7 @@ void omx_video::process_event_cb(void *ctxt, unsigned char id)
}
while(qsize>0);
- printf("\n exited the while loop\n");
+ DEBUG_PRINT_LOW("\n exited the while loop\n");
}
@@ -643,6 +694,10 @@ OMX_OUT OMX_UUIDTYPE* componentUUID
return OMX_ErrorInvalidState;
}
/* TBD -- Return the proper version */
+ if (specVersion)
+ {
+ specVersion->nVersion = OMX_SPEC_VERSION;
+ }
return OMX_ErrorNone;
}
/* ======================================================================
@@ -785,7 +840,7 @@ OMX_ERRORTYPE omx_video::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
}
else
{
- DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Invalid(%d Not Handled)\n",\
+ DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->%d Not Handled\n",\
eState);
eRet = OMX_ErrorBadParameter;
}
@@ -835,6 +890,7 @@ OMX_ERRORTYPE omx_video::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
bFlag = 0;
}
+ dev_start_done();
}
/* Requesting transition from Idle to Idle */
else if(eState == OMX_StateIdle)
@@ -865,7 +921,7 @@ OMX_ERRORTYPE omx_video::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
else
{
BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
- DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Executing\n");
+ DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Pause\n");
bFlag = 0;
}
}
@@ -899,6 +955,7 @@ OMX_ERRORTYPE omx_video::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
execute_omx_flush(OMX_ALL);
bFlag = 0;
+ dev_stop_done();
}
/* Requesting transition from Executing to Paused */
else if(eState == OMX_StatePause)
@@ -914,7 +971,7 @@ OMX_ERRORTYPE omx_video::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
else
{
BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
- DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Executing\n");
+ DEBUG_PRINT_LOW("OMXCORE-SM: Executing-->Pause\n");
bFlag = 0;
}
}
@@ -973,7 +1030,8 @@ OMX_ERRORTYPE omx_video::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
else
{
BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING);
- DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Executing\n");
+ DEBUG_PRINT_LOW("OMXCORE-SM: Pause-->Executing\n");
+ post_event (NULL, NULL, OMX_COMPONENT_GENERATE_RESUME_DONE);
bFlag = 0;
}
}
@@ -1426,14 +1484,30 @@ OMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
if(portDefn->nPortIndex == (OMX_U32) PORT_INDEX_IN)
{
- DEBUG_PRINT_LOW("\n i/p actual cnt = %d\n", m_sInPortDef.nBufferCountActual);
- DEBUG_PRINT_LOW("\n i/p min cnt = %d\n", m_sInPortDef.nBufferCountMin);
+ DEBUG_PRINT_LOW("m_sInPortDef: size = %d, min cnt = %d, actual cnt = %d",
+ m_sInPortDef.nBufferSize, m_sInPortDef.nBufferCountMin,
+ m_sInPortDef.nBufferCountActual);
memcpy(portDefn, &m_sInPortDef, sizeof(m_sInPortDef));
+#ifdef _ANDROID_ICS_
+ if(meta_mode_enable)
+ {
+ portDefn->nBufferSize = sizeof(encoder_media_buffer_type);
+ }
+
+ if (mUseProxyColorFormat) {
+ portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque;
+ }
+#endif
}
else if(portDefn->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
{
- DEBUG_PRINT_LOW("\n o/p actual cnt = %d\n", m_sOutPortDef.nBufferCountActual);
- DEBUG_PRINT_LOW("\n o/p min cnt = %d\n", m_sOutPortDef.nBufferCountMin);
+ dev_get_buf_req (&m_sOutPortDef.nBufferCountMin,
+ &m_sOutPortDef.nBufferCountActual,
+ &m_sOutPortDef.nBufferSize,
+ m_sOutPortDef.nPortIndex);
+ DEBUG_PRINT_LOW("m_sOutPortDef: size = %d, min cnt = %d, actual cnt = %d",
+ m_sOutPortDef.nBufferSize, m_sOutPortDef.nBufferCountMin,
+ m_sOutPortDef.nBufferCountActual);
memcpy(portDefn, &m_sOutPortDef, sizeof(m_sOutPortDef));
}
else
@@ -1460,7 +1534,19 @@ OMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN)
{
- memcpy(portFmt, &m_sInPortFormat, sizeof(m_sInPortFormat));
+ int index = portFmt->nIndex;
+ memcpy(portFmt, &m_sInPortFormat, sizeof(m_sInPortFormat));
+
+#ifdef _ANDROID_ICS_
+ if (index == 1) {
+ //we support two formats
+ //index 0 - YUV420SP
+ //index 1 - opaque which internally maps to YUV420SP.
+ //this can be extended in the future
+ portFmt->nIndex = index; //restore index set from client
+ portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque;
+ }
+#endif
}
else if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
{
@@ -1513,57 +1599,14 @@ OMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_IndexParamVideoProfileLevelQuerySupported:
{
-
OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported\n");
- //TODO include all the profiles and corresponding levels
- if(m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4)
- {
- static const OMX_U32 MPEG4Profile[][2] =
- { { (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple, (OMX_U32) OMX_VIDEO_MPEG4Level0},
- { (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple, (OMX_U32) OMX_VIDEO_MPEG4Level0b},
- { (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple, (OMX_U32) OMX_VIDEO_MPEG4Level1},
- { (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple, (OMX_U32) OMX_VIDEO_MPEG4Level2},
- { (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple, (OMX_U32) OMX_VIDEO_MPEG4Level3}};
-
- static const OMX_U32 nSupport = sizeof(MPEG4Profile) / (sizeof(OMX_U32) * 2);
- if(pParam->nProfileIndex >= 0 && pParam->nProfileIndex < nSupport)
- {
- pParam->eProfile = (OMX_VIDEO_MPEG4PROFILETYPE) MPEG4Profile[pParam->nProfileIndex][0];
- pParam->eLevel = (OMX_VIDEO_MPEG4LEVELTYPE) MPEG4Profile[pParam->nProfileIndex][1];
- }
- else
- {
- eRet = OMX_ErrorNoMore;
- }
- }
- else if(m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingH263)
- {
- static const OMX_U32 H263Profile[][2] =
- { { (OMX_U32) OMX_VIDEO_H263ProfileBaseline, (OMX_U32) OMX_VIDEO_H263Level10},
- { (OMX_U32) OMX_VIDEO_H263ProfileBaseline, (OMX_U32) OMX_VIDEO_H263Level20},
- { (OMX_U32) OMX_VIDEO_H263ProfileBaseline, (OMX_U32) OMX_VIDEO_H263Level30},
- { (OMX_U32) OMX_VIDEO_H263ProfileBaseline, (OMX_U32) OMX_VIDEO_H263Level45},
- { (OMX_U32) OMX_VIDEO_H263ProfileISWV2, (OMX_U32) OMX_VIDEO_H263Level10},
- { (OMX_U32) OMX_VIDEO_H263ProfileISWV2, (OMX_U32) OMX_VIDEO_H263Level45}};
-
- static const OMX_U32 nSupport = sizeof(H263Profile) / (sizeof(OMX_U32) * 2);
- if(pParam->nProfileIndex >= 0 && pParam->nProfileIndex < nSupport)
- {
- pParam->eProfile = (OMX_VIDEO_H263PROFILETYPE) H263Profile[pParam->nProfileIndex][0];
- pParam->eLevel = (OMX_VIDEO_H263LEVELTYPE) H263Profile[pParam->nProfileIndex][1];
- }
- else
- {
- eRet = OMX_ErrorNoMore;
- }
- }
- else if(m_sOutPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC)
- {
- //TODO
- }
+ eRet = get_supported_profile_level(pParam);
+ if(eRet)
+ DEBUG_PRINT_ERROR("Invalid entry returned from get_supported_profile_level %d, %d",
+ pParam->eProfile, pParam->eLevel);
break;
- }
+ }
case OMX_IndexParamVideoProfileLevelCurrent:
{
OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
@@ -1605,7 +1648,7 @@ OMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",paramIndex);
if(NULL != comp_role->cRole)
{
- strncpy((char*)comp_role->cRole,(const char*)m_cRole,OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char*)comp_role->cRole,(const char*)m_cRole,OMX_MAX_STRINGNAME_SIZE);
}
else
{
@@ -1652,6 +1695,24 @@ OMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
break;
}
+ case OMX_IndexParamVideoErrorCorrection:
+ {
+ OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* errorresilience = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
+ DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection\n");
+ errorresilience->bEnableHEC = m_sErrorCorrection.bEnableHEC;
+ errorresilience->bEnableResync = m_sErrorCorrection.bEnableResync;
+ errorresilience->nResynchMarkerSpacing = m_sErrorCorrection.nResynchMarkerSpacing;
+ break;
+ }
+ case OMX_IndexParamVideoIntraRefresh:
+ {
+ OMX_VIDEO_PARAM_INTRAREFRESHTYPE* intrarefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
+ DEBUG_PRINT_LOW("OMX_IndexParamVideoIntraRefresh\n");
+ DEBUG_PRINT_ERROR("OMX_IndexParamVideoIntraRefresh GET\n");
+ intrarefresh->eRefreshMode = m_sIntraRefresh.eRefreshMode;
+ intrarefresh->nCirMBs = m_sIntraRefresh.nCirMBs;
+ break;
+ }
case OMX_QcomIndexPortDefn:
//TODO
break;
@@ -1671,22 +1732,80 @@ OMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("Supporting capability index in encoder node");
break;
}
- case OMX_IndexParamVideoSliceFMO:
+#ifndef MAX_RES_720P
+ case OMX_QcomIndexParamIndexExtraDataType:
{
- OMX_VIDEO_PARAM_AVCSLICEFMO *avc_slice_fmo = (OMX_VIDEO_PARAM_AVCSLICEFMO*)paramData;
- DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoSliceFMO\n");
- if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
- OMX_MAX_STRINGNAME_SIZE))
+ DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamIndexExtraDataType");
+ QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
+ if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo)
+ {
+ if (pParam->nPortIndex == PORT_INDEX_OUT)
{
- memcpy(avc_slice_fmo, &m_sAVCSliceFMO, sizeof(m_sAVCSliceFMO));
+ pParam->bEnabled =
+ (OMX_BOOL)((m_sExtraData & VEN_EXTRADATA_SLICEINFO) ? 1 : 0);
+ DEBUG_PRINT_HIGH("Slice Info extradata %d", pParam->bEnabled);
}
else
{
- DEBUG_PRINT_ERROR("ERROR: get_parameter: AVCSliceFMO queried non-AVC codec\n");
- eRet = OMX_ErrorBadParameter;
+ DEBUG_PRINT_ERROR("get_parameter: slice information is "
+ "valid for output port only");
+ eRet =OMX_ErrorUnsupportedIndex;
}
- break;
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: unsupported index (%x), "
+ "only slice information extradata is supported", pParam->nIndex);
+ eRet =OMX_ErrorUnsupportedIndex;
+ }
+ break;
+ }
+#endif
+ case QOMX_IndexParamVideoSyntaxHdr:
+ {
+ DEBUG_PRINT_HIGH("QOMX_IndexParamVideoSyntaxHdr");
+ QOMX_EXTNINDEX_PARAMTYPE* pParam =
+ reinterpret_cast<QOMX_EXTNINDEX_PARAMTYPE*>(paramData);
+ BITMASK_SET(&m_flags, OMX_COMPONENT_LOADED_START_PENDING);
+ if(dev_loaded_start())
+ {
+ DEBUG_PRINT_LOW("device start successful");
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("device start failed");
+ BITMASK_CLEAR(&m_flags, OMX_COMPONENT_LOADED_START_PENDING);
+ return OMX_ErrorHardware;
+ }
+ if(dev_get_seq_hdr(pParam->pData,
+ (unsigned)(pParam->nSize - sizeof(QOMX_EXTNINDEX_PARAMTYPE)),
+ (unsigned *)&pParam->nDataSize))
+ {
+ DEBUG_PRINT_HIGH("get syntax header successful (hdrlen = %d)",
+ pParam->nDataSize);
+ for (unsigned i = 0; i < pParam->nDataSize; i++) {
+ DEBUG_PRINT_LOW("Header[%d] = %x", i, *((char *)pParam->pData + i));
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("Error returned from GetSyntaxHeader()");
+ eRet = OMX_ErrorHardware;
+ }
+ BITMASK_SET(&m_flags, OMX_COMPONENT_LOADED_STOP_PENDING);
+ if(dev_loaded_stop())
+ {
+ DEBUG_PRINT_LOW("device stop successful");
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("device stop failed");
+ BITMASK_CLEAR(&m_flags, OMX_COMPONENT_LOADED_STOP_PENDING);
+ eRet = OMX_ErrorHardware;
+ }
+ break;
}
+ case OMX_IndexParamVideoSliceFMO:
default:
{
DEBUG_PRINT_ERROR("ERROR: get_parameter: unknown param %08x\n", paramIndex);
@@ -1749,27 +1868,22 @@ OMX_ERRORTYPE omx_video::get_config(OMX_IN OMX_HANDLETYPE hComp,
case OMX_IndexConfigVideoFramerate:
{
OMX_CONFIG_FRAMERATETYPE* pParam = reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);
- if(m_state != OMX_StateLoaded)
- {
- // we only allow this at init time!
- DEBUG_PRINT_ERROR("ERROR: frame rate can only be configured in loaded state");
- return OMX_ErrorIncorrectStateOperation;
- }
memcpy(pParam, &m_sConfigFramerate, sizeof(m_sConfigFramerate));
break;
}
case OMX_IndexConfigCommonRotate:
{
OMX_CONFIG_ROTATIONTYPE* pParam = reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
- if(m_state != OMX_StateLoaded)
- {
- // we only allow this at init time!
- DEBUG_PRINT_ERROR("ERROR: frame rate can only be configured in loaded state",0,0,0);
- return OMX_ErrorIncorrectStateOperation;
- }
memcpy(pParam, &m_sConfigFrameRotation, sizeof(m_sConfigFrameRotation));
break;
}
+ case QOMX_IndexConfigVideoIntraperiod:
+ {
+ DEBUG_PRINT_LOW("get_config:QOMX_IndexConfigVideoIntraperiod\n");
+ QOMX_VIDEO_INTRAPERIODTYPE* pParam = reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
+ memcpy(pParam, &m_sIntraperiod, sizeof(m_sIntraperiod));
+ break;
+ }
default:
DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
return OMX_ErrorUnsupportedIndex;
@@ -1796,12 +1910,24 @@ OMX_ERRORTYPE omx_video::get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
OMX_IN OMX_STRING paramName,
OMX_OUT OMX_INDEXTYPE* indexType)
{
- DEBUG_PRINT_ERROR("ERROR: get_extension_index: Error, Not implemented\n");
if(m_state == OMX_StateInvalid)
{
DEBUG_PRINT_ERROR("ERROR: Get Extension Index in Invalid State\n");
return OMX_ErrorInvalidState;
}
+#ifdef MAX_RES_1080P
+ if (!strncmp(paramName, "OMX.QCOM.index.param.SliceDeliveryMode",
+ sizeof("OMX.QCOM.index.param.SliceDeliveryMode") - 1)) {
+ *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode;
+ return OMX_ErrorNone;
+ }
+#endif
+#ifdef _ANDROID_ICS_
+ if (!strncmp(paramName, "OMX.google.android.index.storeMetaDataInBuffers",sizeof("OMX.google.android.index.storeMetaDataInBuffers") - 1)) {
+ *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoEncodeMetaBufferMode;
+ return OMX_ErrorNone;
+ }
+#endif
return OMX_ErrorNotImplemented;
}
@@ -1896,15 +2022,30 @@ OMX_ERRORTYPE omx_video::use_input_buffer(
return OMX_ErrorInsufficientResources;
}
+
m_pInput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sInPortDef.nBufferCountActual);
if(m_pInput_pmem == NULL)
{
DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_pmem");
return OMX_ErrorInsufficientResources;
}
+#ifdef USE_ION
+ m_pInput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sInPortDef.nBufferCountActual);
+ if(m_pInput_ion == NULL)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_ion");
+ return OMX_ErrorInsufficientResources;
+ }
+#endif
+
for(i=0; i< m_sInPortDef.nBufferCountActual; i++)
{
m_pInput_pmem[i].fd = -1;
+#ifdef USE_ION
+ m_pInput_ion[i].ion_device_fd =-1;
+ m_pInput_ion[i].fd_ion_data.fd =-1;
+ m_pInput_ion[i].ion_alloc_data.handle=NULL;
+#endif
}
}
@@ -1932,10 +2073,20 @@ OMX_ERRORTYPE omx_video::use_input_buffer(
if(!m_use_input_pmem)
{
- m_pInput_pmem[i].fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+#ifdef USE_ION
+ m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
+ &m_pInput_ion[i].ion_alloc_data,
+ &m_pInput_ion[i].fd_ion_data,CACHED);
+ if(m_pInput_ion[i].ion_device_fd < 0) {
+ DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
+ return OMX_ErrorInsufficientResources;
+ }
+ m_pInput_pmem[i].fd = m_pInput_ion[i].fd_ion_data.fd;
+#else
+ m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
if(m_pInput_pmem[i].fd == 0)
{
- m_pInput_pmem[i].fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+ m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
}
if(m_pInput_pmem[i] .fd < 0)
@@ -1943,6 +2094,7 @@ OMX_ERRORTYPE omx_video::use_input_buffer(
DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() Failed");
return OMX_ErrorInsufficientResources;
}
+#endif
m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
m_pInput_pmem[i].offset = 0;
m_pInput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pInput_pmem[i].size,PROT_READ|PROT_WRITE,
@@ -1951,6 +2103,10 @@ OMX_ERRORTYPE omx_video::use_input_buffer(
if(m_pInput_pmem[i].buffer == MAP_FAILED)
{
DEBUG_PRINT_ERROR("\nERROR: mmap() Failed");
+ close(m_pInput_pmem[i].fd);
+#ifdef USE_ION
+ free_ion_memory(&m_pInput_ion[i]);
+#endif
return OMX_ErrorInsufficientResources;
}
}
@@ -1975,9 +2131,9 @@ OMX_ERRORTYPE omx_video::use_input_buffer(
}
}
- DEBUG_PRINT_LOW("\n use_inp:: bufhdr = %p, pBuffer = %p, m_pInput_pmem[i].buffer = %p",
+ DEBUG_PRINT_LOW("\nuse_inp:: bufhdr = %p, pBuffer = %p, m_pInput_pmem[i].buffer = %p",
(*bufferHdr), (*bufferHdr)->pBuffer, m_pInput_pmem[i].buffer);
- if( dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN) != true)
+ if( dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN,i) != true)
{
DEBUG_PRINT_ERROR("\nERROR: dev_use_buf() Failed for i/p buf");
return OMX_ErrorInsufficientResources;
@@ -2058,12 +2214,18 @@ OMX_ERRORTYPE omx_video::use_output_buffer(
DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_pmem");
return OMX_ErrorInsufficientResources;
}
-
+#ifdef USE_ION
+ m_pOutput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sOutPortDef.nBufferCountActual);
+ if(m_pOutput_ion == NULL)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_ion");
+ return OMX_ErrorInsufficientResources;
+ }
+#endif
if(m_out_mem_ptr)
{
bufHdr = m_out_mem_ptr;
DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
-
// Settting the entire storage nicely
for(i=0; i < m_sOutPortDef.nBufferCountActual ; i++)
{
@@ -2076,6 +2238,11 @@ OMX_ERRORTYPE omx_video::use_output_buffer(
bufHdr->pBuffer = NULL;
bufHdr++;
m_pOutput_pmem[i].fd = -1;
+#ifdef USE_ION
+ m_pOutput_ion[i].ion_device_fd =-1;
+ m_pOutput_ion[i].fd_ion_data.fd=-1;
+ m_pOutput_ion[i].ion_alloc_data.handle =NULL;
+#endif
}
}
else
@@ -2099,15 +2266,27 @@ OMX_ERRORTYPE omx_video::use_output_buffer(
{
*bufferHdr = (m_out_mem_ptr + i );
(*bufferHdr)->pBuffer = (OMX_U8 *)buffer;
+ (*bufferHdr)->pAppPrivate = appData;
BITMASK_SET(&m_out_bm_count,i);
if(!m_use_output_pmem)
{
- m_pOutput_pmem[i].fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+#ifdef USE_ION
+ m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(
+ m_sOutPortDef.nBufferSize,
+ &m_pOutput_ion[i].ion_alloc_data,
+ &m_pOutput_ion[i].fd_ion_data,CACHED);
+ if(m_pOutput_ion[i].ion_device_fd < 0) {
+ DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
+ return OMX_ErrorInsufficientResources;
+ }
+ m_pOutput_pmem[i].fd = m_pOutput_ion[i].fd_ion_data.fd;
+#else
+ m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
if(m_pOutput_pmem[i].fd == 0)
{
- m_pOutput_pmem[i].fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+ m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
}
if(m_pOutput_pmem[i].fd < 0)
@@ -2115,6 +2294,7 @@ OMX_ERRORTYPE omx_video::use_output_buffer(
DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() Failed");
return OMX_ErrorInsufficientResources;
}
+#endif
m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
m_pOutput_pmem[i].offset = 0;
m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pOutput_pmem[i].size,PROT_READ|PROT_WRITE,
@@ -2122,6 +2302,10 @@ OMX_ERRORTYPE omx_video::use_output_buffer(
if(m_pOutput_pmem[i].buffer == MAP_FAILED)
{
DEBUG_PRINT_ERROR("\nERROR: mmap() Failed");
+ close(m_pOutput_pmem[i].fd);
+#ifdef USE_ION
+ free_ion_memory(&m_pOutput_ion[i]);
+#endif
return OMX_ErrorInsufficientResources;
}
}
@@ -2148,7 +2332,7 @@ OMX_ERRORTYPE omx_video::use_output_buffer(
DEBUG_PRINT_LOW("\n use_out:: bufhdr = %p, pBuffer = %p, m_pOutput_pmem[i].buffer = %p",
(*bufferHdr), (*bufferHdr)->pBuffer, m_pOutput_pmem[i].buffer);
- if(dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT) != true)
+ if(dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT,i) != true)
{
DEBUG_PRINT_ERROR("ERROR: dev_use_buf Failed for o/p buf");
return OMX_ErrorInsufficientResources;
@@ -2258,18 +2442,33 @@ OMX_ERRORTYPE omx_video::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
}
index = bufferHdr - m_inp_mem_ptr;
+#ifdef _ANDROID_ICS_
+ if(meta_mode_enable)
+ {
+ if(index < m_sInPortDef.nBufferCountActual)
+ {
+ memset(&meta_buffer_hdr[index], 0, sizeof(meta_buffer_hdr[index]));
+ memset(&meta_buffers[index], 0, sizeof(meta_buffers[index]));
+ }
+ return OMX_ErrorNone;
+ }
+#endif
+ if(index < m_sInPortDef.nBufferCountActual &&
+ dev_free_buf(&m_pInput_pmem[index],PORT_INDEX_IN) != true)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: dev_free_buf() Failed for i/p buf");
+ }
if(index < m_sInPortDef.nBufferCountActual && m_pInput_pmem)
{
if(m_pInput_pmem[index].fd > 0 && input_use_buffer == false)
{
DEBUG_PRINT_LOW("\n FreeBuffer:: i/p AllocateBuffer case");
- if(dev_free_buf(&m_pInput_pmem[index],PORT_INDEX_IN) != true)
- {
- DEBUG_PRINT_ERROR("\nERROR: dev_free_buf() Failed for i/p buf");
- }
munmap (m_pInput_pmem[index].buffer,m_pInput_pmem[index].size);
close (m_pInput_pmem[index].fd);
+#ifdef USE_ION
+ free_ion_memory(&m_pInput_ion[index]);
+#endif
m_pInput_pmem[index].fd = -1;
}
else if(m_pInput_pmem[index].fd > 0 && (input_use_buffer == true &&
@@ -2282,6 +2481,9 @@ OMX_ERRORTYPE omx_video::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
}
munmap (m_pInput_pmem[index].buffer,m_pInput_pmem[index].size);
close (m_pInput_pmem[index].fd);
+#ifdef USE_ION
+ free_ion_memory(&m_pInput_ion[index]);
+#endif
m_pInput_pmem[index].fd = -1;
}
else
@@ -2305,17 +2507,22 @@ OMX_ERRORTYPE omx_video::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
}
index = bufferHdr - m_out_mem_ptr;
+ if(index < m_sOutPortDef.nBufferCountActual &&
+ dev_free_buf(&m_pOutput_pmem[index],PORT_INDEX_OUT) != true)
+ {
+ DEBUG_PRINT_ERROR("ERROR: dev_free_buf Failed for o/p buf");
+ }
+
if(index < m_sOutPortDef.nBufferCountActual && m_pOutput_pmem)
{
if(m_pOutput_pmem[index].fd > 0 && output_use_buffer == false )
{
DEBUG_PRINT_LOW("\n FreeBuffer:: o/p AllocateBuffer case");
- if(dev_free_buf(&m_pOutput_pmem[index],PORT_INDEX_OUT) != true)
- {
- DEBUG_PRINT_ERROR("ERROR: dev_free_buf Failed for o/p buf");
- }
munmap (m_pOutput_pmem[index].buffer,m_pOutput_pmem[index].size);
close (m_pOutput_pmem[index].fd);
+#ifdef USE_ION
+ free_ion_memory(&m_pOutput_ion[index]);
+#endif
m_pOutput_pmem[index].fd = -1;
}
else if( m_pOutput_pmem[index].fd > 0 && (output_use_buffer == true
@@ -2328,6 +2535,9 @@ OMX_ERRORTYPE omx_video::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
}
munmap (m_pOutput_pmem[index].buffer,m_pOutput_pmem[index].size);
close (m_pOutput_pmem[index].fd);
+#ifdef USE_ION
+ free_ion_memory(&m_pOutput_ion[index]);
+#endif
m_pOutput_pmem[index].fd = -1;
}
else
@@ -2337,8 +2547,40 @@ OMX_ERRORTYPE omx_video::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
}
return OMX_ErrorNone;
}
-
-
+#ifdef _ANDROID_ICS_
+OMX_ERRORTYPE omx_video::allocate_input_meta_buffer(
+ OMX_BUFFERHEADERTYPE **bufferHdr,
+ OMX_PTR appData,
+ OMX_U32 bytes)
+{
+ unsigned index = 0;
+ if(!bufferHdr || bytes != sizeof(encoder_media_buffer_type))
+ {
+ DEBUG_PRINT_ERROR("wrong params allocate_input_meta_buffer Hdr %p len %d",
+ bufferHdr,bytes);
+ return OMX_ErrorBadParameter;
+ }
+ if(!m_inp_mem_ptr)
+ m_inp_mem_ptr = meta_buffer_hdr;
+ for(index = 0;((index < m_sInPortDef.nBufferCountActual) &&
+ meta_buffer_hdr[index].pBuffer); index++);
+ if(index == m_sInPortDef.nBufferCountActual)
+ {
+ DEBUG_PRINT_ERROR("All buffers are allocated input_meta_buffer");
+ return OMX_ErrorBadParameter;
+ }
+ BITMASK_SET(&m_inp_bm_count,index);
+ *bufferHdr = &meta_buffer_hdr[index];
+ memset(&meta_buffer_hdr[index], 0, sizeof(meta_buffer_hdr[index]));
+ meta_buffer_hdr[index].nSize = sizeof(meta_buffer_hdr[index]);
+ meta_buffer_hdr[index].nAllocLen = bytes;
+ meta_buffer_hdr[index].nVersion.nVersion = OMX_SPEC_VERSION;
+ meta_buffer_hdr[index].nInputPortIndex = PORT_INDEX_IN;
+ meta_buffer_hdr[index].pBuffer = (OMX_U8*)&meta_buffers[index];
+ meta_buffer_hdr[index].pAppPrivate = appData;
+ return OMX_ErrorNone;
+}
+#endif
/* ======================================================================
FUNCTION
omx_venc::AllocateInputBuffer
@@ -2374,6 +2616,8 @@ OMX_ERRORTYPE omx_video::allocate_input_buffer(
if(!m_inp_mem_ptr)
{
+ DEBUG_PRINT_HIGH("%s: size = %d, actual cnt %d", __FUNCTION__,
+ m_sInPortDef.nBufferSize, m_sInPortDef.nBufferCountActual);
m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
calloc( (sizeof(OMX_BUFFERHEADERTYPE)), m_sInPortDef.nBufferCountActual);
if(m_inp_mem_ptr == NULL)
@@ -2389,10 +2633,22 @@ OMX_ERRORTYPE omx_video::allocate_input_buffer(
DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_pmem");
return OMX_ErrorInsufficientResources;
}
-
+#ifdef USE_ION
+ m_pInput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sInPortDef.nBufferCountActual);
+ if(m_pInput_ion == NULL)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pInput_ion");
+ return OMX_ErrorInsufficientResources;
+ }
+#endif
for(i=0; i< m_sInPortDef.nBufferCountActual; i++)
{
m_pInput_pmem[i].fd = -1;
+#ifdef USE_ION
+ m_pInput_ion[i].ion_device_fd =-1;
+ m_pInput_ion[i].fd_ion_data.fd =-1;
+ m_pInput_ion[i].ion_alloc_data.handle=NULL;
+#endif
}
}
@@ -2403,7 +2659,6 @@ OMX_ERRORTYPE omx_video::allocate_input_buffer(
break;
}
}
-
if(i < m_sInPortDef.nBufferCountActual)
{
@@ -2414,11 +2669,22 @@ OMX_ERRORTYPE omx_video::allocate_input_buffer(
(*bufferHdr)->pAppPrivate = appData;
(*bufferHdr)->nInputPortIndex = PORT_INDEX_IN;
- m_pInput_pmem[i].fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+#ifdef USE_ION
+ m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize,
+ &m_pInput_ion[i].ion_alloc_data,
+ &m_pInput_ion[i].fd_ion_data,CACHED);
+ if(m_pInput_ion[i].ion_device_fd < 0) {
+ DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
+ return OMX_ErrorInsufficientResources;
+ }
+
+ m_pInput_pmem[i].fd = m_pInput_ion[i].fd_ion_data.fd;
+#else
+ m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
if(m_pInput_pmem[i].fd == 0)
{
- m_pInput_pmem[i].fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+ m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
}
if(m_pInput_pmem[i].fd < 0)
@@ -2426,6 +2692,7 @@ OMX_ERRORTYPE omx_video::allocate_input_buffer(
DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() Failed\n");
return OMX_ErrorInsufficientResources;
}
+#endif
m_pInput_pmem[i].size = m_sInPortDef.nBufferSize;
m_pInput_pmem[i].offset = 0;
@@ -2433,7 +2700,11 @@ OMX_ERRORTYPE omx_video::allocate_input_buffer(
MAP_SHARED,m_pInput_pmem[i].fd,0);
if(m_pInput_pmem[i].buffer == MAP_FAILED)
{
- DEBUG_PRINT_ERROR("\nERROR: mmap FAILED\n");
+ DEBUG_PRINT_ERROR("\nERROR: mmap FAILED= %d\n", errno);
+ close(m_pInput_pmem[i].fd);
+#ifdef USE_ION
+ free_ion_memory(&m_pInput_ion[i]);
+#endif
return OMX_ErrorInsufficientResources;
}
@@ -2441,7 +2712,7 @@ OMX_ERRORTYPE omx_video::allocate_input_buffer(
BITMASK_SET(&m_inp_bm_count,i);
//here change the I/P param here from buf_adr to pmem
- if( dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN) != true)
+ if( dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN,i) != true)
{
DEBUG_PRINT_ERROR("\nERROR: dev_use_buf FAILED for i/p buf\n");
return OMX_ErrorInsufficientResources;
@@ -2482,11 +2753,13 @@ OMX_ERRORTYPE omx_video::allocate_output_buffer(
OMX_ERRORTYPE eRet = OMX_ErrorNone;
OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
unsigned i= 0; // Temporary counter
+
DEBUG_PRINT_HIGH("\n allocate_output_buffer()::");
if(!m_out_mem_ptr)
{
int nBufHdrSize = 0;
- DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",m_sOutPortDef.nBufferCountActual);
+ DEBUG_PRINT_HIGH("%s: size = %d, actual cnt %d", __FUNCTION__,
+ m_sOutPortDef.nBufferSize, m_sOutPortDef.nBufferCountActual);
nBufHdrSize = m_sOutPortDef.nBufferCountActual * sizeof(OMX_BUFFERHEADERTYPE);
/*
@@ -2498,8 +2771,20 @@ OMX_ERRORTYPE omx_video::allocate_output_buffer(
*/
m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1);
+#ifdef USE_ION
+ m_pOutput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sOutPortDef.nBufferCountActual);
+ if(m_pOutput_ion == NULL)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_ion");
+ return OMX_ErrorInsufficientResources;
+ }
+#endif
m_pOutput_pmem = (struct pmem *) calloc(sizeof(struct pmem), m_sOutPortDef.nBufferCountActual);
-
+ if(m_pOutput_pmem == NULL)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: calloc() Failed for m_pOutput_pmem");
+ return OMX_ErrorInsufficientResources;
+ }
if(m_out_mem_ptr && m_pOutput_pmem)
{
bufHdr = m_out_mem_ptr;
@@ -2516,6 +2801,11 @@ OMX_ERRORTYPE omx_video::allocate_output_buffer(
bufHdr->pBuffer = NULL;
bufHdr++;
m_pOutput_pmem[i].fd = -1;
+#ifdef USE_ION
+ m_pOutput_ion[i].ion_device_fd =-1;
+ m_pOutput_ion[i].fd_ion_data.fd=-1;
+ m_pOutput_ion[i].ion_alloc_data.handle =NULL;
+#endif
}
}
else
@@ -2534,15 +2824,24 @@ OMX_ERRORTYPE omx_video::allocate_output_buffer(
break;
}
}
-
if(eRet == OMX_ErrorNone)
{
if(i < m_sOutPortDef.nBufferCountActual)
{
- m_pOutput_pmem[i].fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+#ifdef USE_ION
+ m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sOutPortDef.nBufferSize,
+ &m_pOutput_ion[i].ion_alloc_data,
+ &m_pOutput_ion[i].fd_ion_data,CACHED);
+ if(m_pOutput_ion[i].ion_device_fd < 0) {
+ DEBUG_PRINT_ERROR("\nERROR:ION device open() Failed");
+ return OMX_ErrorInsufficientResources;
+ }
+ m_pOutput_pmem[i].fd = m_pOutput_ion[i].fd_ion_data.fd;
+#else
+ m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
if(m_pOutput_pmem[i].fd == 0)
{
- m_pOutput_pmem[i].fd = open ("/dev/pmem_adsp",O_RDWR | O_SYNC);
+ m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR);
}
if(m_pOutput_pmem[i].fd < 0)
@@ -2550,6 +2849,7 @@ OMX_ERRORTYPE omx_video::allocate_output_buffer(
DEBUG_PRINT_ERROR("\nERROR: /dev/pmem_adsp open() failed");
return OMX_ErrorInsufficientResources;
}
+#endif
m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize;
m_pOutput_pmem[i].offset = 0;
m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL,m_pOutput_pmem[i].size,PROT_READ|PROT_WRITE,
@@ -2557,15 +2857,20 @@ OMX_ERRORTYPE omx_video::allocate_output_buffer(
if(m_pOutput_pmem[i].buffer == MAP_FAILED)
{
DEBUG_PRINT_ERROR("\nERROR: MMAP_FAILED in o/p alloc buffer");
+ close (m_pOutput_pmem[i].fd);
+#ifdef USE_ION
+ free_ion_memory(&m_pOutput_ion[i]);
+#endif
return OMX_ErrorInsufficientResources;
}
*bufferHdr = (m_out_mem_ptr + i );
(*bufferHdr)->pBuffer = (OMX_U8 *)m_pOutput_pmem[i].buffer;
+ (*bufferHdr)->pAppPrivate = appData;
BITMASK_SET(&m_out_bm_count,i);
- if(dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT) != true)
+ if(dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT,i) != true)
{
DEBUG_PRINT_ERROR("\nERROR: dev_use_buf FAILED for o/p buf");
return OMX_ErrorInsufficientResources;
@@ -2606,7 +2911,7 @@ OMX_ERRORTYPE omx_video::allocate_buffer(OMX_IN OMX_HANDLETYPE h
OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
- DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
+ DEBUG_PRINT_LOW("\n Allocate buffer of size = %d on port %d \n", bytes, (int)port);
if(m_state == OMX_StateInvalid)
{
DEBUG_PRINT_ERROR("ERROR: Allocate Buf in Invalid State\n");
@@ -2616,6 +2921,11 @@ OMX_ERRORTYPE omx_video::allocate_buffer(OMX_IN OMX_HANDLETYPE h
// What if the client calls again.
if(port == PORT_INDEX_IN)
{
+#ifdef _ANDROID_ICS_
+ if(meta_mode_enable)
+ eRet = allocate_input_meta_buffer(bufferHdr,appData,bytes);
+ else
+#endif
eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
}
else if(port == PORT_INDEX_OUT)
@@ -2732,7 +3042,11 @@ OMX_ERRORTYPE omx_video::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
m_sInPortDef.bPopulated = OMX_FALSE;
/*Free the Buffer Header*/
- if(release_input_done())
+ if(release_input_done()
+#ifdef _ANDROID_ICS_
+ && !meta_mode_enable
+#endif
+ )
{
input_use_buffer = false;
if(m_inp_mem_ptr)
@@ -2747,7 +3061,14 @@ OMX_ERRORTYPE omx_video::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
free(m_pInput_pmem);
m_pInput_pmem = NULL;
}
-
+#ifdef USE_ION
+ if(m_pInput_ion)
+ {
+ DEBUG_PRINT_LOW("Freeing m_pInput_ion\n");
+ free(m_pInput_ion);
+ m_pInput_ion = NULL;
+ }
+#endif
}
}
else
@@ -2795,6 +3116,14 @@ OMX_ERRORTYPE omx_video::free_buffer(OMX_IN OMX_HANDLETYPE hComp,
free(m_pOutput_pmem);
m_pOutput_pmem = NULL;
}
+#ifdef USE_ION
+ if(m_pOutput_ion)
+ {
+ DEBUG_PRINT_LOW("Freeing m_pOutput_ion\n");
+ free(m_pOutput_ion);
+ m_pOutput_ion = NULL;
+ }
+#endif
}
}
else
@@ -2953,8 +3282,68 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE
DEBUG_PRINT_ERROR("\nERROR: ETBProxy: Input flush in progress");
return OMX_ErrorNone;
}
+#ifdef _ANDROID_ICS_
+ if(meta_mode_enable)
+ {
+ encoder_media_buffer_type *media_buffer;
+ bool met_error = false;
+ media_buffer = (encoder_media_buffer_type *)meta_buffer_hdr[nBufIndex].pBuffer;
+ if(media_buffer)
+ {
+ if (media_buffer->buffer_type != kMetadataBufferTypeCameraSource &&
+ media_buffer->buffer_type != kMetadataBufferTypeGrallocSource) {
+ met_error = true;
+ } else {
+ if(media_buffer->buffer_type == kMetadataBufferTypeCameraSource)
+ {
+ if(media_buffer->meta_handle == NULL) {
+ met_error = true;
+ }
+ else if((media_buffer->meta_handle->numFds != 1 &&
+ media_buffer->meta_handle->numInts != 2))
+ {
+ met_error = true;
+ }
+ }
+ }
+ } else {
+ met_error = true;
+ }
+ if(met_error)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Unkown source/metahandle in ETB call");
+ post_event ((unsigned int)buffer,0,OMX_COMPONENT_GENERATE_EBD);
+ return OMX_ErrorBadParameter;
+ }
+ struct pmem Input_pmem_info;
+ if(media_buffer->buffer_type == kMetadataBufferTypeCameraSource)
+ {
+ Input_pmem_info.buffer = media_buffer;
+ Input_pmem_info.fd = media_buffer->meta_handle->data[0];
+ Input_pmem_info.offset = media_buffer->meta_handle->data[1];
+ Input_pmem_info.size = media_buffer->meta_handle->data[2];
+ DEBUG_PRINT_LOW("ETB fd = %d, offset = %d, size = %d",Input_pmem_info.fd,
+ Input_pmem_info.offset,
+ Input_pmem_info.size);
+
+ } else {
+ private_handle_t *handle = (private_handle_t *)media_buffer->meta_handle;
+ Input_pmem_info.buffer = media_buffer;
+ Input_pmem_info.fd = handle->fd;
+ Input_pmem_info.offset = 0;
+ Input_pmem_info.size = handle->size;
+ }
+ if(dev_use_buf(&Input_pmem_info,PORT_INDEX_IN,0) != true) {
+ DEBUG_PRINT_ERROR("\nERROR: in dev_use_buf");
+ post_event ((unsigned int)buffer,0,OMX_COMPONENT_GENERATE_EBD);
+ return OMX_ErrorBadParameter;
+ }
+ }
+ else if(input_use_buffer && !m_use_input_pmem)
+#else
if(input_use_buffer && !m_use_input_pmem)
+#endif
{
DEBUG_PRINT_LOW("\n Heap UseBuffer case, so memcpy the data");
pmem_data_buf = (OMX_U8 *)m_pInput_pmem[nBufIndex].buffer;
@@ -2963,10 +3352,17 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE
buffer->nFilledLen);
DEBUG_PRINT_LOW("memcpy() done in ETBProxy for i/p Heap UseBuf");
}
-
- if(dev_empty_buf(buffer, pmem_data_buf) != true)
+#ifdef _COPPER_
+ if(dev_empty_buf(buffer, pmem_data_buf,nBufIndex,m_pInput_pmem[nBufIndex].fd) != true)
+#else
+ if(dev_empty_buf(buffer, pmem_data_buf,0,0) != true)
+#endif
{
DEBUG_PRINT_ERROR("\nERROR: ETBProxy: dev_empty_buf failed");
+#ifdef _ANDROID_ICS_
+ omx_release_meta_buffer(buffer);
+#endif
+ post_event ((unsigned int)buffer,0,OMX_COMPONENT_GENERATE_EBD);
/*Generate an async error and move to invalid state*/
pending_input_buffers--;
return OMX_ErrorBadParameter;
@@ -3074,9 +3470,10 @@ OMX_ERRORTYPE omx_video::fill_this_buffer_proxy(
pmem_data_buf = (OMX_U8 *)m_pOutput_pmem[bufferAdd - m_out_mem_ptr].buffer;
}
- if(dev_fill_buf(bufferAdd, pmem_data_buf) != true)
+ if(dev_fill_buf(bufferAdd, pmem_data_buf,(bufferAdd - m_out_mem_ptr),m_pOutput_pmem[bufferAdd - m_out_mem_ptr].fd) != true)
{
DEBUG_PRINT_ERROR("\nERROR: dev_fill_buf() Failed");
+ post_event ((unsigned int)bufferAdd,0,OMX_COMPONENT_GENERATE_FBD);
pending_output_buffers--;
return OMX_ErrorBadParameter;
}
@@ -3157,7 +3554,7 @@ OMX_ERRORTYPE omx_video::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -3169,7 +3566,7 @@ OMX_ERRORTYPE omx_video::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -3182,7 +3579,7 @@ OMX_ERRORTYPE omx_video::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -3195,7 +3592,7 @@ OMX_ERRORTYPE omx_video::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -3208,7 +3605,7 @@ OMX_ERRORTYPE omx_video::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -3220,7 +3617,7 @@ OMX_ERRORTYPE omx_video::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -3233,7 +3630,7 @@ OMX_ERRORTYPE omx_video::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
{
if((0 == index) && role)
{
- strncpy((char *)role, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)role, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
}
else
@@ -3487,7 +3884,8 @@ bool omx_video::release_input_done(void)
OMX_ERRORTYPE omx_video::fill_buffer_done(OMX_HANDLETYPE hComp,
OMX_BUFFERHEADERTYPE * buffer)
{
- DEBUG_PRINT_LOW("\nfill_buffer_done: buffer->pBuffer[%p]\n", buffer->pBuffer);
+ DEBUG_PRINT_LOW("fill_buffer_done: buffer->pBuffer[%p], flags=0x%x",
+ buffer->pBuffer, buffer->nFlags);
if(buffer == NULL || ((buffer - m_out_mem_ptr) > m_sOutPortDef.nBufferCountActual))
{
return OMX_ErrorBadParameter;
@@ -3495,12 +3893,27 @@ OMX_ERRORTYPE omx_video::fill_buffer_done(OMX_HANDLETYPE hComp,
pending_output_buffers--;
+ extra_data_handle.create_extra_data(buffer);
+
+ if (m_sDebugSliceinfo) {
+ if(buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) {
+ DEBUG_PRINT_HIGH("parsing extradata");
+ extra_data_handle.parse_extra_data(buffer);
+ }
+ }
/* For use buffer we need to copy the data */
if(m_pCallbacks.FillBufferDone)
{
if(buffer->nFilledLen > 0)
{
m_fbd_count++;
+
+#ifdef OUTPUT_BUFFER_LOG
+ if(outputBufferFile1)
+ {
+ fwrite((const char *)buffer->pBuffer, buffer->nFilledLen, 1, outputBufferFile1);
+ }
+#endif
}
m_pCallbacks.FillBufferDone (hComp,m_app_data,buffer);
}
@@ -3508,23 +3921,352 @@ OMX_ERRORTYPE omx_video::fill_buffer_done(OMX_HANDLETYPE hComp,
{
return OMX_ErrorBadParameter;
}
-
return OMX_ErrorNone;
}
OMX_ERRORTYPE omx_video::empty_buffer_done(OMX_HANDLETYPE hComp,
OMX_BUFFERHEADERTYPE* buffer)
{
- DEBUG_PRINT_LOW("\nempty_buffer_done: buffer->pBuffer[%p]\n", buffer->pBuffer);
+ DEBUG_PRINT_LOW("empty_buffer_done: buffer->pBuffer[%p]", buffer->pBuffer);
if(buffer == NULL || ((buffer - m_inp_mem_ptr) > m_sInPortDef.nBufferCountActual))
{
return OMX_ErrorBadParameter;
}
pending_input_buffers--;
+
if(m_pCallbacks.EmptyBufferDone)
{
m_pCallbacks.EmptyBufferDone(hComp ,m_app_data, buffer);
}
return OMX_ErrorNone;
}
+
+void omx_video::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 ();
+ }
+ 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 ();
+ }
+ break;
+ }
+ }
+}
+
+#ifdef MAX_RES_720P
+OMX_ERRORTYPE omx_video::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ if(!profileLevelType)
+ return OMX_ErrorBadParameter;
+
+ if(profileLevelType->nPortIndex == 1) {
+ if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingAVC)
+ {
+ if (profileLevelType->nProfileIndex == 0)
+ {
+ profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
+ profileLevelType->eLevel = OMX_VIDEO_AVCLevel31;
+ }
+ else if (profileLevelType->nProfileIndex == 1)
+ {
+ profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
+ profileLevelType->eLevel = OMX_VIDEO_AVCLevel31;
+ }
+ else if(profileLevelType->nProfileIndex == 2)
+ {
+ profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
+ profileLevelType->eLevel = OMX_VIDEO_AVCLevel31;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
+ profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ }
+ else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingH263)
+ {
+ if (profileLevelType->nProfileIndex == 0)
+ {
+ profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
+ profileLevelType->eLevel = OMX_VIDEO_H263Level70;
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ }
+ else if(m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4)
+ {
+ 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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:%d, Level:%d\n",
+ profileLevelType->eProfile,profileLevelType->eLevel);
+ return eRet;
+}
+#endif
+
+#ifdef MAX_RES_1080P
+OMX_ERRORTYPE omx_video::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ if(!profileLevelType)
+ return OMX_ErrorBadParameter;
+
+ if(profileLevelType->nPortIndex == 1) {
+ if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingAVC)
+ {
+ 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 %d\n",
+ profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ }
+ else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingH263)
+ {
+ if (profileLevelType->nProfileIndex == 0)
+ {
+ profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
+ profileLevelType->eLevel = OMX_VIDEO_H263Level70;
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ }
+ else if(m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4)
+ {
+ 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_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n", profileLevelType->nProfileIndex);
+ eRet = OMX_ErrorNoMore;
+ }
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %d\n", profileLevelType->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:%d, Level:%d\n",
+ profileLevelType->eProfile,profileLevelType->eLevel);
+ return eRet;
+}
+
+#ifdef USE_ION
+int omx_video::alloc_map_ion_memory(int size,struct ion_allocation_data *alloc_data,
+ struct ion_fd_data *fd_data,int flag)
+{
+ struct venc_ion buf_ion_info;
+ int ion_device_fd =-1,rc=0,ion_dev_flags = 0;
+ if (size <=0 || !alloc_data || !fd_data) {
+ DEBUG_PRINT_ERROR("\nInvalid input to alloc_map_ion_memory");
+ return -EINVAL;
+ }
+ if(flag == CACHED) {
+ ion_dev_flags = O_RDONLY;
+ } else if(flag == UNCACHED) {
+ ion_dev_flags = O_RDONLY ;//| O_DSYNC;
+ }
+ ion_device_fd = open (MEM_DEVICE,ion_dev_flags);
+ if(ion_device_fd < 0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: ION Device open() Failed");
+ return ion_device_fd;
+ }
+ alloc_data->len = size;
+ alloc_data->align = 4096;
+ alloc_data->flags = (ION_HEAP(MEM_HEAP_ID) |
+ ION_HEAP(ION_IOMMU_HEAP_ID));
+ rc = ioctl(ion_device_fd,ION_IOC_ALLOC,alloc_data);
+ if(rc || !alloc_data->handle) {
+ DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
+ alloc_data->handle =NULL;
+ close(ion_device_fd);
+ ion_device_fd = -1;
+ return ion_device_fd;
+ }
+ fd_data->handle = alloc_data->handle;
+ rc = ioctl(ion_device_fd,ION_IOC_MAP,fd_data);
+ if(rc) {
+ DEBUG_PRINT_ERROR("\n ION MAP failed ");
+ buf_ion_info.ion_alloc_data = *alloc_data;
+ buf_ion_info.ion_device_fd = ion_device_fd;
+ buf_ion_info.fd_ion_data = *fd_data;
+ free_ion_memory(&buf_ion_info);
+ fd_data->fd =-1;
+ ion_device_fd =-1;
+ }
+ return ion_device_fd;
+}
+
+void omx_video::free_ion_memory(struct venc_ion *buf_ion_info)
+{
+ if (!buf_ion_info) {
+ DEBUG_PRINT_ERROR("\n Invalid input to free_ion_memory");
+ 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 ");
+ return;
+ }
+ close(buf_ion_info->ion_device_fd);
+ buf_ion_info->ion_alloc_data.handle = NULL;
+ buf_ion_info->ion_device_fd = -1;
+ buf_ion_info->fd_ion_data.fd = -1;
+}
+#endif
+#endif
+#ifdef _ANDROID_ICS_
+void omx_video::omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer)
+{
+ if(buffer && meta_mode_enable)
+ {
+ encoder_media_buffer_type *media_ptr;
+ struct pmem Input_pmem;
+ bool meta_error = false;
+ media_ptr = (encoder_media_buffer_type *) buffer->pBuffer;
+ if(media_ptr && media_ptr->meta_handle)
+ {
+ if(media_ptr->buffer_type == kMetadataBufferTypeCameraSource &&
+ media_ptr->meta_handle->numFds == 1 &&
+ media_ptr->meta_handle->numInts == 2) {
+ Input_pmem.fd = media_ptr->meta_handle->data[0];
+ Input_pmem.buffer = media_ptr;
+ Input_pmem.size = media_ptr->meta_handle->data[2];
+ Input_pmem.offset = media_ptr->meta_handle->data[1];
+ DEBUG_PRINT_LOW("EBD fd = %d, offset = %d, size = %d",Input_pmem.fd,
+ Input_pmem.offset,
+ Input_pmem.size);
+ } else if(media_ptr->buffer_type == kMetadataBufferTypeGrallocSource) {
+ private_handle_t *handle = (private_handle_t *)media_ptr->meta_handle;
+ Input_pmem.buffer = media_ptr;
+ Input_pmem.fd = handle->fd;
+ Input_pmem.offset = 0;
+ Input_pmem.size = handle->size;
+ } else {
+ meta_error = true;
+ DEBUG_PRINT_ERROR(" Meta Error set in EBD");
+ }
+ if(!meta_error)
+ meta_error = !dev_free_buf(&Input_pmem,PORT_INDEX_IN);
+ if(meta_error)
+ {
+ DEBUG_PRINT_ERROR(" Warning dev_free_buf failed flush value is %d",
+ input_flush_progress);
+ }
+ }
+ }
+}
+#endif
diff --git a/mm-video/vidc/venc/src/omx_video_encoder.cpp b/mm-video/vidc/venc/src/omx_video_encoder.cpp
index 87785102..62e515e3 100644..100755
--- a/mm-video/vidc/venc/src/omx_video_encoder.cpp
+++ b/mm-video/vidc/venc/src/omx_video_encoder.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -29,7 +29,16 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string.h>
#include "video_encoder_device.h"
#include <stdio.h>
-
+#ifdef _ANDROID_ICS_
+#include <media/hardware/HardwareAPI.h>
+#endif
+#ifdef _ANDROID_
+#include <cutils/properties.h>
+#endif
+#ifndef _ANDROID_
+#include <glib.h>
+#define strlcpy g_strlcpy
+#endif
/*----------------------------------------------------------------------------
* Preprocessor Definitions and Constants
* -------------------------------------------------------------------------*/
@@ -52,7 +61,12 @@ void *get_omx_component_factory_fn(void)
omx_venc::omx_venc()
{
- //nothing to do
+#ifdef _ANDROID_ICS_
+ meta_mode_enable = false;
+ memset(meta_buffer_hdr,0,sizeof(meta_buffer_hdr));
+ memset(meta_buffers,0,sizeof(meta_buffers));
+ mUseProxyColorFormat = false;
+#endif
}
omx_venc::~omx_venc()
@@ -90,25 +104,25 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
DEBUG_PRINT_HIGH("\n omx_venc(): Inside component_init()");
// Copy the role information which provides the decoder m_nkind
- strncpy((char *)m_nkind,role,OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)m_nkind,role,OMX_MAX_STRINGNAME_SIZE);
if(!strncmp((char *)m_nkind,"OMX.qcom.video.encoder.mpeg4",\
OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char *)m_cRole, "video_encoder.mpeg4",\
+ strlcpy((char *)m_cRole, "video_encoder.mpeg4",\
OMX_MAX_STRINGNAME_SIZE);
codec_type = OMX_VIDEO_CodingMPEG4;
}
else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char *)m_cRole, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)m_cRole, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
codec_type = OMX_VIDEO_CodingH263;
}
else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char *)m_cRole, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char *)m_cRole, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
codec_type = OMX_VIDEO_CodingAVC;
}
else
@@ -123,7 +137,7 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
return eRet;
}
- handle = new venc_dev();
+ handle = new venc_dev(this);
if(handle == NULL)
{
@@ -170,7 +184,7 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_sConfigIntraRefreshVOP.IntraRefreshVOP = OMX_FALSE;
OMX_INIT_STRUCT(&m_sConfigFrameRotation, OMX_CONFIG_ROTATIONTYPE);
- m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+ m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_IN;
m_sConfigFrameRotation.nRotation = 0;
OMX_INIT_STRUCT(&m_sSessionQuantization, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
@@ -187,6 +201,22 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
OMX_INIT_STRUCT(&m_sParamProfileLevel, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
m_sParamProfileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+ OMX_INIT_STRUCT(&m_sIntraperiod, QOMX_VIDEO_INTRAPERIODTYPE);
+ m_sIntraperiod.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+ m_sIntraperiod.nPFrames = (m_sConfigFramerate.xEncodeFramerate * 2) - 1;
+
+ OMX_INIT_STRUCT(&m_sErrorCorrection, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
+ m_sErrorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+ m_sErrorCorrection.bEnableDataPartitioning = OMX_FALSE;
+ m_sErrorCorrection.bEnableHEC = OMX_FALSE;
+ m_sErrorCorrection.bEnableResync = OMX_FALSE;
+ m_sErrorCorrection.bEnableRVLC = OMX_FALSE;
+ m_sErrorCorrection.nResynchMarkerSpacing = 0;
+
+ OMX_INIT_STRUCT(&m_sIntraRefresh, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
+ m_sIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+ m_sIntraRefresh.eRefreshMode = OMX_VIDEO_IntraRefreshMax;
+
if(codec_type == OMX_VIDEO_CodingMPEG4)
{
m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple;
@@ -213,6 +243,8 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_sInPortDef.format.video.cMIMEType = "YUV420";
m_sInPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
m_sInPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
+ m_sInPortDef.format.video.nStride = OMX_CORE_QCIF_WIDTH;
+ m_sInPortDef.format.video.nSliceHeight = OMX_CORE_QCIF_HEIGHT;
m_sInPortDef.format.video.nBitrate = 64000;
m_sInPortDef.format.video.xFramerate = 15 << 16;
m_sInPortDef.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
@@ -303,7 +335,7 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_sParamMPEG4.nSliceHeaderSpacing = 0;
m_sParamMPEG4.bSVH = OMX_FALSE;
m_sParamMPEG4.bGov = OMX_FALSE;
- m_sParamMPEG4.nPFrames = 29; // 2 second intra period for default 15 fps
+ m_sParamMPEG4.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
m_sParamMPEG4.bACPred = OMX_TRUE;
m_sParamMPEG4.nTimeIncRes = 30; // delta = 2 @ 15 fps
m_sParamMPEG4.nAllowedPictureTypes = 2; // pframe and iframe
@@ -313,45 +345,53 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
// h263 specific init
OMX_INIT_STRUCT(&m_sParamH263, OMX_VIDEO_PARAM_H263TYPE);
m_sParamH263.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
- m_sParamH263.nPFrames = 29;
+ m_sParamH263.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
m_sParamH263.nBFrames = 0;
m_sParamH263.eProfile = OMX_VIDEO_H263ProfileBaseline;
m_sParamH263.eLevel = OMX_VIDEO_H263Level10;
m_sParamH263.bPLUSPTYPEAllowed = OMX_FALSE;
m_sParamH263.nAllowedPictureTypes = 2;
- m_sParamH263.bForceRoundingTypeToZero = OMX_TRUE; ///@todo determine what this should be
- m_sParamH263.nPictureHeaderRepetition = 0; ///@todo determine what this should be
- m_sParamH263.nGOBHeaderInterval = 0; ///@todo determine what this should be
+ m_sParamH263.bForceRoundingTypeToZero = OMX_TRUE;
+ m_sParamH263.nPictureHeaderRepetition = 0;
+ m_sParamH263.nGOBHeaderInterval = 1;
// h264 specific init
- OMX_INIT_STRUCT(&m_sParamH263, OMX_VIDEO_PARAM_AVCTYPE);
+ OMX_INIT_STRUCT(&m_sParamAVC, OMX_VIDEO_PARAM_AVCTYPE);
m_sParamAVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
- m_sParamAVC.nSliceHeaderSpacing =
- m_sParamAVC.nPFrames = 29;
+ m_sParamAVC.nSliceHeaderSpacing = 0;
+ m_sParamAVC.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
m_sParamAVC.nBFrames = 0;
- m_sParamAVC.bUseHadamard = OMX_FALSE;//todo: to decide the value
- m_sParamAVC.nRefFrames = 0; //todo: to decide the value
- m_sParamAVC.nRefIdx10ActiveMinus1 = 0; //todo: to decide the value
- m_sParamAVC.nRefIdx11ActiveMinus1 = 0; //todo: to decide the value
- m_sParamAVC.bEnableUEP = OMX_FALSE; //todo: to decide the value
- m_sParamAVC.bEnableFMO = OMX_FALSE;//todo: to decide the value
- m_sParamAVC.bEnableASO = OMX_FALSE; //todo: to decide the value
- m_sParamAVC.bEnableRS = OMX_FALSE;//todo: to decide the value
+ m_sParamAVC.bUseHadamard = OMX_FALSE;
+ m_sParamAVC.nRefFrames = 1;
+ m_sParamAVC.nRefIdx10ActiveMinus1 = 1;
+ m_sParamAVC.nRefIdx11ActiveMinus1 = 0;
+ m_sParamAVC.bEnableUEP = OMX_FALSE;
+ m_sParamAVC.bEnableFMO = OMX_FALSE;
+ m_sParamAVC.bEnableASO = OMX_FALSE;
+ m_sParamAVC.bEnableRS = OMX_FALSE;
m_sParamAVC.eProfile = OMX_VIDEO_AVCProfileBaseline;
m_sParamAVC.eLevel = OMX_VIDEO_AVCLevel1;
m_sParamAVC.nAllowedPictureTypes = 2;
- m_sParamAVC.bFrameMBsOnly = OMX_FALSE; //todo: to decide the value
- m_sParamAVC.bMBAFF = OMX_FALSE; //todo: to decide the value
- m_sParamAVC.bEntropyCodingCABAC = OMX_FALSE; //todo: to decide the value
- m_sParamAVC.bWeightedPPrediction = OMX_FALSE; //todo: to decide the value
- m_sParamAVC.nWeightedBipredicitonMode = 0;//todo: to decide the value
- m_sParamAVC.bconstIpred = OMX_FALSE;//todo: to decide the value
- m_sParamAVC.bDirect8x8Inference = OMX_FALSE; //todo: to decide the value
- m_sParamAVC.bDirectSpatialTemporal = OMX_FALSE; //todo: to decide the value
- m_sParamAVC.nCabacInitIdc = 0; //todo: to decide the value
- //m_sParamAVC.eLoopFilterMode = 0; //todo: to decide the value
+ m_sParamAVC.bFrameMBsOnly = OMX_FALSE;
+ m_sParamAVC.bMBAFF = OMX_FALSE;
+ m_sParamAVC.bEntropyCodingCABAC = OMX_FALSE;
+ m_sParamAVC.bWeightedPPrediction = OMX_FALSE;
+ m_sParamAVC.nWeightedBipredicitonMode = 0;
+ m_sParamAVC.bconstIpred = OMX_FALSE;
+ m_sParamAVC.bDirect8x8Inference = OMX_FALSE;
+ m_sParamAVC.bDirectSpatialTemporal = OMX_FALSE;
+ m_sParamAVC.nCabacInitIdc = 0;
+ m_sParamAVC.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
m_state = OMX_StateLoaded;
+ m_sExtraData = 0;
+ m_sDebugSliceinfo = 0;
+#ifdef _ANDROID_
+ char value[PROPERTY_VALUE_MAX] = {0};
+ property_get("vidc.venc.debug.sliceinfo", value, "0");
+ m_sDebugSliceinfo = (OMX_U32)atoi(value);
+ DEBUG_PRINT_HIGH("vidc.venc.debug.sliceinfo value is %d", m_sDebugSliceinfo);
+#endif
if(eRet == OMX_ErrorNone)
{
@@ -466,13 +506,15 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("\n i/p previous actual cnt = %d\n", m_sInPortDef.nBufferCountActual);
DEBUG_PRINT_LOW("\n i/p previous min cnt = %d\n", m_sInPortDef.nBufferCountMin);
- m_sInPortDef.format.video.nFrameWidth = portDefn->format.video.nFrameWidth;
- m_sInPortDef.format.video.nFrameHeight = portDefn->format.video.nFrameHeight;
- m_sInPortDef.format.video.xFramerate = portDefn->format.video.xFramerate;
- m_sInPortDef.format.video.nBitrate = portDefn->format.video.nBitrate;
- m_sInPortDef.format.video.eColorFormat = portDefn->format.video.eColorFormat;
-
-
+ memcpy(&m_sInPortDef, portDefn,sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
+
+#ifdef _ANDROID_ICS_
+ if (portDefn->format.video.eColorFormat == (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
+ m_sInPortDef.format.video.eColorFormat =
+ OMX_COLOR_FormatYUV420SemiPlanar;
+ mUseProxyColorFormat = true;
+ } //else case not needed as color format is already updated in the memcpy above
+#endif
/*Query Input Buffer Requirements*/
dev_get_buf_req (&m_sInPortDef.nBufferCountMin,
&m_sInPortDef.nBufferCountActual,
@@ -496,6 +538,8 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_ERROR("\nERROR: venc_set_param output failed");
return OMX_ErrorUnsupportedSetting;
}
+ memcpy(&m_sOutPortDef,portDefn,sizeof(struct OMX_PARAM_PORTDEFINITIONTYPE));
+ update_profile_level(); //framerate , bitrate
DEBUG_PRINT_LOW("\n o/p previous actual cnt = %d\n", m_sOutPortDef.nBufferCountActual);
DEBUG_PRINT_LOW("\n o/p previous min cnt = %d\n", m_sOutPortDef.nBufferCountMin);
@@ -529,8 +573,19 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
portFmt->eColorFormat);
+ update_profile_level(); //framerate
- m_sInPortFormat.eColorFormat = portFmt->eColorFormat;
+#ifdef _ANDROID_ICS_
+ if (portFmt->eColorFormat ==
+ (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
+ m_sInPortFormat.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+ mUseProxyColorFormat = true;
+ }
+ else
+#endif
+ {
+ m_sInPortFormat.eColorFormat = portFmt->eColorFormat;
+ }
m_sInPortFormat.xFramerate = portFmt->xFramerate;
}
//TODO if no use case for O/P port,delet m_sOutPortFormat
@@ -553,7 +608,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
m_sParamBitrate.nTargetBitrate = pParam->nTargetBitrate;
m_sParamBitrate.eControlRate = pParam->eControlRate;
-
+ update_profile_level(); //bitrate
m_sConfigBitrate.nEncodeBitrate = pParam->nTargetBitrate;
m_sInPortDef.format.video.nBitrate = pParam->nTargetBitrate;
m_sOutPortDef.format.video.nBitrate = pParam->nTargetBitrate;
@@ -563,21 +618,38 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
case OMX_IndexParamVideoMpeg4:
{
OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
+ OMX_VIDEO_PARAM_MPEG4TYPE mp4_param;
+ memcpy(&mp4_param, pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4");
- if(handle->venc_set_param(paramData,OMX_IndexParamVideoMpeg4) != true)
+ if(pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
+ {
+#ifdef MAX_RES_1080P
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+ mp4_param.nBFrames = 1;
+ }
+#else
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+ mp4_param.nBFrames = 0;
+ }
+#endif
+ }
+ else
+ {
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+ mp4_param.nBFrames = 0;
+ }
+ }
+ if(handle->venc_set_param(&mp4_param,OMX_IndexParamVideoMpeg4) != true)
{
return OMX_ErrorUnsupportedSetting;
}
- //.. more than one variable storing the npframes,profile,level details
- m_sParamMPEG4.nPFrames = pParam->nPFrames;
- m_sParamMPEG4.eProfile = pParam->eProfile;
- m_sParamMPEG4.eLevel = pParam->eLevel;
- m_sParamMPEG4.bACPred = pParam->bACPred;
- m_sParamMPEG4.nTimeIncRes = pParam->nTimeIncRes;
- m_sParamMPEG4.bReversibleVLC = pParam->bReversibleVLC;
-
- m_sParamProfileLevel.eProfile = pParam->eProfile;
- m_sParamProfileLevel.eLevel = pParam->eLevel;
+ memcpy(&m_sParamMPEG4,pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
break;
}
case OMX_IndexParamVideoH263:
@@ -588,38 +660,71 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
{
return OMX_ErrorUnsupportedSetting;
}
- //.. more than one variable storing the npframes,profile,level details
- m_sParamH263.nPFrames = pParam->nPFrames;
- m_sParamH263.eProfile = pParam->eProfile;
- m_sParamH263.eLevel = pParam->eLevel;
-
- m_sParamProfileLevel.eProfile = pParam->eProfile;
- m_sParamProfileLevel.eLevel = pParam->eLevel;
+ memcpy(&m_sParamH263,pParam, sizeof(struct OMX_VIDEO_PARAM_H263TYPE));
break;
}
case OMX_IndexParamVideoAvc:
{
OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
+ OMX_VIDEO_PARAM_AVCTYPE avc_param;
+ memcpy(&avc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_AVCTYPE));
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc");
- if(handle->venc_set_param(paramData,OMX_IndexParamVideoAvc) != true)
+
+ if((pParam->eProfile == OMX_VIDEO_AVCProfileHigh)||
+ (pParam->eProfile == OMX_VIDEO_AVCProfileMain))
+ {
+#ifdef MAX_RES_1080P
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+ avc_param.nBFrames = 1;
+ }
+ if(pParam->nRefFrames != 2)
+ {
+ DEBUG_PRINT_ERROR("Warning: 2 RefFrames are needed, changing RefFrames from %d to 2", pParam->nRefFrames);
+ avc_param.nRefFrames = 2;
+ }
+#else
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+ avc_param.nBFrames = 0;
+ }
+ if(pParam->nRefFrames != 1)
+ {
+ DEBUG_PRINT_ERROR("Warning: Only 1 RefFrame is supported, changing RefFrame from %d to 1)", pParam->nRefFrames);
+ avc_param.nRefFrames = 1;
+ }
+#endif
+ }
+ else
+ {
+ if(pParam->nRefFrames != 1)
+ {
+ DEBUG_PRINT_ERROR("Warning: Only 1 RefFrame is supported, changing RefFrame from %d to 1)", pParam->nRefFrames);
+ avc_param.nRefFrames = 1;
+ }
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+ avc_param.nBFrames = 0;
+ }
+ }
+ if(handle->venc_set_param(&avc_param,OMX_IndexParamVideoAvc) != true)
{
return OMX_ErrorUnsupportedSetting;
}
- //.. more than one variable storing the npframes,profile,level details
- m_sParamAVC.nPFrames = pParam->nPFrames;
- m_sParamAVC.eProfile = pParam->eProfile;
- m_sParamAVC.eLevel = pParam->eLevel;
-
- m_sParamProfileLevel.eProfile = pParam->eProfile;
- m_sParamProfileLevel.eLevel = pParam->eLevel;
+ memcpy(&m_sParamAVC,pParam, sizeof(struct OMX_VIDEO_PARAM_AVCTYPE));
break;
}
case OMX_IndexParamVideoProfileLevelCurrent:
{
OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoProfileLevelCurrent");
- if(handle->venc_set_param(paramData,OMX_IndexParamVideoProfileLevelCurrent) != true)
+ if(handle->venc_set_param(pParam,OMX_IndexParamVideoProfileLevelCurrent) != true)
{
+ DEBUG_PRINT_ERROR("set_parameter: OMX_IndexParamVideoProfileLevelCurrent failed for Profile: %d "
+ "Level :%d", pParam->eProfile, pParam->eLevel);
return OMX_ErrorUnsupportedSetting;
}
m_sParamProfileLevel.eProfile = pParam->eProfile;
@@ -641,7 +746,8 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
DEBUG_PRINT_LOW("\n H263 profile = %d, level = %d", m_sParamH263.eProfile,
m_sParamH263.eLevel);
}
- else
+ else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
+ OMX_MAX_STRINGNAME_SIZE))
{
m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)m_sParamProfileLevel.eProfile;
m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)m_sParamProfileLevel.eLevel;
@@ -672,7 +778,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
{
if(!strncmp((char*)comp_role->cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
}
else
{
@@ -684,7 +790,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
{
if(!strncmp((const char*)comp_role->cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char*)m_cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char*)m_cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
}
else
{
@@ -696,7 +802,7 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
{
if(!strncmp((const char*)comp_role->cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE))
{
- strncpy((char*)m_cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
+ strlcpy((char*)m_cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
}
else
{
@@ -806,39 +912,163 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
break;
}
-//#endif //# QCOM_EXT
- case OMX_IndexParamVideoSliceFMO:
+
+ case OMX_IndexParamVideoErrorCorrection:
+ {
+ DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection\n");
+ OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* pParam =
+ (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
+ if(!handle->venc_set_param(paramData, OMX_IndexParamVideoErrorCorrection))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Error Resilience failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ memcpy(&m_sErrorCorrection,pParam, sizeof(m_sErrorCorrection));
+ break;
+ }
+ case OMX_IndexParamVideoIntraRefresh:
{
- DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoSliceFMO\n");
- OMX_VIDEO_PARAM_AVCSLICEFMO *avc_slice_fmo = (OMX_VIDEO_PARAM_AVCSLICEFMO*)paramData;
- if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
- OMX_MAX_STRINGNAME_SIZE) && avc_slice_fmo->nPortIndex == PORT_INDEX_OUT)
+ DEBUG_PRINT_LOW("set_param:OMX_IndexParamVideoIntraRefresh\n");
+ OMX_VIDEO_PARAM_INTRAREFRESHTYPE* pParam =
+ (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
+ if(!handle->venc_set_param(paramData,OMX_IndexParamVideoIntraRefresh))
{
- if(handle->venc_set_param(paramData, OMX_IndexParamVideoSliceFMO) != true)
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra refresh failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ memcpy(&m_sIntraRefresh, pParam, sizeof(m_sIntraRefresh));
+ break;
+ }
+#ifdef _ANDROID_ICS_
+ case OMX_QcomIndexParamVideoEncodeMetaBufferMode:
+ {
+ StoreMetaDataInBuffersParams *pParam =
+ (StoreMetaDataInBuffersParams*)paramData;
+ if(pParam->nPortIndex == PORT_INDEX_IN)
+ {
+ if(pParam->bStoreMetaData != meta_mode_enable)
{
- return OMX_ErrorUnsupportedSetting;
+ if(!handle->venc_set_meta_mode(pParam->bStoreMetaData))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: set Metabuffer mode %d fail",
+ pParam->bStoreMetaData);
+ return OMX_ErrorUnsupportedSetting;
+ }
+ meta_mode_enable = pParam->bStoreMetaData;
+ if(meta_mode_enable) {
+ m_sInPortDef.nBufferCountActual = 32;
+ m_sInPortDef.nBufferCountMin = 32;
+ if(handle->venc_set_param(&m_sInPortDef,OMX_IndexParamPortDefinition) != true)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: venc_set_param input failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ } else {
+ /*TODO: reset encoder driver Meta mode*/
+ dev_get_buf_req (&m_sOutPortDef.nBufferCountMin,
+ &m_sOutPortDef.nBufferCountActual,
+ &m_sOutPortDef.nBufferSize,
+ m_sOutPortDef.nPortIndex);
+ }
+ }
+ }
+ break;
+ }
+#endif
+#ifndef MAX_RES_720P
+ case OMX_QcomIndexParamIndexExtraDataType:
+ {
+ DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamIndexExtraDataType");
+ QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
+ if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo)
+ {
+ if (pParam->nPortIndex == PORT_INDEX_OUT)
+ {
+ if (pParam->bEnabled == OMX_TRUE)
+ m_sExtraData |= VEN_EXTRADATA_SLICEINFO;
+ else
+ m_sExtraData &= ~VEN_EXTRADATA_SLICEINFO;
+ DEBUG_PRINT_HIGH("set_param: m_sExtraData=%x", m_sExtraData);
+ if(handle->venc_set_param(&m_sExtraData,
+ (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) != true)
+ {
+ DEBUG_PRINT_ERROR("ERROR: Setting "
+ "OMX_QcomIndexParamIndexExtraDataType failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ else
+ {
+ m_sOutPortDef.nPortIndex = PORT_INDEX_OUT;
+ dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
+ &m_sOutPortDef.nBufferCountActual,
+ &m_sOutPortDef.nBufferSize,
+ m_sOutPortDef.nPortIndex);
+ DEBUG_PRINT_HIGH("updated out_buf_req: buffer cnt=%d, "
+ "count min=%d, buffer size=%d",
+ m_sOutPortDef.nBufferCountActual,
+ m_sOutPortDef.nBufferCountMin,
+ m_sOutPortDef.nBufferSize);
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("set_parameter: slice information is "
+ "valid for output port only");
+ eRet = OMX_ErrorUnsupportedIndex;
}
- m_sAVCSliceFMO.eSliceMode = avc_slice_fmo->eSliceMode;
}
else
{
- DEBUG_PRINT_ERROR("\nERROR: Unsupported codec type/port Index for AVCSliceFMO setting\n");
- eRet = OMX_ErrorBadPortIndex;
+ DEBUG_PRINT_ERROR("set_parameter: unsupported index (%x), "
+ "only slice information extradata is supported", pParam->nIndex);
+ eRet = OMX_ErrorUnsupportedIndex;
}
break;
}
- case OMX_IndexParamVideoErrorCorrection:
+#endif
+ case OMX_QcomIndexParamVideoMaxAllowedBitrateCheck:
{
- DEBUG_PRINT_ERROR("ERROR: OMX_IndexParamVideoErrorCorrection unsupported\n");
- eRet = OMX_ErrorUnsupportedIndex;
+ QOMX_EXTNINDEX_PARAMTYPE* pParam =
+ (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+ if(pParam->nPortIndex == PORT_INDEX_OUT)
+ {
+ handle->m_max_allowed_bitrate_check =
+ ((pParam->bEnable == OMX_TRUE) ? true : false);
+ DEBUG_PRINT_HIGH("set_parameter: max allowed bitrate check %s",
+ ((pParam->bEnable == OMX_TRUE) ? "enabled" : "disabled"));
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexParamVideoMaxAllowedBitrateCheck "
+ " called on wrong port(%d)", pParam->nPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
break;
}
- case OMX_IndexParamVideoIntraRefresh:
+#ifdef MAX_RES_1080P
+ case OMX_QcomIndexEnableSliceDeliveryMode:
{
- DEBUG_PRINT_ERROR("ERROR: OMX_IndexParamVideoIntraRefresh unsupported\n");
- eRet = OMX_ErrorUnsupportedIndex;
+ QOMX_EXTNINDEX_PARAMTYPE* pParam =
+ (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+ if(pParam->nPortIndex == PORT_INDEX_OUT)
+ {
+ if(!handle->venc_set_param(paramData,
+ (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode))
+ {
+ DEBUG_PRINT_ERROR("ERROR: Request for setting slice delivery mode failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableSliceDeliveryMode "
+ "called on wrong port(%d)", pParam->nPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
break;
}
+#endif
+ case OMX_IndexParamVideoSliceFMO:
default:
{
DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %d\n", paramIndex);
@@ -849,6 +1079,45 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
return eRet;
}
+bool omx_venc::update_profile_level()
+{
+ OMX_U32 eProfile, eLevel;
+
+ if(!handle->venc_get_profile_level(&eProfile,&eLevel))
+ {
+ DEBUG_PRINT_ERROR("\nFailed to update the profile_level\n");
+ return false;
+ }
+
+ m_sParamProfileLevel.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
+ m_sParamProfileLevel.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
+
+ if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\
+ OMX_MAX_STRINGNAME_SIZE))
+ {
+ m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
+ m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
+ DEBUG_PRINT_LOW("\n MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
+ m_sParamMPEG4.eLevel);
+ }
+ else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
+ OMX_MAX_STRINGNAME_SIZE))
+ {
+ m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)eProfile;
+ m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel;
+ DEBUG_PRINT_LOW("\n H263 profile = %d, level = %d", m_sParamH263.eProfile,
+ m_sParamH263.eLevel);
+ }
+ else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
+ OMX_MAX_STRINGNAME_SIZE))
+ {
+ m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)eProfile;
+ m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)eLevel;
+ DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile,
+ m_sParamAVC.eLevel);
+ }
+ return true;
+}
/* ======================================================================
FUNCTION
omx_video::SetConfig
@@ -932,6 +1201,59 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
break;
}
+ case QOMX_IndexConfigVideoIntraperiod:
+ {
+ QOMX_VIDEO_INTRAPERIODTYPE* pParam =
+ reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
+
+ if(pParam->nPortIndex == PORT_INDEX_OUT)
+ {
+#ifdef MAX_RES_720P
+ if(pParam->nBFrames > 0)
+ {
+ DEBUG_PRINT_ERROR("B frames not supported\n");
+ return OMX_ErrorUnsupportedSetting;
+ }
+#endif
+ if(handle->venc_set_config(configData, (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod) != true)
+ {
+ DEBUG_PRINT_ERROR("ERROR: Setting QOMX_IndexConfigVideoIntraperiod failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ m_sIntraperiod.nPFrames = pParam->nPFrames;
+ m_sIntraperiod.nBFrames = pParam->nBFrames;
+ m_sIntraperiod.nIDRPeriod = pParam->nIDRPeriod;
+
+ if(m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingMPEG4)
+ {
+ m_sParamMPEG4.nPFrames = pParam->nPFrames;
+ if(m_sParamMPEG4.eProfile != OMX_VIDEO_MPEG4ProfileSimple)
+ m_sParamMPEG4.nBFrames = pParam->nBFrames;
+ else
+ m_sParamMPEG4.nBFrames = 0;
+ }
+ else if(m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingH263)
+ {
+ m_sParamH263.nPFrames = pParam->nPFrames;
+ }
+ else
+ {
+ m_sParamAVC.nPFrames = pParam->nPFrames;
+ if(m_sParamAVC.eProfile != OMX_VIDEO_AVCProfileBaseline)
+ m_sParamAVC.nBFrames = pParam->nBFrames;
+ else
+ m_sParamAVC.nBFrames = 0;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: (QOMX_IndexConfigVideoIntraperiod) Unsupported port index: %u", pParam->nPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
+
+ break;
+ }
+
case OMX_IndexConfigVideoIntraVOPRefresh:
{
OMX_CONFIG_INTRAREFRESHVOPTYPE* pParam =
@@ -958,7 +1280,65 @@ OMX_ERRORTYPE omx_venc::set_config(OMX_IN OMX_HANDLETYPE hComp,
}
case OMX_IndexConfigCommonRotate:
{
- DEBUG_PRINT_ERROR("ERROR: OMX_IndexConfigCommonRotate is currently unsupported");
+ OMX_CONFIG_ROTATIONTYPE *pParam =
+ reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
+ OMX_S32 nRotation;
+
+ if(pParam->nPortIndex != PORT_INDEX_IN){
+ DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", pParam->nPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
+ if( pParam->nRotation == 0 ||
+ pParam->nRotation == 90 ||
+ pParam->nRotation == 180 ||
+ pParam->nRotation == 270 ) {
+ DEBUG_PRINT_HIGH("\nset_config: Rotation Angle %u", pParam->nRotation);
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: un supported Rotation %u", pParam->nRotation);
+ return OMX_ErrorUnsupportedSetting;
+ }
+ nRotation = pParam->nRotation - m_sConfigFrameRotation.nRotation;
+ if(nRotation < 0)
+ nRotation = -nRotation;
+ if(nRotation == 90 || nRotation == 270) {
+ DEBUG_PRINT_HIGH("\nset_config: updating device Dims");
+ if(handle->venc_set_config(configData,
+ OMX_IndexConfigCommonRotate) != true) {
+ DEBUG_PRINT_ERROR("ERROR: Set OMX_IndexConfigCommonRotate failed");
+ return OMX_ErrorUnsupportedSetting;
+ } else {
+ OMX_U32 nFrameWidth;
+
+ DEBUG_PRINT_HIGH("\nset_config: updating port Dims");
+
+ nFrameWidth = m_sInPortDef.format.video.nFrameWidth;
+ m_sInPortDef.format.video.nFrameWidth =
+ m_sInPortDef.format.video.nFrameHeight;
+ m_sInPortDef.format.video.nFrameHeight = nFrameWidth;
+
+ m_sOutPortDef.format.video.nFrameWidth =
+ m_sInPortDef.format.video.nFrameWidth;
+ m_sOutPortDef.format.video.nFrameHeight =
+ m_sInPortDef.format.video.nFrameHeight;
+ m_sConfigFrameRotation.nRotation = pParam->nRotation;
+ }
+ } else {
+ m_sConfigFrameRotation.nRotation = pParam->nRotation;
+ }
+ break;
+ }
+ case OMX_QcomIndexConfigVideoFramePackingArrangement:
+ {
+ if(m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingAVC)
+ {
+ OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
+ (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
+ extra_data_handle.set_frame_pack_data(configFmt);
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: FramePackingData not supported for non AVC compression");
+ }
break;
}
default:
@@ -1004,7 +1384,11 @@ OMX_ERRORTYPE omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
}
/*Check if the input buffers have to be cleaned up*/
- if(m_inp_mem_ptr)
+ if(m_inp_mem_ptr
+#ifdef _ANDROID_ICS_
+ && !meta_mode_enable
+#endif
+ )
{
DEBUG_PRINT_LOW("Freeing the Input Memory\n");
for(i=0; i<m_sInPortDef.nBufferCountActual; i++ )
@@ -1064,9 +1448,19 @@ OMX_U32 omx_venc::dev_resume(void)
return handle->venc_resume();
}
-bool omx_venc::dev_use_buf(void *buf_addr,unsigned port)
+OMX_U32 omx_venc::dev_start_done(void)
{
- return handle->venc_use_buf(buf_addr,port);
+ return handle->venc_start_done();
+}
+
+OMX_U32 omx_venc::dev_stop_done(void)
+{
+ return handle->venc_stop_done();
+}
+
+bool omx_venc::dev_use_buf(void *buf_addr,unsigned port,unsigned index)
+{
+ return handle->venc_use_buf(buf_addr,port,index);
}
bool omx_venc::dev_free_buf(void *buf_addr,unsigned port)
@@ -1074,16 +1468,40 @@ bool omx_venc::dev_free_buf(void *buf_addr,unsigned port)
return handle->venc_free_buf(buf_addr,port);
}
-bool omx_venc::dev_empty_buf(void *buffer, void *pmem_data_buf)
+bool omx_venc::dev_empty_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
{
- return handle->venc_empty_buf(buffer, pmem_data_buf);
+ return handle->venc_empty_buf(buffer, pmem_data_buf,index,fd);
}
-bool omx_venc::dev_fill_buf(void *buffer, void *pmem_data_buf)
+bool omx_venc::dev_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
{
- return handle->venc_fill_buf(buffer, pmem_data_buf);
+ return handle->venc_fill_buf(buffer, pmem_data_buf,index,fd);
}
+bool omx_venc::dev_get_seq_hdr(void *buffer, unsigned size, unsigned *hdrlen)
+{
+ return handle->venc_get_seq_hdr(buffer, size, hdrlen);
+}
+
+bool omx_venc::dev_loaded_start()
+{
+ return handle->venc_loaded_start();
+}
+
+bool omx_venc::dev_loaded_stop()
+{
+ return handle->venc_loaded_stop();
+}
+
+bool omx_venc::dev_loaded_start_done()
+{
+ return handle->venc_loaded_start_done();
+}
+
+bool omx_venc::dev_loaded_stop_done()
+{
+ return handle->venc_loaded_stop_done();
+}
bool omx_venc::dev_get_buf_req(OMX_U32 *min_buff_count,
OMX_U32 *actual_buff_count,
@@ -1177,7 +1595,9 @@ int omx_venc::async_message_process (void *context, void* message)
omxhdr = NULL;
m_sVenc_msg->statuscode = VEN_S_EFAIL;
}
-
+#ifdef _ANDROID_ICS_
+ omx->omx_release_meta_buffer(omxhdr);
+#endif
omx->post_event ((unsigned int)omxhdr,m_sVenc_msg->statuscode,
OMX_COMPONENT_GENERATE_EBD);
break;
diff --git a/mm-video/vidc/venc/src/video_encoder_device.cpp b/mm-video/vidc/venc/src/video_encoder_device.cpp
index 33d57174..6e9b63ce 100644..100755
--- a/mm-video/vidc/venc/src/video_encoder_device.cpp
+++ b/mm-video/vidc/venc/src/video_encoder_device.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -27,40 +27,44 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------*/
#include<string.h>
#include <sys/ioctl.h>
+#include <sys/prctl.h>
#include<unistd.h>
#include <fcntl.h>
#include "video_encoder_device.h"
#include "omx_video_encoder.h"
+#include <linux/android_pmem.h>
+#ifdef USE_ION
+#include <ion_msm.h>
+#endif
#define MPEG4_SP_START 0
#define MPEG4_ASP_START (MPEG4_SP_START + 8)
#define MPEG4_720P_LEVEL 6
#define H263_BP_START 0
#define H264_BP_START 0
-#define H264_HP_START (H264_BP_START + 11)
-#define H264_MP_START (H264_BP_START + 21)
+#define H264_HP_START (H264_BP_START + 13)
+#define H264_MP_START (H264_BP_START + 26)
/* MPEG4 profile and level table*/
static const unsigned int mpeg4_profile_level_table[][5]=
{
/*max mb per frame, max mb per sec, max bitrate, level, profile*/
{99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
- {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
+ {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
{396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
{396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
{1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
{1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
- {3600,108000,14000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
+ {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
{0,0,0,0,0},
- {99,2970,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
- {99,2970,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
{396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
{396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
{792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
{1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
- {3600,108000,14000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
- {0,0,0,0,0}
+ {0,0,0,0,0},
};
/* H264 profile and level table*/
@@ -77,6 +81,8 @@ static const unsigned int h264_profile_level_table[][5]=
{1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
{1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
{3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
+ {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
+ {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
{0,0,0,0,0},
{99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
@@ -89,19 +95,24 @@ static const unsigned int h264_profile_level_table[][5]=
{1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
{1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
{3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
+ {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
+ {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
{0,0,0,0,0},
{99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
- {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
- {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
- {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
- {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
- {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
- {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
- {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
- {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
- {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
+ {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
+ {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
+ {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
+ {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
+ {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
+ {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
+ {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
+ {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
+ {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
+ {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
+ {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
{0,0,0,0,0}
+
};
/* H263 profile and level table*/
@@ -119,16 +130,33 @@ static const unsigned int h263_profile_level_table[][5]=
{0,0,0,0,0}
};
+#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } }
+#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); }
+
+#ifdef INPUT_BUFFER_LOG
+FILE *inputBufferFile1;
+char inputfilename [] = "/data/input.yuv";
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+FILE *outputBufferFile1;
+char outputfilename [] = "/data/output-bitstream.\0\0\0\0";
+#endif
//constructor
-venc_dev::venc_dev()
+venc_dev::venc_dev(class omx_venc *venc_class)
{
-//nothing to do
-
+ m_max_allowed_bitrate_check = false;
+ m_eLevel = 0;
+ m_eProfile = 0;
+ pthread_mutex_init(&loaded_start_stop_mlock, NULL);
+ pthread_cond_init (&loaded_start_stop_cond, NULL);
+ DEBUG_PRINT_LOW("venc_dev constructor");
}
venc_dev::~venc_dev()
{
- //nothing to do
+ pthread_cond_destroy(&loaded_start_stop_cond);
+ pthread_mutex_destroy(&loaded_start_stop_mlock);
+ DEBUG_PRINT_LOW("venc_dev distructor");
}
void* async_venc_message_thread (void *input)
@@ -136,28 +164,31 @@ void* async_venc_message_thread (void *input)
struct venc_ioctl_msg ioctl_msg ={NULL,NULL};
struct venc_timeout timeout;
struct venc_msg venc_msg;
+ int error_code = 0;
omx_venc *omx = reinterpret_cast<omx_venc*>(input);
+ prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
timeout.millisec = VEN_TIMEOUT_INFINITE;
while(1)
{
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = (void*)&venc_msg;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&venc_msg;
/*Wait for a message from the video decoder driver*/
- if(ioctl(omx->handle->m_nDriver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,(void *)&ioctl_msg) < 0)
+ error_code = ioctl(omx->handle->m_nDriver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,(void *)&ioctl_msg);
+ if (error_code == -512) // ERESTARTSYS
{
- DEBUG_PRINT_ERROR("\nioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed/stopped");
- break;
+ DEBUG_PRINT_ERROR("\n ERESTARTSYS received in ioctl read next msg!");
}
- else
+ else if (error_code <0)
+ {
+ DEBUG_PRINT_ERROR("\nioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed");
+ break;
+ }
+ else if(omx->async_message_process(input,&venc_msg) < 0)
{
- /*Call Instance specific process function*/
- if(omx->async_message_process(input,&venc_msg) < 0)
- {
DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
break;
- }
}
}
DEBUG_PRINT_HIGH("omx_venc: Async Thread exit\n");
@@ -184,6 +215,21 @@ bool venc_dev::venc_open(OMX_U32 codec)
}
DEBUG_PRINT_LOW("\nm_nDriver_fd = %d\n", m_nDriver_fd);
+#ifdef SINGLE_ENCODER_INSTANCE
+ OMX_U32 num_instances = 0;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = &num_instances;
+ if(ioctl (m_nDriver_fd, VEN_IOCTL_GET_NUMBER_INSTANCES, (void*)&ioctl_msg) < 0 )
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request number of encoder instances failed");
+ }
+ else if (num_instances > 1)
+ {
+ DEBUG_PRINT_ERROR("\nSecond encoder instance rejected!");
+ venc_close();
+ return false;
+ }
+#endif
// set the basic configuration of the video encoder driver
m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
@@ -192,43 +238,61 @@ bool venc_dev::venc_open(OMX_U32 codec)
m_sVenc_cfg.fps_num = 30;
m_sVenc_cfg.fps_den = 1;
m_sVenc_cfg.targetbitrate = 64000;
+#ifdef MAX_RES_1080P
+ m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+#else
m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12;
+#endif
if(codec == OMX_VIDEO_CodingMPEG4)
{
m_sVenc_cfg.codectype = VEN_CODEC_MPEG4;
codec_profile.profile = VEN_PROFILE_MPEG4_SP;
profile_level.level = VEN_LEVEL_MPEG4_2;
+#ifdef OUTPUT_BUFFER_LOG
+ strcat(outputfilename, "m4v");
+#endif
}
else if(codec == OMX_VIDEO_CodingH263)
{
m_sVenc_cfg.codectype = VEN_CODEC_H263;
codec_profile.profile = VEN_PROFILE_H263_BASELINE;
profile_level.level = VEN_LEVEL_H263_20;
+#ifdef OUTPUT_BUFFER_LOG
+ strcat(outputfilename, "263");
+#endif
}
if(codec == OMX_VIDEO_CodingAVC)
{
m_sVenc_cfg.codectype = VEN_CODEC_H264;
codec_profile.profile = VEN_PROFILE_H264_BASELINE;
profile_level.level = VEN_LEVEL_H264_1p1;
+#ifdef OUTPUT_BUFFER_LOG
+ strcat(outputfilename, "264");
+#endif
}
- ioctl_msg.inputparam = (void*)&m_sVenc_cfg;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&m_sVenc_cfg;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0 )
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting base configuration failed");
return false;
}
-
+#ifdef INPUT_BUFFER_LOG
+ inputBufferFile1 = fopen (inputfilename, "ab");
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+ outputBufferFile1 = fopen (outputfilename, "ab");
+#endif
// Get the I/P and O/P buffer requirements
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = (void*)&m_sInput_buff_property;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&m_sInput_buff_property;
if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
return false;
}
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = (void*)&m_sOutput_buff_property;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&m_sOutput_buff_property;
if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
@@ -242,7 +306,7 @@ bool venc_dev::venc_open(OMX_U32 codec)
DEBUG_PRINT_HIGH("\n %s(): Init Profile/Level setting success",
__func__);
}
-
+ recon_buffers_count = MAX_RECON_BUFFERS;
return true;
}
@@ -258,6 +322,12 @@ void venc_dev::venc_close()
close(m_nDriver_fd);
m_nDriver_fd = -1;
}
+#ifdef INPUT_BUFFER_LOG
+ fclose (inputBufferFile1);
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+ fclose (outputBufferFile1);
+#endif
}
bool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
@@ -274,8 +344,8 @@ bool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
{
temp_count = m_sInput_buff_property.actualcount;
m_sInput_buff_property.actualcount = *actual_buff_count;
- ioctl_msg.inputparam = (void*)&m_sInput_buff_property;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&m_sInput_buff_property;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirement failed");
@@ -291,8 +361,8 @@ bool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
{
temp_count = m_sOutput_buff_property.actualcount;
m_sOutput_buff_property.actualcount = *actual_buff_count;
- ioctl_msg.inputparam = (void*)&m_sOutput_buff_property;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&m_sOutput_buff_property;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer requirement failed");
@@ -307,6 +377,125 @@ bool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
}
+bool venc_dev::venc_loaded_start()
+{
+ struct timespec ts;
+ int status = 0;
+ if(ioctl (m_nDriver_fd,VEN_IOCTL_CMD_START, NULL) < 0)
+ {
+ DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_START failed");
+ return false;
+ }
+ if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
+ {
+ DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
+ return false;
+ }
+ ts.tv_sec += 1;
+ pthread_mutex_lock(&loaded_start_stop_mlock);
+ DEBUG_PRINT_LOW("%s: wait on start done", __func__);
+ status = pthread_cond_timedwait(&loaded_start_stop_cond,
+ &loaded_start_stop_mlock, &ts);
+ if (status != 0)
+ {
+ DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
+ status, strerror(status));
+ pthread_mutex_unlock(&loaded_start_stop_mlock);
+ return false;
+ }
+ DEBUG_PRINT_LOW("%s: wait over on start done", __func__);
+ pthread_mutex_unlock(&loaded_start_stop_mlock);
+ DEBUG_PRINT_LOW("%s: venc_loaded_start success", __func__);
+ return true;
+}
+
+bool venc_dev::venc_loaded_stop()
+{
+ struct timespec ts;
+ int status = 0;
+ if(ioctl (m_nDriver_fd,VEN_IOCTL_CMD_STOP, NULL) < 0)
+ {
+ DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_STOP failed");
+ return false;
+ }
+ if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
+ {
+ DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
+ return false;
+ }
+ ts.tv_sec += 1;
+ pthread_mutex_lock(&loaded_start_stop_mlock);
+ DEBUG_PRINT_LOW("%s: wait on stop done", __func__);
+ status = pthread_cond_timedwait(&loaded_start_stop_cond,
+ &loaded_start_stop_mlock, &ts);
+ if (status != 0)
+ {
+ DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
+ status, strerror(status));
+ pthread_mutex_unlock(&loaded_start_stop_mlock);
+ return false;
+ }
+ DEBUG_PRINT_LOW("%s: wait over on stop done", __func__);
+ pthread_mutex_unlock(&loaded_start_stop_mlock);
+ DEBUG_PRINT_LOW("%s: venc_loaded_stop success", __func__);
+ return true;
+}
+
+bool venc_dev::venc_loaded_start_done()
+{
+ pthread_mutex_lock(&loaded_start_stop_mlock);
+ DEBUG_PRINT_LOW("%s: signal start done", __func__);
+ pthread_cond_signal(&loaded_start_stop_cond);
+ pthread_mutex_unlock(&loaded_start_stop_mlock);
+ return true;
+}
+
+bool venc_dev::venc_loaded_stop_done()
+{
+ pthread_mutex_lock(&loaded_start_stop_mlock);
+ DEBUG_PRINT_LOW("%s: signal stop done", __func__);
+ pthread_cond_signal(&loaded_start_stop_cond);
+ pthread_mutex_unlock(&loaded_start_stop_mlock);
+ return true;
+}
+
+bool venc_dev::venc_get_seq_hdr(void *buffer,
+ unsigned buffer_size, unsigned *header_len)
+{
+ struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
+ int i = 0;
+ DEBUG_PRINT_HIGH("venc_dev::venc_get_seq_hdr");
+ venc_seqheader seq_in, seq_out;
+ seq_in.hdrlen = 0;
+ seq_in.bufsize = buffer_size;
+ seq_in.hdrbufptr = (unsigned char*)buffer;
+ if (seq_in.hdrbufptr == NULL) {
+ DEBUG_PRINT_ERROR("ERROR: malloc for sequence header failed");
+ return false;
+ }
+ DEBUG_PRINT_LOW("seq_in: buf=%x, sz=%d, hdrlen=%d", seq_in.hdrbufptr,
+ seq_in.bufsize, seq_in.hdrlen);
+
+ ioctl_msg.in = (void*)&seq_in;
+ ioctl_msg.out = (void*)&seq_out;
+ if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_SEQUENCE_HDR,(void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("ERROR: Request for getting sequence header failed");
+ return false;
+ }
+ if (seq_out.hdrlen == 0) {
+ DEBUG_PRINT_ERROR("ERROR: Seq header returned zero length header");
+ DEBUG_PRINT_ERROR("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
+ seq_out.bufsize, seq_out.hdrlen);
+ return false;
+ }
+ *header_len = seq_out.hdrlen;
+ DEBUG_PRINT_LOW("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
+ seq_out.bufsize, seq_out.hdrlen);
+
+ return true;
+}
+
bool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
unsigned long *actual_buff_count,
unsigned long *buff_size,
@@ -316,8 +505,8 @@ bool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
if(port == 0)
{
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = (void*)&m_sInput_buff_property;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&m_sInput_buff_property;
if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
@@ -325,13 +514,19 @@ bool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
}
*min_buff_count = m_sInput_buff_property.mincount;
*actual_buff_count = m_sInput_buff_property.actualcount;
- *buff_size = m_sInput_buff_property.datasize
- + (m_sInput_buff_property.datasize % m_sInput_buff_property.alignment) ;
+#ifdef USE_ION
+ // For ION memory allocations of the allocated buffer size
+ // must be 4k aligned, hence aligning the input buffer
+ // size to 4k.
+ m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095)
+ & (~4095);
+#endif
+ *buff_size = m_sInput_buff_property.datasize;
}
else
{
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = (void*)&m_sOutput_buff_property;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&m_sOutput_buff_property;
if(ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
@@ -339,8 +534,7 @@ bool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
}
*min_buff_count = m_sOutput_buff_property.mincount;
*actual_buff_count = m_sOutput_buff_property.actualcount;
- *buff_size = m_sOutput_buff_property.datasize
- + (m_sOutput_buff_property.datasize % m_sOutput_buff_property.alignment) ;
+ *buff_size = m_sOutput_buff_property.datasize;
}
return true;
@@ -350,7 +544,6 @@ bool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
{
venc_ioctl_msg ioctl_msg = {NULL,NULL};
- OMX_U32 temp_out_buf_count = 0;
DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
switch(index)
{
@@ -361,6 +554,12 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition\n");
if(portDefn->nPortIndex == PORT_INDEX_IN)
{
+
+ if(!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0))
+ {
+ return false;
+ }
+
if(!venc_set_color_format(portDefn->format.video.eColorFormat))
{
return false;
@@ -372,9 +571,8 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
- temp_out_buf_count = m_sOutput_buff_property.actualcount;
- ioctl_msg.inputparam = (void*)&m_sVenc_cfg;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&m_sVenc_cfg;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting base config failed");
@@ -382,8 +580,8 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
}
DEBUG_PRINT_LOW("\n Updating the buffer count/size for the new resolution");
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = (void*)&m_sInput_buff_property;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&m_sInput_buff_property;
if(ioctl (m_nDriver_fd, VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p bufreq failed");
@@ -395,8 +593,8 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
m_sInput_buff_property.maxcount, m_sInput_buff_property.actualcount,
m_sInput_buff_property.mincount);
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = (void*)&m_sOutput_buff_property;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&m_sOutput_buff_property;
if(ioctl (m_nDriver_fd, VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p bufreq failed");
@@ -408,12 +606,9 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
"mincount = %u", m_sOutput_buff_property.datasize,
m_sOutput_buff_property.maxcount, m_sOutput_buff_property.actualcount,
m_sOutput_buff_property.mincount);
+ ioctl_msg.in = (void*)&m_sOutput_buff_property;
+ ioctl_msg.out = NULL;
- if(temp_out_buf_count < 7)
- temp_out_buf_count = 7;
- m_sOutput_buff_property.actualcount = temp_out_buf_count;
- ioctl_msg.inputparam = (void*)&m_sOutput_buff_property;
- ioctl_msg.outputparam = NULL;
if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p bufreq failed");
@@ -424,8 +619,8 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
(portDefn->nBufferCountActual <= m_sInput_buff_property.maxcount))
{
m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
- ioctl_msg.inputparam = (void*)&m_sInput_buff_property;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&m_sInput_buff_property;
+ ioctl_msg.out = NULL;
if(ioctl(m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirements failed");
@@ -441,19 +636,18 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
m_level_set = false;
if(venc_set_profile_level(0, 0))
{
- DEBUG_PRINT_HIGH("\n %s(): Dynamic Profile/Level setting success",
- __func__);
+ DEBUG_PRINT_HIGH("\n %s(): Profile/Level setting success", __func__);
}
}
else
{
if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
- (m_sInput_buff_property.actualcount <= portDefn->nBufferCountActual) &&
+ (m_sInput_buff_property.maxcount >= portDefn->nBufferCountActual) &&
(m_sInput_buff_property.datasize == portDefn->nBufferSize))
{
m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
- ioctl_msg.inputparam = (void*)&m_sInput_buff_property;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&m_sInput_buff_property;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_INPUT_BUFFER_REQ failed");
@@ -469,26 +663,21 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
}
else if(portDefn->nPortIndex == PORT_INDEX_OUT)
{
- if(!venc_set_encode_framerate(portDefn->format.video.xFramerate))
- {
- return false;
- }
-
- if(!venc_set_target_bitrate(portDefn->format.video.nBitrate))
+ if(!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0))
{
return false;
}
if( (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
&&
- (m_sOutput_buff_property.actualcount <= portDefn->nBufferCountActual)
+ (m_sOutput_buff_property.maxcount >= portDefn->nBufferCountActual)
&&
(m_sOutput_buff_property.datasize == portDefn->nBufferSize)
)
{
m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
- ioctl_msg.inputparam = (void*)&m_sOutput_buff_property;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&m_sOutput_buff_property;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_OUTPUT_BUFFER_REQ failed");
@@ -522,7 +711,7 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
}
else if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
{
- if(!venc_set_encode_framerate(portFmt->xFramerate))
+ if(!venc_set_encode_framerate(portFmt->xFramerate, 0))
{
return false;
}
@@ -541,7 +730,7 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
{
- if(!venc_set_target_bitrate(pParam->nTargetBitrate))
+ if(!venc_set_target_bitrate(pParam->nTargetBitrate, 0))
{
DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
return false;
@@ -561,21 +750,52 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
case OMX_IndexParamVideoMpeg4:
{
OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
+ OMX_U32 bFrames = 0;
+
pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
{
- if(!venc_set_intra_period (pParam->nPFrames))
+ if(!venc_set_voptiming_cfg(pParam->nTimeIncRes))
{
- DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
return false;
}
-
m_profile_set = false;
m_level_set = false;
if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
{
- DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
+ DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
+ return false;
+ }
+#ifdef MAX_RES_1080P
+ else {
+ if(pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
+ {
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+ bFrames = 1;
+ }
+ }
+ else
+ {
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+ bFrames = 0;
+ }
+ }
+ }
+#endif
+ if(!venc_set_intra_period (pParam->nPFrames,bFrames))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ return false;
+ }
+ if(!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
return false;
}
}
@@ -589,19 +809,22 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
{
OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
+ OMX_U32 bFrames = 0;
if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
{
- if(venc_set_intra_period (pParam->nPFrames) == false)
+ m_profile_set = false;
+ m_level_set = false;
+ if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
{
- DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
return false;
}
+ if (pParam->nBFrames)
+ DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
- m_profile_set = false;
- m_level_set = false;
- if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
+ if(venc_set_intra_period (pParam->nPFrames, bFrames) == false)
{
- DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
return false;
}
}
@@ -615,21 +838,60 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
{
DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
+ OMX_U32 bFrames = 0;
+
if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
{
- if(venc_set_intra_period (pParam->nPFrames) == false)
- {
- DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
- return false;
- }
DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
pParam->eProfile,pParam->eLevel);
m_profile_set = false;
m_level_set = false;
+
if(!venc_set_profile_level (pParam->eProfile,pParam->eLevel))
{
- DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
+ DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
+ pParam->eProfile, pParam->eLevel);
+ return false;
+ }
+#ifdef MAX_RES_1080P
+ else {
+ if(pParam->eProfile != OMX_VIDEO_AVCProfileBaseline)
+ {
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+ bFrames = 1;
+ }
+ }
+ else
+ {
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+ bFrames = 0;
+ }
+ }
+ }
+#endif
+ if(!venc_set_intra_period (pParam->nPFrames, bFrames))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ return false;
+ }
+ if(!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
+ return false;
+ }
+ if(!venc_set_inloop_filter (pParam->eLoopFilterMode))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
+ return false;
+ }
+ if(!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing))
+ {
+ DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
return false;
}
}
@@ -640,6 +902,44 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
//TBD, lot of other variables to be updated, yet to decide
break;
}
+ case OMX_IndexParamVideoIntraRefresh:
+ {
+ DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
+ OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
+ (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
+ if(intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoErrorCorrection:
+ {
+ DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
+ OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
+ (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
+ if(error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(venc_set_error_resilience(error_resilience) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
+ }
+ break;
+ }
case OMX_IndexParamVideoProfileLevelCurrent:
{
DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
@@ -682,26 +982,39 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
}
break;
}
- case OMX_IndexParamVideoSliceFMO:
+ case OMX_ExtraDataVideoEncoderSliceInfo:
{
- DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoSliceFMO\n");
- OMX_VIDEO_PARAM_AVCSLICEFMO *avc_slice_fmo =
- (OMX_VIDEO_PARAM_AVCSLICEFMO*)paramData;
- DEBUG_PRINT_LOW("\n portindex = %u", avc_slice_fmo->nPortIndex);
- if(avc_slice_fmo->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
- {
- if(venc_set_multislice_cfg(avc_slice_fmo->eSliceMode) == false)
- {
- DEBUG_PRINT_ERROR("\nERROR: Setting Multislice cfg failed");
- return false;
- }
- }
- else
+ DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
+ OMX_U32 extra_data = *(OMX_U32 *)paramData;
+ if(venc_set_extradata(extra_data) == false)
{
- DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for Multislice cfg");
+ DEBUG_PRINT_ERROR("ERROR: Setting "
+ "OMX_QcomIndexParamIndexExtraDataType failed");
+ return false;
}
break;
}
+ case OMX_QcomIndexEnableSliceDeliveryMode:
+ {
+ QOMX_EXTNINDEX_PARAMTYPE* pParam =
+ (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+ if(pParam->nPortIndex == PORT_INDEX_OUT)
+ {
+ if(venc_set_slice_delivery_mode(pParam->bEnable) == false)
+ {
+ DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
+ "called on wrong port(%d)", pParam->nPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
+ case OMX_IndexParamVideoSliceFMO:
default:
DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
index);
@@ -723,10 +1036,16 @@ bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
{
OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
configData;
+ if(m_max_allowed_bitrate_check &&
+ !venc_max_allowed_bitrate_check(bit_rate->nEncodeBitrate))
+ {
+ DEBUG_PRINT_ERROR("Max Allowed Bitrate Check failed");
+ return false;
+ }
DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
if(bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
{
- if(venc_set_target_bitrate(bit_rate->nEncodeBitrate) == false)
+ if(venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false)
{
DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
return false;
@@ -745,7 +1064,7 @@ bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
if(frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
{
- if(venc_set_encode_framerate(frame_rate->xEncodeFramerate) == false)
+ if(venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false)
{
DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
return false;
@@ -757,6 +1076,21 @@ bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
}
break;
}
+ case QOMX_IndexConfigVideoIntraperiod:
+ {
+ DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
+ QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
+ (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
+ if(intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ return false;
+ }
+ }
+ break;
+ }
case OMX_IndexConfigVideoIntraVOPRefresh:
{
OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
@@ -776,6 +1110,25 @@ bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
}
break;
}
+ case OMX_IndexConfigCommonRotate:
+ {
+ OMX_CONFIG_ROTATIONTYPE *config_rotation =
+ reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
+ venc_ioctl_msg ioctl_msg = {NULL,NULL};
+ OMX_U32 nFrameWidth;
+
+ DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
+ nFrameWidth = m_sVenc_cfg.input_width;
+ m_sVenc_cfg.input_width = m_sVenc_cfg.input_height;
+ m_sVenc_cfg.input_height = nFrameWidth;
+ ioctl_msg.in = (void*)&m_sVenc_cfg;
+ ioctl_msg.out = NULL;
+ if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0) {
+ DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
+ return false;
+ }
+ break;
+ }
default:
DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
break;
@@ -786,6 +1139,9 @@ bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
unsigned venc_dev::venc_stop( void)
{
+#ifdef MAX_RES_1080P
+ pmem_free();
+#endif
return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_STOP,NULL);
}
@@ -799,6 +1155,16 @@ unsigned venc_dev::venc_resume(void)
return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_RESUME,NULL) ;
}
+unsigned venc_dev::venc_start_done(void)
+{
+ return 0;
+}
+
+unsigned venc_dev::venc_stop_done(void)
+{
+ return 0;
+}
+
unsigned venc_dev::venc_start(void)
{
DEBUG_PRINT_HIGH("\n %s(): Check Profile/Level set in driver before start",
@@ -814,7 +1180,254 @@ unsigned venc_dev::venc_start(void)
__func__, codec_profile.profile, profile_level.level);
}
- return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
+ if(m_max_allowed_bitrate_check &&
+ !venc_max_allowed_bitrate_check(bitrate.target_bitrate))
+ {
+ DEBUG_PRINT_ERROR("Maximum Allowed Bitrate Check failed");
+ return -1;
+ }
+
+ venc_config_print();
+
+#ifdef MAX_RES_1080P
+ if((codec_profile.profile == VEN_PROFILE_MPEG4_SP) ||
+ (codec_profile.profile == VEN_PROFILE_H264_BASELINE) ||
+ (codec_profile.profile == VEN_PROFILE_H263_BASELINE))
+ recon_buffers_count = MAX_RECON_BUFFERS - 2;
+ else
+ recon_buffers_count = MAX_RECON_BUFFERS;
+
+ if (!venc_allocate_recon_buffers())
+ return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
+ else
+ {
+ DEBUG_PRINT_ERROR("Failed in creating Recon buffers\n");
+ return -1;
+ }
+#else
+ return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
+#endif
+}
+
+#ifdef MAX_RES_1080P
+OMX_U32 venc_dev::venc_allocate_recon_buffers()
+{
+ OMX_U32 yuv_size;
+ struct venc_ioctl_msg ioctl_msg;
+ struct venc_recon_buff_size recon_buff_size;
+
+ recon_buff_size.width = ((m_sVenc_cfg.input_width + 15) / 16) * 16;
+ recon_buff_size.height = ((m_sVenc_cfg.input_height + 15) / 16 ) * 16;
+
+ DEBUG_PRINT_LOW("Width %d, Height %d, w_round %d, h_round %d\n", m_sVenc_cfg.input_width,
+ m_sVenc_cfg.input_height, recon_buff_size.width, recon_buff_size.height);
+
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&recon_buff_size;
+
+ if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_RECON_BUFFER_SIZE, (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("\n VEN_IOCTL_GET_RECON_BUFFER_SIZE Failed for width: %d, Height %d" ,
+ recon_buff_size.width, recon_buff_size.height);
+ return OMX_ErrorInsufficientResources;
+ }
+
+ DEBUG_PRINT_HIGH("Width %d, Height %d, w_round %d, h_round %d, yuv_size %d alignment %d count %d\n",
+ m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, recon_buff_size.width,
+ recon_buff_size.height, recon_buff_size.size, recon_buff_size.alignment,
+ recon_buffers_count);
+
+ for(int i = 0; i < recon_buffers_count; i++)
+ {
+ if(pmem_allocate(recon_buff_size.size, recon_buff_size.alignment,i))
+ {
+ DEBUG_PRINT_ERROR("Error returned in allocating recon buffers\n");
+ return -1;
+ }
+ }
+ return 0;
+}
+OMX_U32 venc_dev::pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count)
+{
+ OMX_U32 pmem_fd = -1;
+ OMX_U32 width, height;
+ void *buf_addr = NULL;
+ struct venc_ioctl_msg ioctl_msg;
+ struct venc_recon_addr recon_addr;
+ int rc = 0;
+
+#ifdef USE_ION
+ recon_buff[count].ion_device_fd = open (MEM_DEVICE,O_RDONLY);
+ if(recon_buff[count].ion_device_fd < 0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: ION Device open() Failed");
+ return -1;
+ }
+
+ recon_buff[count].alloc_data.len = size;
+ recon_buff[count].alloc_data.flags = (ION_HEAP(MEM_HEAP_ID) |
+ ION_HEAP(ION_IOMMU_HEAP_ID));
+ recon_buff[count].alloc_data.align = clip2(alignment);
+ if (recon_buff[count].alloc_data.align != 8192)
+ recon_buff[count].alloc_data.align = 8192;
+
+ rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_ALLOC,&recon_buff[count].alloc_data);
+ if(rc || !recon_buff[count].alloc_data.handle) {
+ DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
+ recon_buff[count].alloc_data.handle=NULL;
+ return -1;
+ }
+
+ recon_buff[count].ion_alloc_fd.handle = recon_buff[count].alloc_data.handle;
+ rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_MAP,&recon_buff[count].ion_alloc_fd);
+ if(rc) {
+ DEBUG_PRINT_ERROR("\n ION MAP failed ");
+ recon_buff[count].ion_alloc_fd.fd =-1;
+ recon_buff[count].ion_alloc_fd.fd =-1;
+ return -1;
+ }
+ pmem_fd = recon_buff[count].ion_alloc_fd.fd;
+#else
+ struct pmem_allocation allocation;
+ pmem_fd = open(MEM_DEVICE, O_RDWR);
+
+ if ((int)(pmem_fd) < 0)
+ {
+ DEBUG_PRINT_ERROR("\n Failed to get an pmem handle");
+ return -1;
+ }
+
+ allocation.size = size;
+ allocation.align = clip2(alignment);
+
+ if (allocation.align != 8192)
+ allocation.align = 8192;
+
+ 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 -1;
+ }
+#endif
+ buf_addr = mmap(NULL, size,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED, pmem_fd, 0);
+
+ if (buf_addr == (void*) MAP_FAILED)
+ {
+ close(pmem_fd);
+ pmem_fd = -1;
+ DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
+#ifdef USE_ION
+ if(ioctl(recon_buff[count].ion_device_fd,ION_IOC_FREE,
+ &recon_buff[count].alloc_data.handle)) {
+ DEBUG_PRINT_ERROR("ion recon buffer free failed");
+ }
+ recon_buff[count].alloc_data.handle = NULL;
+ recon_buff[count].ion_alloc_fd.fd =-1;
+ close(recon_buff[count].ion_device_fd);
+ recon_buff[count].ion_device_fd =-1;
+#endif
+ return -1;
+ }
+
+ DEBUG_PRINT_HIGH("\n Allocated virt:%p, FD: %d of size %d \n", buf_addr, pmem_fd, size);
+
+ recon_addr.buffer_size = size;
+ recon_addr.pmem_fd = pmem_fd;
+ recon_addr.offset = 0;
+ recon_addr.pbuffer = (unsigned char *)buf_addr;
+
+ ioctl_msg.in = (void*)&recon_addr;
+ ioctl_msg.out = NULL;
+
+ if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_RECON_BUFFER, (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("Failed to set the Recon_buffers\n");
+ return -1;
+ }
+
+ recon_buff[count].virtual_address = (unsigned char *) buf_addr;
+ recon_buff[count].size = size;
+ recon_buff[count].offset = 0;
+ recon_buff[count].pmem_fd = pmem_fd;
+
+ DEBUG_PRINT_ERROR("\n Allocated virt:%p, FD: %d of size %d at index: %d\n", recon_buff[count].virtual_address,
+ recon_buff[count].pmem_fd, recon_buff[count].size, count);
+ return 0;
+}
+
+OMX_U32 venc_dev::pmem_free()
+{
+ int cnt = 0;
+ struct venc_ioctl_msg ioctl_msg;
+ struct venc_recon_addr recon_addr;
+ for (cnt = 0; cnt < recon_buffers_count; cnt++)
+ {
+ if(recon_buff[cnt].pmem_fd)
+ {
+ recon_addr.pbuffer = recon_buff[cnt].virtual_address;
+ recon_addr.offset = recon_buff[cnt].offset;
+ recon_addr.pmem_fd = recon_buff[cnt].pmem_fd;
+ recon_addr.buffer_size = recon_buff[cnt].size;
+ ioctl_msg.in = (void*)&recon_addr;
+ ioctl_msg.out = NULL;
+ if(ioctl(m_nDriver_fd, VEN_IOCTL_FREE_RECON_BUFFER ,&ioctl_msg) < 0)
+ DEBUG_PRINT_ERROR("VEN_IOCTL_FREE_RECON_BUFFER failed");
+ munmap(recon_buff[cnt].virtual_address, recon_buff[cnt].size);
+ close(recon_buff[cnt].pmem_fd);
+#ifdef USE_ION
+ if(ioctl(recon_buff[cnt].ion_device_fd,ION_IOC_FREE,
+ &recon_buff[cnt].alloc_data.handle)) {
+ DEBUG_PRINT_ERROR("ion recon buffer free failed");
+ }
+ recon_buff[cnt].alloc_data.handle = NULL;
+ recon_buff[cnt].ion_alloc_fd.fd =-1;
+ close(recon_buff[cnt].ion_device_fd);
+ recon_buff[cnt].ion_device_fd =-1;
+#endif
+ DEBUG_PRINT_LOW("\n cleaning Index %d of size %d \n",cnt,recon_buff[cnt].size);
+ recon_buff[cnt].pmem_fd = -1;
+ recon_buff[cnt].virtual_address = NULL;
+ recon_buff[cnt].offset = 0;
+ recon_buff[cnt].alignment = 0;
+ recon_buff[cnt].size = 0;
+ }
+ }
+ return 0;
+}
+#endif
+
+void venc_dev::venc_config_print()
+{
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %d, Profile %d, level : %d",
+ m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
+
+ DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %d, Height:%d, Fps: %d",
+ m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
+ m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %d, RC: %d, I-Period: %d",
+ bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %d, qpP: %d, qpb: 0",
+ session_qp.iframeqp, session_qp.pframqp);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %d, Slice-Mode: %d, Slize_Size: %d",
+ voptimecfg.voptime_resolution, multislice.mslice_mode,
+ multislice.mslice_size);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %d",
+ entropy.longentropysel, entropy.cabacmodel);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %d, alpha: %d, Beta: %d\n",
+ dbkfilter.db_mode, dbkfilter.slicealpha_offset,
+ dbkfilter.slicebeta_offset);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %d, HEC: %d\n",
+ intra_refresh.mbcount, hec.header_extension);
}
unsigned venc_dev::venc_flush( unsigned port)
@@ -824,17 +1437,19 @@ unsigned venc_dev::venc_flush( unsigned port)
if(port == PORT_INDEX_IN)
{
+ DEBUG_PRINT_HIGH("Calling Input Flush");
buffer_index.flush_mode = VEN_FLUSH_INPUT;
- ioctl_msg.inputparam = (void*)&buffer_index;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&buffer_index;
+ ioctl_msg.out = NULL;
return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
}
else if(port == PORT_INDEX_OUT)
{
+ DEBUG_PRINT_HIGH("Calling Output Flush");
buffer_index.flush_mode = VEN_FLUSH_OUTPUT;
- ioctl_msg.inputparam = (void*)&buffer_index;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&buffer_index;
+ ioctl_msg.out = NULL;
return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
}
else
@@ -846,7 +1461,7 @@ unsigned venc_dev::venc_flush( unsigned port)
//allocating I/P memory from pmem and register with the device
-bool venc_dev::venc_use_buf(void *buf_addr, unsigned port)
+bool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned)
{
struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
struct pmem *pmem_tmp;
@@ -861,10 +1476,10 @@ bool venc_dev::venc_use_buf(void *buf_addr, unsigned port)
dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
dev_buffer.fd = pmem_tmp->fd;
dev_buffer.maped_size = pmem_tmp->size;
- dev_buffer.nsize = pmem_tmp->size;
+ dev_buffer.sz = pmem_tmp->size;
dev_buffer.offset = pmem_tmp->offset;
- ioctl_msg.inputparam = (void*)&dev_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&dev_buffer;
+ ioctl_msg.out = NULL;
DEBUG_PRINT_LOW("\n venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
dev_buffer.pbuffer, \
@@ -882,11 +1497,11 @@ bool venc_dev::venc_use_buf(void *buf_addr, unsigned port)
{
dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
dev_buffer.fd = pmem_tmp->fd;
- dev_buffer.nsize = pmem_tmp->size;
+ dev_buffer.sz = pmem_tmp->size;
dev_buffer.maped_size = pmem_tmp->size;
dev_buffer.offset = pmem_tmp->offset;
- ioctl_msg.inputparam = (void*)&dev_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&dev_buffer;
+ ioctl_msg.out = NULL;
DEBUG_PRINT_LOW("\n venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
dev_buffer.pbuffer, \
@@ -924,10 +1539,10 @@ bool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
dev_buffer.fd = pmem_tmp->fd;
dev_buffer.maped_size = pmem_tmp->size;
- dev_buffer.nsize = pmem_tmp->size;
+ dev_buffer.sz = pmem_tmp->size;
dev_buffer.offset = pmem_tmp->offset;
- ioctl_msg.inputparam = (void*)&dev_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&dev_buffer;
+ ioctl_msg.out = NULL;
DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
dev_buffer.pbuffer, \
@@ -945,11 +1560,11 @@ bool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
{
dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
dev_buffer.fd = pmem_tmp->fd;
- dev_buffer.nsize = pmem_tmp->size;
+ dev_buffer.sz = pmem_tmp->size;
dev_buffer.maped_size = pmem_tmp->size;
dev_buffer.offset = pmem_tmp->offset;
- ioctl_msg.inputparam = (void*)&dev_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&dev_buffer;
+ ioctl_msg.out = NULL;
DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
dev_buffer.pbuffer, \
@@ -972,7 +1587,7 @@ bool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
return true;
}
-bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf)
+bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf,unsigned,unsigned)
{
struct venc_buffer frameinfo;
struct pmem *temp_buffer;
@@ -1000,14 +1615,14 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf)
}
frameinfo.clientdata = (void *) buffer;
- frameinfo.size = bufhdr->nFilledLen;
+ frameinfo.sz = bufhdr->nFilledLen;
frameinfo.len = bufhdr->nFilledLen;
frameinfo.flags = bufhdr->nFlags;
frameinfo.offset = bufhdr->nOffset;
frameinfo.timestamp = bufhdr->nTimeStamp;
DEBUG_PRINT_LOW("\n i/p TS = %u", (OMX_U32)frameinfo.timestamp);
- ioctl_msg.inputparam = &frameinfo;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &frameinfo;
+ ioctl_msg.out = NULL;
DEBUG_PRINT_LOW("DBG: i/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
@@ -1016,10 +1631,49 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf)
/*Generate an async error and move to invalid state*/
return false;
}
+#ifdef INPUT_BUFFER_LOG
+#ifdef MAX_RES_1080P
+
+ int y_size = 0;
+ int c_offset = 0;
+ unsigned char *buf_addr = NULL;
+
+ y_size = m_sVenc_cfg.input_width * m_sVenc_cfg.input_height;
+ //chroma offset is y_size aligned to the 2k boundary
+ c_offset= (y_size + 2047) & (~(2047));
+
+ if(pmem_data_buf)
+ {
+ DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
+ buf_addr = (OMX_U8 *)pmem_data_buf;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
+ buf_addr = (unsigned char *)mmap(NULL,
+ ((encoder_media_buffer_type *)bufhdr->pBuffer)->meta_handle->data[2],
+ PROT_READ|PROT_WRITE, MAP_SHARED,
+ ((encoder_media_buffer_type *)bufhdr->pBuffer)->meta_handle->data[0], 0);
+ }
+ if(inputBufferFile1)
+ {
+ fwrite((const char *)buf_addr, y_size, 1,inputBufferFile1);
+ fwrite((const char *)(buf_addr + c_offset), (y_size>>1), 1,inputBufferFile1);
+ }
+
+ munmap (buf_addr, ((encoder_media_buffer_type *)bufhdr->pBuffer)->meta_handle->data[2]);
+#else
+ if(inputBufferFile1)
+ {
+ fwrite((const char *)frameinfo.ptrbuffer, frameinfo.len, 1,inputBufferFile1);
+ }
+#endif
+
+#endif
return true;
}
-bool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf)
+bool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned,unsigned)
{
struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
struct pmem *temp_buffer = NULL;
@@ -1044,12 +1698,12 @@ bool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf)
}
frameinfo.clientdata = buffer;
- frameinfo.size = bufhdr->nAllocLen;
+ frameinfo.sz = bufhdr->nAllocLen;
frameinfo.flags = bufhdr->nFlags;
frameinfo.offset = bufhdr->nOffset;
- ioctl_msg.inputparam = &frameinfo;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &frameinfo;
+ ioctl_msg.out = NULL;
DEBUG_PRINT_LOW("DBG: o/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
if(ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
@@ -1061,6 +1715,41 @@ bool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf)
return true;
}
+bool venc_dev::venc_set_slice_delivery_mode(OMX_BOOL enable)
+{
+ venc_ioctl_msg ioctl_msg = {NULL,NULL};
+ DEBUG_PRINT_HIGH("Set slice_delivery_mode: %d", enable);
+ if(multislice.mslice_mode == VEN_MSLICE_CNT_MB)
+ {
+ if(ioctl(m_nDriver_fd, VEN_IOCTL_SET_SLICE_DELIVERY_MODE) < 0)
+ {
+ DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("WARNING: slice_mode[%d] is not VEN_MSLICE_CNT_MB to set "
+ "slice delivery mode to the driver.", multislice.mslice_mode);
+ }
+ return true;
+}
+
+bool venc_dev::venc_set_extradata(OMX_U32 extra_data)
+{
+ venc_ioctl_msg ioctl_msg = {NULL,NULL};
+ DEBUG_PRINT_HIGH("venc_set_extradata:: %x", extra_data);
+ ioctl_msg.in = (void*)&extra_data;
+ ioctl_msg.out = NULL;
+ if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_EXTRADATA, (void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("ERROR: Request for setting extradata failed");
+ return false;
+ }
+
+ return true;
+}
+
bool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp)
{
venc_ioctl_msg ioctl_msg = {NULL,NULL};
@@ -1071,8 +1760,8 @@ bool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp)
qp.iframeqp = i_frame_qp;
qp.pframqp = p_frame_qp;
- ioctl_msg.inputparam = (void*)&qp;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&qp;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_SESSION_QP,(void*)&ioctl_msg)< 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting session qp failed");
@@ -1094,13 +1783,22 @@ bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
unsigned long mb_per_frame = 0, mb_per_sec = 0;
DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %d, Level = %d",
eProfile, eLevel);
-
+ mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
+ ((m_sVenc_cfg.input_width + 15) >> 4);
if((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set)
{
DEBUG_PRINT_LOW("\n Profile/Level setting complete before venc_start");
return true;
}
+ if(eProfile && eLevel)
+ {
+ /* non-zero values will be set by user, saving the same*/
+ m_eProfile = eProfile;
+ m_eLevel = eLevel;
+ DEBUG_PRINT_HIGH("Profile/Level set equal to %d/%d",m_eProfile, m_eLevel);
+ }
+
DEBUG_PRINT_LOW("\n Validating Profile/Level from table");
if(!venc_validate_profile_level(&eProfile, &eLevel))
{
@@ -1139,44 +1837,51 @@ bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
"OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
- switch(eLevel)
+ if(mb_per_frame >= 3600)
{
- case OMX_VIDEO_MPEG4Level0:
- requested_level.level = VEN_LEVEL_MPEG4_0;
- break;
- case OMX_VIDEO_MPEG4Level1:
- requested_level.level = VEN_LEVEL_MPEG4_1;
- break;
- case OMX_VIDEO_MPEG4Level2:
- requested_level.level = VEN_LEVEL_MPEG4_2;
- break;
- case OMX_VIDEO_MPEG4Level3:
- requested_level.level = VEN_LEVEL_MPEG4_3;
- break;
- case OMX_VIDEO_MPEG4Level4a:
- requested_level.level = VEN_LEVEL_MPEG4_4;
- break;
- case OMX_VIDEO_MPEG4Level5:
- mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
- ((m_sVenc_cfg.input_width + 15) >> 4);
- mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
-
- if((mb_per_frame >= profile_tbl[0]) &&
- (mb_per_sec >= profile_tbl[1]))
- {
- DEBUG_PRINT_LOW("\nMPEG4 Level 6 is set for 720p resolution");
+ if(requested_profile.profile == VEN_PROFILE_MPEG4_ASP)
+ requested_level.level = VEN_LEVEL_MPEG4_5;
+ if(requested_profile.profile == VEN_PROFILE_MPEG4_SP)
requested_level.level = VEN_LEVEL_MPEG4_6;
- }
- else
+ }
+ else
+ {
+ switch(eLevel)
{
- DEBUG_PRINT_LOW("\nMPEG4 Level 5 is set for non-720p resolution");
- requested_level.level = VEN_LEVEL_MPEG4_5;
+ case OMX_VIDEO_MPEG4Level0:
+ requested_level.level = VEN_LEVEL_MPEG4_0;
+ break;
+ case OMX_VIDEO_MPEG4Level1:
+ requested_level.level = VEN_LEVEL_MPEG4_1;
+ break;
+ case OMX_VIDEO_MPEG4Level2:
+ requested_level.level = VEN_LEVEL_MPEG4_2;
+ break;
+ case OMX_VIDEO_MPEG4Level3:
+ requested_level.level = VEN_LEVEL_MPEG4_3;
+ break;
+ case OMX_VIDEO_MPEG4Level4a:
+ requested_level.level = VEN_LEVEL_MPEG4_4;
+ break;
+ case OMX_VIDEO_MPEG4Level5:
+ mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
+ if((requested_profile.profile == VEN_PROFILE_MPEG4_SP) && (mb_per_frame >= profile_tbl[0]) &&
+ (mb_per_sec >= profile_tbl[1]))
+ {
+ DEBUG_PRINT_LOW("\nMPEG4 Level 6 is set for 720p resolution");
+ requested_level.level = VEN_LEVEL_MPEG4_6;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\nMPEG4 Level 5 is set for non-720p resolution");
+ requested_level.level = VEN_LEVEL_MPEG4_5;
+ }
+ break;
+ default:
+ return false;
+ // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
+ break;
}
- break;
- default:
- return false;
- // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
- break;
}
}
else if(m_sVenc_cfg.codectype == VEN_CODEC_H263)
@@ -1276,19 +1981,26 @@ bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
case OMX_VIDEO_AVCLevel31:
requested_level.level = VEN_LEVEL_H264_3p1;
break;
+ case OMX_VIDEO_AVCLevel32:
+ requested_level.level = VEN_LEVEL_H264_3p2;
+ break;
+ case OMX_VIDEO_AVCLevel4:
+ requested_level.level = VEN_LEVEL_H264_4;
+ break;
default :
+ DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %u",
+ requested_level.level);
return false;
break;
}
}
-
if(!m_profile_set)
{
- ioctl_msg.inputparam = (void*)&requested_profile;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&requested_profile;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_CODEC_PROFILE,(void*)&ioctl_msg)< 0)
{
- DEBUG_PRINT_LOW("\nERROR: Request for setting profile failed");
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting profile failed");
return false;
}
codec_profile.profile = requested_profile.profile;
@@ -1297,11 +2009,11 @@ bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
if(!m_level_set)
{
- ioctl_msg.inputparam = (void*)&requested_level;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&requested_level;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,(void*)&ioctl_msg)< 0)
{
- DEBUG_PRINT_LOW("\nERROR: Request for setting profile level failed");
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting profile level failed");
return false;
}
profile_level.level = requested_level.level;
@@ -1311,78 +2023,338 @@ bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
return true;
}
-bool venc_dev::venc_set_intra_period(OMX_U32 nPFrames)
+bool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
{
venc_ioctl_msg ioctl_msg = {NULL,NULL};
- struct venc_intraperiod intra_period;
+ struct venc_voptimingcfg vop_timing_cfg;
+
+ DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
+ TimeIncRes);
+
+ vop_timing_cfg.voptime_resolution = TimeIncRes;
+
+ ioctl_msg.in = (void*)&vop_timing_cfg;
+ ioctl_msg.out = NULL;
+ if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_VOP_TIMING_CFG,(void*)&ioctl_msg)< 0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Vop Timing failed");
+ return false;
+ }
+
+ voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
+ return true;
+}
+
+bool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
+{
+ venc_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct venc_intraperiod intraperiod_cfg;
DEBUG_PRINT_LOW("\n venc_set_intra_period: nPFrames = %u",
nPFrames);
- intra_period.num_pframes = nPFrames;
- ioctl_msg.inputparam = (void*)&intra_period;
- ioctl_msg.outputparam = NULL;
+ intraperiod_cfg.num_pframes = nPFrames;
+ if((codec_profile.profile == VEN_PROFILE_MPEG4_ASP) ||
+ (codec_profile.profile == VEN_PROFILE_H264_MAIN) ||
+ (codec_profile.profile == VEN_PROFILE_H264_HIGH))
+ {
+#ifdef MAX_RES_1080P
+ if (nBFrames)
+ {
+ DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+ intraperiod_cfg.num_bframes = 1;
+ }
+ else
+ intraperiod_cfg.num_bframes = 0;
+#else
+ if(nBFrames)
+ {
+ DEBUG_PRINT_ERROR("B frames not supported");
+ intraperiod_cfg.num_bframes = 0;
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("B frames not supported");
+ intraperiod_cfg.num_bframes = 0;
+ }
+#endif
+ }
+ else
+ intraperiod_cfg.num_bframes = 0;
+
+ DEBUG_PRINT_ERROR("\n venc_set_intra_period: nPFrames = %u nBFrames = %u",
+ intraperiod_cfg.num_pframes, intraperiod_cfg.num_bframes);
+ ioctl_msg.in = (void*)&intraperiod_cfg;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_PERIOD,(void*)&ioctl_msg)< 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
return false;
}
+ intra_period.num_pframes = intraperiod_cfg.num_pframes;
+ intra_period.num_bframes = intraperiod_cfg.num_bframes;
return true;
}
-bool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate)
+bool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
{
- venc_ioctl_msg ioctl_msg = {NULL, NULL};
- struct venc_targetbitrate bit_rate;
+ venc_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct venc_entropycfg entropy_cfg;
- DEBUG_PRINT_LOW("\n venc_set_target_bitrate: bitrate = %u",
- nTargetBitrate);
- bit_rate.target_bitrate = nTargetBitrate ;
- ioctl_msg.inputparam = (void*)&bit_rate;
- ioctl_msg.outputparam = NULL;
- if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_TARGET_BITRATE,(void*)&ioctl_msg) < 0)
- {
- DEBUG_PRINT_ERROR("\nERROR: Request for setting bit rate failed");
+ memset(&entropy_cfg,0,sizeof(entropy_cfg));
+ DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
+
+ if(enable &&(codec_profile.profile != VEN_PROFILE_H264_BASELINE)){
+ entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CABAC;
+ if (i_cabac_level == 0) {
+ entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
+ }
+#ifdef MAX_RES_1080P
+ else
+ {
+ DEBUG_PRINT_HIGH("Invalid model set (%d) defaulting to model 0",i_cabac_level);
+ entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
+ }
+#else
+ else if (i_cabac_level == 1) {
+ entropy_cfg.cabacmodel = VEN_CABAC_MODEL_1;
+ }
+ else if (i_cabac_level == 2) {
+ entropy_cfg.cabacmodel = VEN_CABAC_MODEL_2;
+ }
+#endif
+ }
+ else if(!enable){
+ entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CAVLC;
+ }
+ else{
+ DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
return false;
}
- m_sVenc_cfg.targetbitrate = nTargetBitrate;
- m_level_set = false;
- if(venc_set_profile_level(0, 0))
+
+ ioctl_msg.in = (void*)&entropy_cfg;
+ ioctl_msg.out = NULL;
+ if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_ENTROPY_CFG,(void*)&ioctl_msg)< 0)
{
- DEBUG_PRINT_HIGH("\n %s(): Dynamic Profile/Level setting success",
- __func__);
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting entropy config failed");
+ return false;
}
-
+ entropy.longentropysel = entropy_cfg.longentropysel;
+ entropy.cabacmodel = entropy_cfg.cabacmodel;
return true;
}
-bool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate)
+bool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
{
- venc_ioctl_msg ioctl_msg = {NULL, NULL};
- struct venc_framerate frame_rate;
+ venc_ioctl_msg ioctl_msg = {NULL, NULL};
+ bool status = true;
+ struct venc_multiclicecfg multislice_cfg;
- DEBUG_PRINT_LOW("\n venc_set_encode_framerate: framerate(Q16) = %u",
- encode_framerate);
- frame_rate.fps_numerator = 30;
- if((encode_framerate >> 16)== 30)
+ if((Codec != OMX_IndexParamVideoH263) && (nSlicesize)){
+ multislice_cfg.mslice_mode = VEN_MSLICE_CNT_MB;
+ multislice_cfg.mslice_size = nSlicesize;
+ }
+ else{
+ multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
+ multislice_cfg.mslice_size = 0;
+ }
+
+ DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
+ multislice_cfg.mslice_size);
+
+ ioctl_msg.in = (void*)&multislice_cfg;
+ ioctl_msg.out = NULL;
+ if(ioctl (m_nDriver_fd, VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0)
{
- frame_rate.fps_denominator = 1;
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
+ status = false;
}
- else if((encode_framerate >>16) == 15)
+ else
{
- frame_rate.fps_denominator = 2;
+ multislice.mslice_mode = multislice_cfg.mslice_mode;
+ multislice.mslice_size = nSlicesize;
}
- else if((encode_framerate >> 16)== 7.5)
+ return status;
+}
+
+bool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
+{
+ venc_ioctl_msg ioctl_msg = {NULL, NULL};
+ bool status = true;
+ struct venc_intrarefresh intraRefresh_cfg;
+
+ // There is no disabled mode. Disabled mode is indicated by a 0 count.
+ if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax)
{
- frame_rate.fps_denominator = 4;
+ intraRefresh_cfg.irmode = VEN_IR_OFF;
+ intraRefresh_cfg.mbcount = 0;
+ }
+ else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
+ (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
+ {
+ intraRefresh_cfg.irmode = VEN_IR_CYCLIC;
+ intraRefresh_cfg.mbcount = irMBs;
}
else
{
- frame_rate.fps_denominator = 1;
+ DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
+ "mb count: %d, mb mode:%d", irMBs, ir_mode);
+ return false;
}
- ioctl_msg.inputparam = (void*)&frame_rate;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&intraRefresh_cfg;
+ ioctl_msg.out = NULL;
+ if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_REFRESH,(void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra Refresh failed");
+ status = false;
+ }
+ else
+ {
+ intra_refresh.irmode = intraRefresh_cfg.irmode;
+ intra_refresh.mbcount = intraRefresh_cfg.mbcount;
+ }
+ return status;
+}
+
+bool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
+{
+ venc_ioctl_msg ioctl_msg = {NULL, NULL};
+ bool status = true;
+ struct venc_headerextension hec_cfg;
+ struct venc_multiclicecfg multislice_cfg;
+
+ if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingMPEG4) {
+ if (error_resilience->bEnableHEC) {
+ hec_cfg.header_extension = 1;
+ }
+ else {
+ hec_cfg.header_extension = 0;
+ }
+
+ ioctl_msg.in = (void*)&hec_cfg;
+ ioctl_msg.out = NULL;
+ if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_HEC,(void*)&ioctl_msg) < 0) {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting HEader Error correction failed");
+ return false;
+ }
+ hec.header_extension = error_resilience->bEnableHEC;
+ }
+
+ if (error_resilience->bEnableRVLC) {
+ DEBUG_PRINT_ERROR("\n RVLC is not Supported");
+ return false;
+ }
+
+ if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
+ (error_resilience->bEnableDataPartitioning)) {
+ DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
+ return false;
+ }
+
+ if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
+ (error_resilience->nResynchMarkerSpacing)) {
+ multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
+ multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
+ }
+ else if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingH263 &&
+ error_resilience->bEnableDataPartitioning) {
+ multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
+ multislice_cfg.mslice_size = 0;
+ }
+ else {
+ multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
+ multislice_cfg.mslice_size = 0;
+ }
+ DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
+ multislice_cfg.mslice_size);
+ ioctl_msg.in = (void*)&multislice_cfg;
+ ioctl_msg.out = NULL;
+ if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0) {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
+ status = false;
+ }
+ else
+ {
+ multislice.mslice_mode = multislice_cfg.mslice_mode ;
+ multislice.mslice_size = multislice_cfg.mslice_size;
+
+ }
+ return status;
+}
+
+bool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
+{
+ venc_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct venc_dbcfg filter_cfg;
+
+ memset(&filter_cfg, 0, sizeof(filter_cfg));
+ DEBUG_PRINT_LOW("\n venc_set_inloop_filter: %u",loopfilter);
+
+ if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable){
+ filter_cfg.db_mode = VEN_DB_ALL_BLKG_BNDRY;
+ }
+ else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisable){
+ filter_cfg.db_mode = VEN_DB_DISABLE;
+ }
+ else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary){
+ filter_cfg.db_mode = VEN_DB_SKIP_SLICE_BNDRY;
+ }
+ filter_cfg.slicealpha_offset = filter_cfg.slicebeta_offset = 0;
+
+ ioctl_msg.in = (void*)&filter_cfg;
+ ioctl_msg.out = NULL;
+ if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_DEBLOCKING_CFG,(void*)&ioctl_msg)< 0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting inloop filter failed");
+ return false;
+ }
+
+ dbkfilter.db_mode = filter_cfg.db_mode;
+ dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
+ return true;
+}
+
+bool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
+{
+ venc_ioctl_msg ioctl_msg = {NULL, NULL};
+ struct venc_targetbitrate bitrate_cfg;
+
+ DEBUG_PRINT_LOW("\n venc_set_target_bitrate: bitrate = %u",
+ nTargetBitrate);
+ bitrate_cfg.target_bitrate = nTargetBitrate ;
+ ioctl_msg.in = (void*)&bitrate_cfg;
+ ioctl_msg.out = NULL;
+ if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_TARGET_BITRATE,(void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting bit rate failed");
+ return false;
+ }
+ m_sVenc_cfg.targetbitrate = nTargetBitrate;
+ bitrate.target_bitrate = nTargetBitrate;
+ if(!config)
+ {
+ m_level_set = false;
+ if(venc_set_profile_level(0, 0))
+ {
+ DEBUG_PRINT_LOW("Calling set level (Bitrate) with %d\n",profile_level.level);
+ }
+ }
+ return true;
+}
+
+bool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
+{
+ venc_ioctl_msg ioctl_msg = {NULL, NULL};
+ struct venc_framerate frame_rate_cfg;
+
+ Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
+
+ DEBUG_PRINT_LOW("\n venc_set_encode_framerate: framerate(Q16) = %u,NR: %d, DR: %d",
+ encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
+
+ ioctl_msg.in = (void*)&frame_rate_cfg;
+ ioctl_msg.out = NULL;
if(ioctl(m_nDriver_fd, VEN_IOCTL_SET_FRAME_RATE,
(void*)&ioctl_msg) < 0)
{
@@ -1390,15 +2362,16 @@ bool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate)
return false;
}
- m_sVenc_cfg.fps_den = frame_rate.fps_denominator;
- m_sVenc_cfg.fps_num = frame_rate.fps_numerator;
- m_level_set = false;
- if(venc_set_profile_level(0, 0))
+ m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
+ m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
+ if(!config)
{
- DEBUG_PRINT_HIGH("\n %s(): Dynamic Profile/Level setting success",
- __func__);
+ m_level_set = false;
+ if(venc_set_profile_level(0, 0))
+ {
+ DEBUG_PRINT_LOW("Calling set level (Framerate) with %d\n",profile_level.level);
+ }
}
-
return true;
}
@@ -1409,16 +2382,24 @@ bool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
if(color_format == OMX_COLOR_FormatYUV420SemiPlanar)
{
+#ifdef MAX_RES_1080P
+ m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+#else
m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
+#endif
}
else
{
DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
+#ifdef MAX_RES_1080P
+ m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+#else
m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
+#endif
DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
}
- ioctl_msg.inputparam = (void*)&m_sVenc_cfg;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&m_sVenc_cfg;
+ ioctl_msg.out = NULL;
if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_BASE_CFG, (void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting color format failed");
@@ -1449,21 +2430,25 @@ bool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
{
venc_ioctl_msg ioctl_msg = {NULL,NULL};
bool status = true;
+ struct venc_ratectrlcfg ratectrl_cfg;
//rate control
switch(eControlRate)
{
case OMX_Video_ControlRateDisable:
- rate_ctrl.rcmode = VEN_RC_OFF;
+ ratectrl_cfg.rcmode = VEN_RC_OFF;
break;
case OMX_Video_ControlRateVariableSkipFrames:
- rate_ctrl.rcmode = VEN_RC_VBR_VFR;
+ ratectrl_cfg.rcmode = VEN_RC_VBR_VFR;
break;
case OMX_Video_ControlRateVariable:
- rate_ctrl.rcmode = VEN_RC_VBR_CFR;
+ ratectrl_cfg.rcmode = VEN_RC_VBR_CFR;
break;
case OMX_Video_ControlRateConstantSkipFrames:
- rate_ctrl.rcmode = VEN_RC_CBR_VFR;
+ ratectrl_cfg.rcmode = VEN_RC_CBR_VFR;
+ break;
+ case OMX_Video_ControlRateConstant:
+ ratectrl_cfg.rcmode = VEN_RC_CBR_CFR;
break;
default:
status = false;
@@ -1472,13 +2457,15 @@ bool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
if(status)
{
- ioctl_msg.inputparam = (void*)&rate_ctrl;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = (void*)&ratectrl_cfg;
+ ioctl_msg.out = NULL;
if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,(void*)&ioctl_msg) < 0)
{
DEBUG_PRINT_ERROR("\nERROR: Request for setting rate control failed");
status = false;
}
+ else
+ rate_ctrl.rcmode = ratectrl_cfg.rcmode;
}
return status;
}
@@ -1639,7 +2626,13 @@ bool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
case VEN_LEVEL_H264_3p1:
*eLevel = OMX_VIDEO_AVCLevel31;
break;
- default :
+ case VEN_LEVEL_H264_3p2:
+ *eLevel = OMX_VIDEO_AVCLevel32;
+ break;
+ case VEN_LEVEL_H264_4:
+ *eLevel = OMX_VIDEO_AVCLevel4;
+ break;
+ default :
*eLevel = OMX_VIDEO_AVCLevelMax;
status = false;
break;
@@ -1801,6 +2794,19 @@ bool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
((m_sVenc_cfg.input_width + 15)>> 4);
+ if((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4))
+ {
+ if(codec_profile.profile == VEN_PROFILE_MPEG4_ASP)
+ profile_level.level = VEN_LEVEL_MPEG4_5;
+ if(codec_profile.profile == VEN_PROFILE_MPEG4_SP)
+ profile_level.level = VEN_LEVEL_MPEG4_6;
+ {
+ new_level = profile_level.level;
+ new_profile = codec_profile.profile;
+ return true;
+ }
+ }
+
mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
do{
@@ -1810,10 +2816,10 @@ bool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
{
if(m_sVenc_cfg.targetbitrate <= (int)profile_tbl[2])
{
- DEBUG_PRINT_LOW("\n Appropriate profile/level found \n");
new_level = (int)profile_tbl[3];
new_profile = (int)profile_tbl[4];
profile_level_found = true;
+ DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
break;
}
}
@@ -1821,8 +2827,7 @@ bool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
profile_tbl = profile_tbl + 5;
}while(profile_tbl[0] != 0);
- if ((profile_level_found != true) || (new_profile != *eProfile)
- || (new_level > *eLevel))
+ if (profile_level_found != true)
{
DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
return false;
@@ -1833,51 +2838,98 @@ bool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
{
*eLevel = new_level;
}
- DEBUG_PRINT_HIGH("%s: Returning with eProfile = %lu"
+ DEBUG_PRINT_LOW("%s: Returning with eProfile = %lu"
"Level = %lu", __func__, *eProfile, *eLevel);
return true;
}
-bool venc_dev::venc_set_multislice_cfg(OMX_VIDEO_AVCSLICEMODETYPE eSliceMode)
+
+bool venc_dev::venc_max_allowed_bitrate_check(OMX_U32 nTargetBitrate)
{
- venc_ioctl_msg ioctl_msg = {NULL, NULL};
- bool status = true;
- DEBUG_PRINT_LOW("\n %s(): eSliceMode = %u", __func__, eSliceMode);
- switch(eSliceMode)
+ unsigned const int *profile_tbl = NULL;
+
+ switch(m_sVenc_cfg.codectype)
{
- case OMX_VIDEO_SLICEMODE_AVCDefault:
- DEBUG_PRINT_LOW("\n %s(): OMX_VIDEO_SLICEMODE_AVCDefault", __func__);
- multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
- multislice_cfg.mslice_size = 0;
- break;
- case OMX_VIDEO_SLICEMODE_AVCMBSlice:
- DEBUG_PRINT_LOW("\n %s(): OMX_VIDEO_SLICEMODE_AVCMBSlice", __func__);
- multislice_cfg.mslice_mode = VEN_MSLICE_CNT_MB;
- multislice_cfg.mslice_size = ((m_sVenc_cfg.input_width/16) *
- (m_sVenc_cfg.input_height/16))/2;
- break;
- case OMX_VIDEO_SLICEMODE_AVCByteSlice:
- DEBUG_PRINT_LOW("\n %s(): OMX_VIDEO_SLICEMODE_AVCByteSlice", __func__);
- multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
- multislice_cfg.mslice_size = 1920;
- break;
- default:
- DEBUG_PRINT_ERROR("\n %s(): Unsupported SliceMode = %u",__func__, eSliceMode);
- status = false;
- break;
- }
- DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
- multislice_cfg.mslice_size);
+ case VEN_CODEC_MPEG4:
+ if(m_eProfile == OMX_VIDEO_MPEG4ProfileSimple)
+ {
+ profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
+ }
+ else if(m_eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
+ {
+ profile_tbl = (unsigned int const *)
+ (&mpeg4_profile_level_table[MPEG4_ASP_START]);
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("Unsupported MPEG4 profile type %lu", m_eProfile);
+ return false;
+ }
+ break;
+ case VEN_CODEC_H264:
+ if(m_eProfile == OMX_VIDEO_AVCProfileBaseline)
+ {
+ profile_tbl = (unsigned int const *)h264_profile_level_table;
+ }
+ else if(m_eProfile == OMX_VIDEO_AVCProfileHigh)
+ {
+ profile_tbl = (unsigned int const *)
+ (&h264_profile_level_table[H264_HP_START]);
+ }
+ else if(m_eProfile == OMX_VIDEO_AVCProfileMain)
+ {
+ profile_tbl = (unsigned int const *)
+ (&h264_profile_level_table[H264_MP_START]);
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("Unsupported AVC profile type %lu", m_eProfile);
+ return false;
+ }
- if(status)
+ break;
+ case VEN_CODEC_H263:
+ if(m_eProfile == OMX_VIDEO_H263ProfileBaseline)
+ {
+ profile_tbl = (unsigned int const *)h263_profile_level_table;
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("Unsupported H.263 profile type %lu", m_eProfile);
+ return false;
+ }
+ break;
+ default:
+ DEBUG_PRINT_ERROR("%s: unknown codec type", __func__);
+ return false;
+ }
+ while(profile_tbl[0] != 0)
{
- ioctl_msg.inputparam = (void*)&multislice_cfg;
- ioctl_msg.outputparam = NULL;
- if(ioctl (m_nDriver_fd,VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0)
+ if(profile_tbl[3] == m_eLevel)
{
- DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
- status = false;
+ if(nTargetBitrate > profile_tbl[2])
+ {
+ DEBUG_PRINT_ERROR("Max. supported bitrate for Profile[%d] & Level[%d]"
+ " is %u", m_eProfile, m_eLevel, profile_tbl[2]);
+ return false;
+ }
}
+ profile_tbl += 5;
}
- return status;
+ return true;
+}
+
+#ifdef _ANDROID_ICS_
+bool venc_dev::venc_set_meta_mode(bool mode)
+{
+ venc_ioctl_msg ioctl_msg = {NULL,NULL};
+ ioctl_msg.in = &mode;
+ DEBUG_PRINT_HIGH("Set meta buffer mode: %d", mode);
+ if(ioctl(m_nDriver_fd,VEN_IOCTL_SET_METABUFFER_MODE,&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR(" Set meta buffer mode failed");
+ return false;
+ }
+ return true;
}
+#endif
diff --git a/mm-video/vidc/venc/src/video_encoder_device_copper.cpp b/mm-video/vidc/venc/src/video_encoder_device_copper.cpp
new file mode 100755
index 00000000..1b387ed5
--- /dev/null
+++ b/mm-video/vidc/venc/src/video_encoder_device_copper.cpp
@@ -0,0 +1,3012 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Code Aurora nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+#include<string.h>
+#include <sys/ioctl.h>
+#include <sys/prctl.h>
+#include<unistd.h>
+#include <fcntl.h>
+#include "video_encoder_device_copper.h"
+#include "omx_video_encoder.h"
+#include <linux/android_pmem.h>
+#ifdef USE_ION
+#include <ion_msm.h>
+#endif
+
+#define MPEG4_SP_START 0
+#define MPEG4_ASP_START (MPEG4_SP_START + 8)
+#define MPEG4_720P_LEVEL 6
+#define H263_BP_START 0
+#define H264_BP_START 0
+#define H264_HP_START (H264_BP_START + 13)
+#define H264_MP_START (H264_BP_START + 26)
+
+/* MPEG4 profile and level table*/
+static const unsigned int mpeg4_profile_level_table[][5]=
+{
+ /*max mb per frame, max mb per sec, max bitrate, level, profile*/
+ {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
+ {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
+ {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
+ {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
+ {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
+ {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
+ {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
+ {0,0,0,0,0},
+
+ {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {0,0,0,0,0},
+};
+
+/* H264 profile and level table*/
+static const unsigned int h264_profile_level_table[][5]=
+{
+ /*max mb per frame, max mb per sec, max bitrate, level, profile*/
+ {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
+ {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
+ {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
+ {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},
+ {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},
+ {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},
+ {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},
+ {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
+ {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
+ {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
+ {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
+ {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
+ {0,0,0,0,0},
+
+ {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
+ {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
+ {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},
+ {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},
+ {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},
+ {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},
+ {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},
+ {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
+ {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
+ {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
+ {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
+ {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
+ {0,0,0,0,0},
+
+ {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
+ {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
+ {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
+ {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
+ {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
+ {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
+ {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
+ {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
+ {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
+ {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
+ {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
+ {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
+ {0,0,0,0,0}
+
+};
+
+/* H263 profile and level table*/
+static const unsigned int h263_profile_level_table[][5]=
+{
+ /*max mb per frame, max mb per sec, max bitrate, level, profile*/
+ {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
+ {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
+ {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},
+ {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},
+ {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},
+ {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
+ {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
+ {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
+ {0,0,0,0,0}
+};
+
+#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } }
+#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); }
+
+#ifdef INPUT_BUFFER_LOG
+FILE *inputBufferFile1;
+char inputfilename [] = "/data/input.yuv";
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+FILE *outputBufferFile1;
+char outputfilename [] = "/data/output-bitstream.\0\0\0\0";
+#endif
+//constructor
+venc_dev::venc_dev(class omx_venc *venc_class)
+{
+//nothing to do
+venc_handle = venc_class;
+etb_count=0;
+}
+
+venc_dev::~venc_dev()
+{
+ //nothing to do
+}
+
+void* async_venc_message_thread (void *input)
+{
+ struct venc_timeout timeout;
+ struct venc_msg venc_msg;
+ omx_video* omx_venc_base = NULL;
+ omx_venc *omx = reinterpret_cast<omx_venc*>(input);
+ omx_venc_base = reinterpret_cast<omx_video*>(input);
+ OMX_BUFFERHEADERTYPE* omxhdr = NULL;
+
+
+ prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
+ timeout.millisec = VEN_TIMEOUT_INFINITE;
+ struct v4l2_plane plane;
+ struct pollfd pfd;
+ struct v4l2_buffer v4l2_buf ={0};
+ struct v4l2_event dqevent;
+ pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
+ pfd.fd = omx->handle->m_nDriver_fd;
+ int error_code = 0,rc=0;
+ while(1)
+ {
+ rc = poll(&pfd, 1, TIMEOUT);
+ if (!rc) {
+ printf("Poll timedout\n");
+ break;
+ } else if (rc < 0) {
+ printf("Error while polling: %d\n", rc);
+ break;
+ }
+ if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
+ v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+ v4l2_buf.length = 1;
+ v4l2_buf.m.planes = &plane;
+ rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
+ if (rc) {
+ printf("Failed to dequeue buf: %d from capture capability\n", rc);
+ break;
+ }
+ venc_msg.msgcode=VEN_MSG_OUTPUT_BUFFER_DONE;
+ venc_msg.statuscode=VEN_S_SUCCESS;
+ omxhdr=omx_venc_base->m_out_mem_ptr+v4l2_buf.index;
+ venc_msg.buf.len= v4l2_buf.m.planes->bytesused;
+ venc_msg.buf.offset = v4l2_buf.m.planes->reserved[1];
+ venc_msg.buf.ptrbuffer = (OMX_U8 *)omx_venc_base->m_pOutput_pmem[v4l2_buf.index].buffer;
+
+ venc_msg.buf.clientdata=(void*)omxhdr;
+ } else if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
+ v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ v4l2_buf.memory = V4L2_MEMORY_USERPTR;
+ v4l2_buf.m.planes = &plane;
+ rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
+ if (rc) {
+ printf("Failed to dequeue buf: %d from output capability\n", rc);
+ break;
+ }
+ venc_msg.msgcode=VEN_MSG_INPUT_BUFFER_DONE;
+ venc_msg.statuscode=VEN_S_SUCCESS;
+ omxhdr=omx_venc_base->m_inp_mem_ptr+v4l2_buf.index;
+ venc_msg.buf.clientdata=(void*)omxhdr;
+ } else if (pfd.revents & POLLPRI){
+ rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
+ printf("\n Data Recieved = %d \n",dqevent.u.data[0]);
+ if(dqevent.u.data[0] == MSM_VIDC_CLOSE_DONE){
+ break;
+ }
+ } else {
+ /*TODO: How to handle this case */
+ continue;
+ }
+
+ if(omx->async_message_process(input,&venc_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
+ break;
+ }
+ }
+ DEBUG_PRINT_HIGH("omx_venc: Async Thread exit\n");
+ return NULL;
+}
+
+bool venc_dev::venc_open(OMX_U32 codec)
+{
+ int r;
+ unsigned int alignment = 0,buffer_size = 0, temp =0;
+
+ m_nDriver_fd = open ("/dev/video33",O_RDWR);
+ if(m_nDriver_fd == 0)
+ {
+ DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again\n");
+ m_nDriver_fd = open ("/dev/video33",O_RDWR);
+ }
+
+ if((int)m_nDriver_fd < 0)
+ {
+ DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure\n");
+ return false;
+ }
+
+ DEBUG_PRINT_LOW("\nm_nDriver_fd = %d\n", m_nDriver_fd);
+#ifdef SINGLE_ENCODER_INSTANCE
+ OMX_U32 num_instances = 0;
+ if(/*ioctl (m_nDriver_fd, VEN_IOCTL_GET_NUMBER_INSTANCES, (void*)&ioctl_msg) < */0 )
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request number of encoder instances failed");
+ }
+ else if (num_instances > 1)
+ {
+ DEBUG_PRINT_ERROR("\nSecond encoder instance rejected!");
+ venc_close();
+ return false;
+ }
+#endif
+ // set the basic configuration of the video encoder driver
+ m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
+ m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
+ m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
+ m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
+ m_sVenc_cfg.fps_num = 30;
+ m_sVenc_cfg.fps_den = 1;
+ m_sVenc_cfg.targetbitrate = 64000;
+ m_sVenc_cfg.inputformat= V4L2_PIX_FMT_NV12;
+ if(codec == OMX_VIDEO_CodingMPEG4)
+ {
+ m_sVenc_cfg.codectype = V4L2_PIX_FMT_MPEG4;
+ codec_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
+ profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
+#ifdef OUTPUT_BUFFER_LOG
+ strcat(outputfilename, "m4v");
+#endif
+ }
+ else if(codec == OMX_VIDEO_CodingH263)
+ {
+ m_sVenc_cfg.codectype = V4L2_PIX_FMT_H263;
+ codec_profile.profile = VEN_PROFILE_H263_BASELINE;
+ profile_level.level = VEN_LEVEL_H263_20;
+#ifdef OUTPUT_BUFFER_LOG
+ strcat(outputfilename, "263");
+#endif
+ }
+ if(codec == OMX_VIDEO_CodingAVC)
+ {
+ m_sVenc_cfg.codectype = V4L2_PIX_FMT_H264;
+ codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
+ profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
+#ifdef OUTPUT_BUFFER_LOG
+ strcat(outputfilename, "264");
+#endif
+ }
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0 )
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting base configuration failed");
+ return false;
+ }
+#ifdef INPUT_BUFFER_LOG
+ inputBufferFile1 = fopen (inputfilename, "ab");
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+ outputBufferFile1 = fopen (outputfilename, "ab");
+#endif
+ int ret;
+ struct v4l2_event_subscription sub;
+ sub.type=V4L2_EVENT_ALL;
+ ret = ioctl(m_nDriver_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
+ if (ret) {
+ printf("\n Subscribe Event Failed \n");
+ return false;
+ }
+ struct v4l2_capability cap;
+ struct v4l2_fmtdesc fdesc;
+ struct v4l2_format fmt;
+ struct v4l2_requestbuffers bufreq;
+
+ ret = ioctl(m_nDriver_fd, VIDIOC_QUERYCAP, &cap);
+ if (ret) {
+ printf("Failed to query capabilities\n");
+ } else {
+ printf("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);
+ }
+ //printf(" \n VIDIOC_QUERYCAP Successful \n ");
+ ret=0;
+ fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fdesc.index=0;
+ while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+ printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+ fdesc.pixelformat, fdesc.flags);
+ fdesc.index++;
+ }
+ //printf("\n VIDIOC_ENUM_FMT CAPTURE Successful \n ");
+ fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fdesc.index=0;
+ while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
+
+ printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
+ fdesc.pixelformat, fdesc.flags);
+ fdesc.index++;
+ }
+ //printf(" \n VIDIOC_ENUM_FMT OUTPUT Successful \n ");
+
+ m_sOutput_buff_property.alignment=m_sInput_buff_property.alignment=4096;
+
+ fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+ fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
+
+ ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
+ //printf(" \n VIDIOC_S_FMT OUTPUT Successful \n ");
+ m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+ //printf("m_sInput_buff_property.datasize = %d\n",m_sInput_buff_property.datasize);
+
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+ fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
+
+ ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
+ //printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
+ m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+ //printf("m_sOutput_buff_property.datasize = %d\n",m_sOutput_buff_property.datasize);
+// struct v4l2_requestbuffers bufreq;
+
+ bufreq.memory = V4L2_MEMORY_USERPTR;
+ bufreq.count = 2;
+
+ bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
+ m_sInput_buff_property.mincount=m_sInput_buff_property.maxcount=m_sInput_buff_property.actualcount=bufreq.count;
+ //printf(" \n VIDIOC_REQBUFS OUTPUT Successful \n ");
+ //printf("m_sInput_buff_property.datasize = %d\n",m_sInput_buff_property.datasize);
+ //printf("m_sInput_buff_property.mincount = %d\n",m_sInput_buff_property.mincount);
+ bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ bufreq.count = 2;
+ ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
+ m_sOutput_buff_property.mincount=m_sOutput_buff_property.maxcount=m_sOutput_buff_property.actualcount=bufreq.count;
+ //printf(" \n VIDIOC_REQBUFS CAPTURE Successful \n ");
+ //printf("m_sInput_buff_property.mincount = %d\n",m_sOutput_buff_property.mincount);
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
+ return false;
+ }
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
+ return false;
+ }
+ ///printf("\n \n Setting Profile and Level \n \n ");
+ //m_profile_set = false;
+ //m_level_set = false;
+ if(/*venc_set_profile_level(0, 0)*/0)
+ {
+ DEBUG_PRINT_HIGH("\n %s(): Init Profile/Level setting success",
+ __func__);
+ }
+ recon_buffers_count = MAX_RECON_BUFFERS;
+ return true;
+}
+
+void venc_dev::venc_close()
+{
+ DEBUG_PRINT_LOW("\nvenc_close: fd = %d", m_nDriver_fd);
+ if((int)m_nDriver_fd >= 0)
+ {
+ DEBUG_PRINT_HIGH("\n venc_close(): Calling VEN_IOCTL_CMD_STOP_READ_MSG");
+ //(void)ioctl(m_nDriver_fd, VEN_IOCTL_CMD_STOP_READ_MSG,
+ // NULL);
+ DEBUG_PRINT_LOW("\nCalling close()\n");
+
+ int rc=0;
+ enum v4l2_buf_type btype;
+ btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ /* STREAMOFF will never fail */
+ printf("\n Failed to call streamoff on OUTPUT Port \n");
+ }
+ btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+
+ rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ /* STREAMOFF will never fail */
+ printf("\n Failed to call streamoff on CAPTURE Port \n");
+ }
+ struct v4l2_event_subscription sub;
+ sub.type=V4L2_EVENT_ALL;
+ rc = ioctl(m_nDriver_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
+ if (rc) {
+ printf("Failed to get control\n");
+ return ;
+ }
+ close(m_nDriver_fd);
+ m_nDriver_fd = -1;
+ }
+#ifdef INPUT_BUFFER_LOG
+ fclose (inputBufferFile1);
+#endif
+#ifdef OUTPUT_BUFFER_LOG
+ fclose (outputBufferFile1);
+#endif
+}
+
+bool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
+ unsigned long *actual_buff_count,
+ unsigned long *buff_size,
+ unsigned long port)
+{
+
+ unsigned long temp_count = 0;
+
+ if(port == 0)
+ {
+ if(*actual_buff_count > m_sInput_buff_property.mincount)
+ {
+ temp_count = m_sInput_buff_property.actualcount;
+ m_sInput_buff_property.actualcount = *actual_buff_count;
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirement failed");
+ m_sInput_buff_property.actualcount = temp_count;
+ return false;
+ }
+ DEBUG_PRINT_LOW("\n I/P Count set to %lu\n", *actual_buff_count);
+ }
+ }
+ else
+ {
+ if(*actual_buff_count > m_sOutput_buff_property.mincount)
+ {
+ temp_count = m_sOutput_buff_property.actualcount;
+ m_sOutput_buff_property.actualcount = *actual_buff_count;
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer requirement failed");
+ m_sOutput_buff_property.actualcount = temp_count;
+ return false;
+ }
+ DEBUG_PRINT_LOW("\n O/P Count set to %lu\n", *actual_buff_count);
+ }
+ }
+
+ return true;
+
+}
+
+bool venc_dev::venc_loaded_start()
+{
+ return true;
+}
+
+bool venc_dev::venc_loaded_stop()
+{
+ return true;
+}
+
+bool venc_dev::venc_loaded_start_done()
+{
+ return true;
+}
+
+bool venc_dev::venc_loaded_stop_done()
+{
+ return true;
+}
+
+bool venc_dev::venc_get_seq_hdr(void *buffer,
+ unsigned buffer_size, unsigned *header_len)
+{
+ return true;
+}
+
+bool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
+ unsigned long *actual_buff_count,
+ unsigned long *buff_size,
+ unsigned long port)
+{
+ struct v4l2_format fmt;
+ struct v4l2_requestbuffers bufreq;
+ int ret;
+ if(port == 0)
+ {
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
+ return false;
+ }
+
+ fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+ fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
+ ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
+ //printf(" \n VIDIOC_S_FMT OUTPUT Successful \n ");
+ m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+
+bufreq.memory = V4L2_MEMORY_USERPTR;
+ bufreq.count = 2;
+
+ bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
+ m_sInput_buff_property.mincount=m_sInput_buff_property.maxcount=m_sInput_buff_property.actualcount=bufreq.count;
+
+
+ *min_buff_count = m_sInput_buff_property.mincount;
+ *actual_buff_count = m_sInput_buff_property.actualcount;
+#ifdef USE_ION
+ // For ION memory allocations of the allocated buffer size
+ // must be 4k aligned, hence aligning the input buffer
+ // size to 4k.
+ m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095)
+ & (~4095);
+#endif
+ *buff_size = m_sInput_buff_property.datasize;
+ }
+ else
+ {
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
+ return false;
+ }
+
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+ fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
+
+ ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
+ //printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
+ m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+ fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+ fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
+
+ ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
+ //printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
+ m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
+
+
+ *min_buff_count = m_sOutput_buff_property.mincount;
+ *actual_buff_count = m_sOutput_buff_property.actualcount;
+ *buff_size = m_sOutput_buff_property.datasize;
+ }
+
+ return true;
+
+}
+
+bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
+{
+ DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
+ switch(index)
+ {
+ case OMX_IndexParamPortDefinition:
+ {
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+ portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+ DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition\n");
+ if(portDefn->nPortIndex == PORT_INDEX_IN)
+ {
+ if(!venc_set_color_format(portDefn->format.video.eColorFormat))
+ {
+ return false;
+ }
+ if(m_sVenc_cfg.input_height != portDefn->format.video.nFrameHeight ||
+ m_sVenc_cfg.input_width != portDefn->format.video.nFrameWidth)
+ {
+ DEBUG_PRINT_LOW("\n Basic parameter has changed");
+ m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
+ m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting base config failed");
+ return false;
+ }
+
+ DEBUG_PRINT_LOW("\n Updating the buffer count/size for the new resolution");
+ if(/*ioctl (m_nDriver_fd, VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p bufreq failed");
+ return false;
+ }
+ DEBUG_PRINT_LOW("\n Got updated m_sInput_buff_property values: "
+ "datasize = %u, maxcount = %u, actualcnt = %u, "
+ "mincount = %u", m_sInput_buff_property.datasize,
+ m_sInput_buff_property.maxcount, m_sInput_buff_property.actualcount,
+ m_sInput_buff_property.mincount);
+
+ if(/*ioctl (m_nDriver_fd, VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p bufreq failed");
+ return false;
+ }
+
+ DEBUG_PRINT_LOW("\n Got updated m_sOutput_buff_property values: "
+ "datasize = %u, maxcount = %u, actualcnt = %u, "
+ "mincount = %u", m_sOutput_buff_property.datasize,
+ m_sOutput_buff_property.maxcount, m_sOutput_buff_property.actualcount,
+ m_sOutput_buff_property.mincount);
+ if(/*ioctl (m_nDriver_fd, VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) <*/ 0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p bufreq failed");
+ return false;
+ }
+
+ if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
+ (portDefn->nBufferCountActual <= m_sInput_buff_property.maxcount))
+ {
+ m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
+ if(/*ioctl(m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirements failed");
+ return false;
+ }
+ }
+ if(m_sInput_buff_property.datasize != portDefn->nBufferSize)
+ {
+ DEBUG_PRINT_ERROR("\nWARNING: Requested i/p bufsize[%u],"
+ "Driver's updated i/p bufsize = %u", portDefn->nBufferSize,
+ m_sInput_buff_property.datasize);
+ }
+ m_level_set = false;
+ if(venc_set_profile_level(0, 0))
+ {
+ DEBUG_PRINT_HIGH("\n %s(): Profile/Level setting success", __func__);
+ }
+ }
+ else
+ {
+ if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
+ (m_sInput_buff_property.maxcount >= portDefn->nBufferCountActual) &&
+ (m_sInput_buff_property.datasize == portDefn->nBufferSize))
+ {
+ m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_INPUT_BUFFER_REQ failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Input buffer requirements failed");
+ return false;
+ }
+ }
+ }
+ else if(portDefn->nPortIndex == PORT_INDEX_OUT)
+ {
+ if(!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0))
+ {
+ return false;
+ }
+
+ if(!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0))
+ {
+ return false;
+ }
+
+ if( (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
+ &&
+ (m_sOutput_buff_property.maxcount >= portDefn->nBufferCountActual)
+ &&
+ (m_sOutput_buff_property.datasize == portDefn->nBufferSize)
+ )
+ {
+ m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_OUTPUT_BUFFER_REQ failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Output buffer requirements failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoPortFormat:
+ {
+ OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
+ portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
+ DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat\n");
+
+ if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN)
+ {
+ if(!venc_set_color_format(portFmt->eColorFormat))
+ {
+ return false;
+ }
+ }
+ else if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(!venc_set_encode_framerate(portFmt->xFramerate, 0))
+ {
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoBitrate:
+ {
+ OMX_VIDEO_PARAM_BITRATETYPE* pParam;
+ pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
+ DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate\n");
+
+ if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(!venc_set_target_bitrate(pParam->nTargetBitrate, 0))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
+ return false;
+ }
+ if(!venc_set_ratectrl_cfg(pParam->eControlRate))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Rate Control setting failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoMpeg4:
+ {
+ OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
+ OMX_U32 bFrames = 0;
+
+ pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
+ DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
+ if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(!venc_set_voptiming_cfg(pParam->nTimeIncRes))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
+ return false;
+ }
+ m_profile_set = false;
+ m_level_set = false;
+ if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
+ return false;
+ }
+ else {
+ if(pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
+ {
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+ bFrames = 1;
+ }
+ }
+ else
+ {
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+ bFrames = 0;
+ }
+ }
+ }
+ if(!venc_set_intra_period (pParam->nPFrames,bFrames))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ return false;
+ }
+ if(!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoH263:
+ {
+ OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
+ DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
+ OMX_U32 bFrames = 0;
+ if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ m_profile_set = false;
+ m_level_set = false;
+ if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
+ return false;
+ }
+ if (pParam->nBFrames)
+ DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
+
+ if(venc_set_intra_period (pParam->nPFrames, bFrames) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoH263");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoAvc:
+ {
+ DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
+ OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
+ OMX_U32 bFrames = 0;
+
+ if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
+ pParam->eProfile,pParam->eLevel);
+
+ m_profile_set = false;
+ m_level_set = false;
+
+ if(!venc_set_profile_level (pParam->eProfile,pParam->eLevel))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
+ pParam->eProfile, pParam->eLevel);
+ return false;
+ }
+ else {
+ if(pParam->eProfile != OMX_VIDEO_AVCProfileBaseline)
+ {
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
+ bFrames = 1;
+ }
+ }
+ else
+ {
+ if(pParam->nBFrames)
+ {
+ DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
+ bFrames = 0;
+ }
+ }
+ }
+ if(!venc_set_intra_period (pParam->nPFrames, bFrames))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ return false;
+ }
+ if(!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
+ return false;
+ }
+ if(!venc_set_inloop_filter (pParam->eLoopFilterMode))
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
+ printf("\n \n Returned here line line 903 \n \n ");
+ return false;
+ }
+ if(!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing))
+ {
+ DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
+ }
+ //TBD, lot of other variables to be updated, yet to decide
+ break;
+ }
+ case OMX_IndexParamVideoIntraRefresh:
+ {
+ DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
+ OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
+ (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
+ if(intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(/*venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == */false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoErrorCorrection:
+ {
+ DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
+ OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
+ (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
+ if(error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(venc_set_error_resilience(error_resilience) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoProfileLevelCurrent:
+ {
+ DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
+ OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
+ (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
+ if(profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ m_profile_set = false;
+ m_level_set = false;
+ if(!venc_set_profile_level (profile_level->eProfile,
+ profile_level->eLevel))
+ {
+ DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoQuantization:
+ {
+ DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization\n");
+ OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
+ (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
+ if(session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(venc_set_session_qp (session_qp->nQpI,
+ session_qp->nQpP,
+ session_qp->nQpB) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Session QP failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
+ }
+ break;
+ }
+ case OMX_IndexParamVideoSliceFMO:
+ default:
+ DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
+ index);
+ break;
+ //case
+ }
+
+ return true;
+}
+
+bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
+{
+
+ DEBUG_PRINT_LOW("\n Inside venc_set_config");
+
+ switch(index)
+ {
+ case OMX_IndexConfigVideoBitrate:
+ {
+ OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
+ configData;
+ DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
+ if(bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
+ {
+ if(venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
+ }
+ break;
+ }
+ case OMX_IndexConfigVideoFramerate:
+ {
+ OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
+ configData;
+ DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
+ if(frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
+ {
+ if(venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
+ }
+ break;
+ }
+ case QOMX_IndexConfigVideoIntraperiod:
+ {
+ DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
+ QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
+ (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
+ if(intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
+ {
+ if(venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ return false;
+ }
+ }
+ break;
+ }
+ case OMX_IndexConfigVideoIntraVOPRefresh:
+ {
+ OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
+ configData;
+ DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
+ if(intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
+ {
+ if(venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
+ }
+ break;
+ }
+ case OMX_IndexConfigCommonRotate:
+ {
+ OMX_CONFIG_ROTATIONTYPE *config_rotation =
+ reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
+ OMX_U32 nFrameWidth;
+
+ DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
+ nFrameWidth = m_sVenc_cfg.input_width;
+ m_sVenc_cfg.input_width = m_sVenc_cfg.input_height;
+ m_sVenc_cfg.input_height = nFrameWidth;
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0) {
+ DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
+ return false;
+ }
+ break;
+ }
+ default:
+ DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
+ break;
+ }
+
+ return true;
+}
+
+unsigned venc_dev::venc_stop( void)
+{
+ pmem_free();
+ return 0;
+}
+
+unsigned venc_dev::venc_pause(void)
+{
+ return 0;
+}
+
+unsigned venc_dev::venc_resume(void)
+{
+ return 0;
+}
+
+unsigned venc_dev::venc_start_done(void)
+{
+ struct venc_msg venc_msg;
+ venc_msg.msgcode=VEN_MSG_START;
+ venc_msg.statuscode=VEN_S_SUCCESS;
+ venc_handle->async_message_process(venc_handle,&venc_msg);
+ return 0;
+}
+
+unsigned venc_dev::venc_stop_done(void)
+{
+ struct venc_msg venc_msg;
+ venc_msg.msgcode=VEN_MSG_STOP;
+ venc_msg.statuscode=VEN_S_SUCCESS;
+ venc_handle->async_message_process(venc_handle,&venc_msg);
+ return 0;
+}
+
+unsigned venc_dev::venc_start(void)
+{
+ enum v4l2_buf_type buf_type;
+ int ret,r;
+ DEBUG_PRINT_HIGH("\n %s(): Check Profile/Level set in driver before start",
+ __func__);
+ if (!venc_set_profile_level(0, 0))
+ {
+ DEBUG_PRINT_ERROR("\n ERROR: %s(): Driver Profile/Level is NOT SET",
+ __func__);
+ }
+ else
+ {
+ DEBUG_PRINT_HIGH("\n %s(): Driver Profile[%lu]/Level[%lu] successfully SET",
+ __func__, codec_profile.profile, profile_level.level);
+ }
+ venc_config_print();
+
+
+ if((codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) ||
+ (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) ||
+ (codec_profile.profile == VEN_PROFILE_H263_BASELINE))
+ recon_buffers_count = MAX_RECON_BUFFERS - 2;
+ else
+ recon_buffers_count = MAX_RECON_BUFFERS;
+
+ buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
+
+ ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type);
+
+ if (ret) {
+ return -1;
+ }
+ else {
+ return 0;
+ }
+}
+
+OMX_U32 venc_dev::pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count)
+{
+ OMX_U32 pmem_fd = -1;
+ OMX_U32 width, height;
+ void *buf_addr = NULL;
+ struct pmem_allocation allocation;
+ struct venc_recon_addr recon_addr;
+ int rc = 0;
+
+#ifdef USE_ION
+ recon_buff[count].ion_device_fd = open (MEM_DEVICE,O_RDONLY|O_DSYNC);
+ if(recon_buff[count].ion_device_fd < 0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: ION Device open() Failed");
+ return -1;
+ }
+
+ recon_buff[count].alloc_data.len = size;
+ recon_buff[count].alloc_data.flags = 0x1 << MEM_HEAP_ID;
+ recon_buff[count].alloc_data.align = clip2(alignment);
+ if (recon_buff[count].alloc_data.align != 8192)
+ recon_buff[count].alloc_data.align = 8192;
+
+ rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_ALLOC,&recon_buff[count].alloc_data);
+ if(rc || !recon_buff[count].alloc_data.handle) {
+ DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
+ recon_buff[count].alloc_data.handle=NULL;
+ return -1;
+ }
+
+ recon_buff[count].ion_alloc_fd.handle = recon_buff[count].alloc_data.handle;
+ rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_MAP,&recon_buff[count].ion_alloc_fd);
+ if(rc) {
+ DEBUG_PRINT_ERROR("\n ION MAP failed ");
+ recon_buff[count].ion_alloc_fd.fd =-1;
+ recon_buff[count].ion_alloc_fd.fd =-1;
+ return -1;
+ }
+ pmem_fd = recon_buff[count].ion_alloc_fd.fd;
+#else
+ pmem_fd = open(MEM_DEVICE, O_RDWR);
+
+ if ((int)(pmem_fd) < 0)
+ {
+ DEBUG_PRINT_ERROR("\n Failed to get an pmem handle");
+ return -1;
+ }
+
+ allocation.size = size;
+ allocation.align = clip2(alignment);
+
+ if (allocation.align != 8192)
+ allocation.align = 8192;
+
+ 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 -1;
+ }
+#endif
+ buf_addr = mmap(NULL, size,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED, pmem_fd, 0);
+
+ if (buf_addr == (void*) MAP_FAILED)
+ {
+ close(pmem_fd);
+ pmem_fd = -1;
+ DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
+#ifdef USE_ION
+ if(ioctl(recon_buff[count].ion_device_fd,ION_IOC_FREE,
+ &recon_buff[count].alloc_data.handle)) {
+ DEBUG_PRINT_ERROR("ion recon buffer free failed");
+ }
+ recon_buff[count].alloc_data.handle = NULL;
+ recon_buff[count].ion_alloc_fd.fd =-1;
+ close(recon_buff[count].ion_device_fd);
+ recon_buff[count].ion_device_fd =-1;
+#endif
+ return -1;
+ }
+
+ DEBUG_PRINT_HIGH("\n Allocated virt:%p, FD: %d of size %d \n", buf_addr, pmem_fd, size);
+
+ recon_addr.buffer_size = size;
+ recon_addr.pmem_fd = pmem_fd;
+ recon_addr.offset = 0;
+ recon_addr.pbuffer = (unsigned char *)buf_addr;
+
+
+ if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_RECON_BUFFER, (void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("Failed to set the Recon_buffers\n");
+ return -1;
+ }
+
+ recon_buff[count].virtual_address = (unsigned char *) buf_addr;
+ recon_buff[count].size = size;
+ recon_buff[count].offset = 0;
+ recon_buff[count].pmem_fd = pmem_fd;
+
+ DEBUG_PRINT_ERROR("\n Allocated virt:%p, FD: %d of size %d at index: %d\n", recon_buff[count].virtual_address,
+ recon_buff[count].pmem_fd, recon_buff[count].size, count);
+ return 0;
+}
+
+OMX_U32 venc_dev::pmem_free()
+{
+ int cnt = 0;
+ struct venc_recon_addr recon_addr;
+ for (cnt = 0; cnt < recon_buffers_count; cnt++)
+ {
+ if(recon_buff[cnt].pmem_fd)
+ {
+ recon_addr.pbuffer = recon_buff[cnt].virtual_address;
+ recon_addr.offset = recon_buff[cnt].offset;
+ recon_addr.pmem_fd = recon_buff[cnt].pmem_fd;
+ recon_addr.buffer_size = recon_buff[cnt].size;
+ if(/*ioctl(m_nDriver_fd, VEN_IOCTL_FREE_RECON_BUFFER ,&ioctl_msg) < */0)
+ DEBUG_PRINT_ERROR("VEN_IOCTL_FREE_RECON_BUFFER failed");
+ munmap(recon_buff[cnt].virtual_address, recon_buff[cnt].size);
+ close(recon_buff[cnt].pmem_fd);
+#ifdef USE_ION
+ if(ioctl(recon_buff[cnt].ion_device_fd,ION_IOC_FREE,
+ &recon_buff[cnt].alloc_data.handle)) {
+ DEBUG_PRINT_ERROR("ion recon buffer free failed");
+ }
+ recon_buff[cnt].alloc_data.handle = NULL;
+ recon_buff[cnt].ion_alloc_fd.fd =-1;
+ close(recon_buff[cnt].ion_device_fd);
+ recon_buff[cnt].ion_device_fd =-1;
+#endif
+ DEBUG_PRINT_LOW("\n cleaning Index %d of size %d \n",cnt,recon_buff[cnt].size);
+ recon_buff[cnt].pmem_fd = -1;
+ recon_buff[cnt].virtual_address = NULL;
+ recon_buff[cnt].offset = 0;
+ recon_buff[cnt].alignment = 0;
+ recon_buff[cnt].size = 0;
+ }
+ }
+ return 0;
+}
+void venc_dev::venc_config_print()
+{
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %d, Profile %d, level : %d",
+ m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
+
+ DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %d, Height:%d, Fps: %d",
+ m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
+ m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %d, RC: %d, I-Period: %d",
+ bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %d, qpP: %d, qpb: %d",
+ session_qp.iframeqp, session_qp.pframqp,session_qp.bframqp);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %d, Slice-Mode: %d, Slize_Size: %d",
+ voptimecfg.voptime_resolution, multislice.mslice_mode,
+ multislice.mslice_size);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %d",
+ entropy.longentropysel, entropy.cabacmodel);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %d, alpha: %d, Beta: %d\n",
+ dbkfilter.db_mode, dbkfilter.slicealpha_offset,
+ dbkfilter.slicebeta_offset);
+
+ DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %d, HEC: %d\n",
+ intra_refresh.mbcount, hec.header_extension);
+}
+
+unsigned venc_dev::venc_flush( unsigned port)
+{
+ struct venc_bufferflush buffer_index;
+
+ if(port == PORT_INDEX_IN)
+ {
+ int rc=0;
+ enum v4l2_buf_type btype;
+ btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ /* STREAMOFF should never fail */
+ printf("\n Failed to call streamoff on OUTPUT Port \n");
+ return -1;
+ }
+
+ return 0;
+ }
+ else if(port == PORT_INDEX_OUT)
+ {
+ int rc=0;
+ enum v4l2_buf_type btype;
+ btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ /* STREAMOFF should never fail */
+ printf("\n Failed to call streamoff on OUTPUT Port \n");
+ return -1;
+ }
+
+ return 0;
+
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+//allocating I/P memory from pmem and register with the device
+
+
+bool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned index)
+{
+
+ struct pmem *pmem_tmp;
+
+ struct v4l2_buffer buf;
+ struct v4l2_plane plane;
+ int rc=0;
+
+ pmem_tmp = (struct pmem *)buf_addr;
+
+ DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
+
+ if(port == PORT_INDEX_IN)
+ {
+
+ buf.index = index;
+ buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane.length = pmem_tmp->size;
+ plane.m.userptr = (unsigned long)pmem_tmp->buffer;
+ plane.reserved[0] = pmem_tmp->fd;
+ plane.reserved[1] = 0;
+ plane.data_offset = pmem_tmp->offset;
+ buf.m.planes = &plane;
+ buf.length = 1;
+
+
+ rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
+
+ if (rc) {
+ printf("VIDIOC_PREPARE_BUF Failed at line 1387 \n");
+ }
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER,&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set input buffer failed ");
+ return false;
+ }
+ }
+ else if(port == PORT_INDEX_OUT)
+ {
+
+ buf.index = index;
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane.length = pmem_tmp->size;
+ plane.m.userptr = (unsigned long)pmem_tmp->buffer;
+ plane.reserved[0] = pmem_tmp->fd;
+ plane.reserved[1] = 0;
+ plane.data_offset = pmem_tmp->offset;
+ buf.m.planes = &plane;
+ buf.length = 1;
+
+ rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
+
+ if (rc) {
+ printf("VIDIOC_PREPARE_BUF Failed at line 1414 \n");
+ }
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set output buffer failed ");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:Invalid Port Index ");
+ return false;
+ }
+
+ return true;
+}
+
+bool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
+{
+ struct pmem *pmem_tmp;
+ struct venc_bufferpayload dev_buffer = {0};
+
+ pmem_tmp = (struct pmem *)buf_addr;
+
+ DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
+
+ if(port == PORT_INDEX_IN)
+ {
+ dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
+ dev_buffer.fd = pmem_tmp->fd;
+ dev_buffer.maped_size = pmem_tmp->size;
+ dev_buffer.sz = pmem_tmp->size;
+ dev_buffer.offset = pmem_tmp->offset;
+ DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
+ dev_buffer.pbuffer, \
+ dev_buffer.fd, \
+ dev_buffer.offset, \
+ dev_buffer.maped_size);
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_INPUT_BUFFER,&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free input buffer failed ");
+ return false;
+ }
+ }
+ else if(port == PORT_INDEX_OUT)
+ {
+ dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
+ dev_buffer.fd = pmem_tmp->fd;
+ dev_buffer.sz = pmem_tmp->size;
+ dev_buffer.maped_size = pmem_tmp->size;
+ dev_buffer.offset = pmem_tmp->offset;
+
+ DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
+ dev_buffer.pbuffer, \
+ dev_buffer.fd, \
+ dev_buffer.offset, \
+ dev_buffer.maped_size);
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_OUTPUT_BUFFER,&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free output buffer failed ");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: venc_free_buf:Invalid Port Index ");
+ return false;
+ }
+
+ return true;
+}
+
+bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
+{
+ struct pmem *temp_buffer;
+
+ struct v4l2_buffer buf;
+ struct v4l2_plane plane;
+ int rc=0;
+ struct OMX_BUFFERHEADERTYPE *bufhdr;
+
+ temp_buffer = (struct pmem *)buffer;
+
+
+ if(buffer == NULL)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
+ return false;
+ }
+ bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
+
+DEBUG_PRINT_LOW("\n Input buffer length %d",bufhdr->nFilledLen);
+
+ if(pmem_data_buf)
+ {
+ DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
+ plane.m.userptr = (unsigned long)pmem_data_buf;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
+ plane.m.userptr = (unsigned long)bufhdr->pBuffer;
+ }
+
+ buf.index = index;
+ buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane.length = bufhdr->nAllocLen;
+ plane.bytesused = bufhdr->nFilledLen;
+ plane.reserved[0] = fd;
+ plane.reserved[1] = 0;
+ plane.data_offset = bufhdr->nOffset;
+ buf.m.planes = &plane;
+ buf.length = 1;
+
+
+ rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
+ if (rc) {
+ printf("Failed to qbuf to driver");
+ return false;
+ }
+
+ etb_count++;
+
+ if(etb_count == 1)
+ {
+ enum v4l2_buf_type buf_type;
+ buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ int ret;
+ ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
+ if (ret) {
+ printf("Failed to call streamon\n");
+ }
+
+ }
+
+ if(/*ioctl(m_nDriver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < */0)
+ {
+ /*Generate an async error and move to invalid state*/
+ return false;
+ }
+#ifdef INPUT_BUFFER_LOG
+
+ int y_size = 0;
+ int c_offset = 0;
+
+ y_size = m_sVenc_cfg.input_width * m_sVenc_cfg.input_height;
+ //chroma offset is y_size aligned to the 2k boundary
+ c_offset= (y_size + 2047) & (~(2047));
+
+ if(inputBufferFile1)
+ {
+ fwrite((const char *)frameinfo.ptrbuffer, y_size, 1,inputBufferFile1);
+ fwrite((const char *)(frameinfo.ptrbuffer + c_offset), (y_size>>1), 1,inputBufferFile1);
+ }
+#endif
+
+ return true;
+}
+bool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
+{
+
+ struct pmem *temp_buffer = NULL;
+ struct venc_buffer frameinfo;
+ struct v4l2_buffer buf;
+ struct v4l2_plane plane;
+ int rc=0;
+ struct OMX_BUFFERHEADERTYPE *bufhdr;
+
+ if(buffer == NULL)
+ {
+ return false;
+ }
+ bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
+
+if(pmem_data_buf)
+ {
+ DEBUG_PRINT_LOW("\n Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
+ plane.m.userptr = (unsigned long)pmem_data_buf;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
+ plane.m.userptr = (unsigned long)bufhdr->pBuffer;
+ }
+
+ buf.index = index;
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ buf.memory = V4L2_MEMORY_USERPTR;
+ plane.length = bufhdr->nAllocLen;
+ plane.bytesused = bufhdr->nFilledLen;
+ plane.reserved[0] = fd;
+ plane.reserved[1] = 0;
+ plane.data_offset = bufhdr->nOffset;
+ buf.m.planes = &plane;
+ buf.length = 1;
+
+ rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
+ if (rc) {
+ printf("Failed to qbuf to driver");
+ return false;
+ }
+
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed");
+ return false;
+ }
+
+ return true;
+}
+
+bool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp)
+{
+ int rc;
+ struct v4l2_control control;
+
+ control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
+ control.value = i_frame_qp;
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+ session_qp.iframeqp = control.value;
+
+ control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
+ control.value = p_frame_qp;
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+ session_qp.pframqp = control.value;
+
+ if((codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) ||
+ (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH))
+ {
+
+ control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
+ control.value = b_frame_qp;
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+ session_qp.bframqp = control.value;
+ }
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_SESSION_QP,(void*)&ioctl_msg)< */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting session qp failed");
+ return false;
+ }
+ return true;
+}
+
+bool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
+{
+ struct venc_profile requested_profile;
+ struct ven_profilelevel requested_level;
+ unsigned const int *profile_tbl = NULL;
+ unsigned long mb_per_frame = 0, mb_per_sec = 0;
+ DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %d, Level = %d",
+ eProfile, eLevel);
+ mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
+ ((m_sVenc_cfg.input_width + 15) >> 4);
+ if((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set)
+ {
+ DEBUG_PRINT_LOW("\n Profile/Level setting complete before venc_start");
+ return true;
+ }
+
+ DEBUG_PRINT_LOW("\n Validating Profile/Level from table");
+ if(!venc_validate_profile_level(&eProfile, &eLevel))
+ {
+ DEBUG_PRINT_LOW("\nERROR: Profile/Level validation failed");
+ return false;
+ }
+
+ if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
+ {
+ DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
+ "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
+ OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
+ if(eProfile == OMX_VIDEO_MPEG4ProfileSimple)
+ {
+ requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
+ profile_tbl = (unsigned int const *)
+ (&mpeg4_profile_level_table[MPEG4_SP_START]);
+ profile_tbl += MPEG4_720P_LEVEL*5;
+ }
+ else if(eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
+ {
+ requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE;
+ profile_tbl = (unsigned int const *)
+ (&mpeg4_profile_level_table[MPEG4_ASP_START]);
+ profile_tbl += MPEG4_720P_LEVEL*5;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\nERROR: Unsupported MPEG4 profile = %u",
+ eProfile);
+ return false;
+ }
+
+ DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
+ "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
+ "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
+ OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
+
+ if(mb_per_frame >= 3600)
+ {
+ if(requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+ if(requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+ }
+ else
+ {
+ switch(eLevel)
+ {
+ case OMX_VIDEO_MPEG4Level0:
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0;
+ break;
+ case OMX_VIDEO_MPEG4Level0b:
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B;
+ break;
+ case OMX_VIDEO_MPEG4Level1:
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_1;
+ break;
+ case OMX_VIDEO_MPEG4Level2:
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
+ break;
+ case OMX_VIDEO_MPEG4Level3:
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_3;
+ break;
+ case OMX_VIDEO_MPEG4Level4a:
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_4;
+ break;
+ case OMX_VIDEO_MPEG4Level5:
+ mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
+ if((requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) && (mb_per_frame >= profile_tbl[0]) &&
+ (mb_per_sec >= profile_tbl[1]))
+ {
+ DEBUG_PRINT_LOW("\nMPEG4 Level 6 is set for 720p resolution");
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\nMPEG4 Level 5 is set for non-720p resolution");
+ requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+ }
+ break;
+ default:
+ return false;
+ // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
+ break;
+ }
+ }
+ }
+ else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
+ {
+ if(eProfile == OMX_VIDEO_H263ProfileBaseline)
+ {
+ requested_profile.profile = VEN_PROFILE_H263_BASELINE;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\nERROR: Unsupported H.263 profile = %u",
+ requested_profile.profile);
+ return false;
+ }
+ //profile level
+ switch(eLevel)
+ {
+ case OMX_VIDEO_H263Level10:
+ requested_level.level = VEN_LEVEL_H263_10;
+ break;
+ case OMX_VIDEO_H263Level20:
+ requested_level.level = VEN_LEVEL_H263_20;
+ break;
+ case OMX_VIDEO_H263Level30:
+ requested_level.level = VEN_LEVEL_H263_30;
+ break;
+ case OMX_VIDEO_H263Level40:
+ requested_level.level = VEN_LEVEL_H263_40;
+ break;
+ case OMX_VIDEO_H263Level45:
+ requested_level.level = VEN_LEVEL_H263_45;
+ break;
+ case OMX_VIDEO_H263Level50:
+ requested_level.level = VEN_LEVEL_H263_50;
+ break;
+ case OMX_VIDEO_H263Level60:
+ requested_level.level = VEN_LEVEL_H263_60;
+ break;
+ case OMX_VIDEO_H263Level70:
+ requested_level.level = VEN_LEVEL_H263_70;
+ break;
+ default:
+ return false;
+ break;
+ }
+ }
+ else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
+ {
+ if(eProfile == OMX_VIDEO_AVCProfileBaseline)
+ {
+ requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
+ }
+ else if(eProfile == OMX_VIDEO_AVCProfileMain)
+ {
+ requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN;
+ }
+ else if(eProfile == OMX_VIDEO_AVCProfileExtended)
+ {
+ requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED;
+ }
+ else if(eProfile == OMX_VIDEO_AVCProfileHigh)
+ {
+ requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
+ }
+ else if(eProfile == OMX_VIDEO_AVCProfileHigh10)
+ {
+ requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10;
+ }
+ else if(eProfile == OMX_VIDEO_AVCProfileHigh422)
+ {
+ requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422;
+ }
+ else if(eProfile == OMX_VIDEO_AVCProfileHigh444)
+ {
+ requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\nERROR: Unsupported H.264 profile = %u",
+ requested_profile.profile);
+ return false;
+ }
+ //profile level
+ switch(eLevel)
+ {
+ case OMX_VIDEO_AVCLevel1:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
+ break;
+ case OMX_VIDEO_AVCLevel1b:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1B;
+ break;
+ case OMX_VIDEO_AVCLevel11:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
+ break;
+ case OMX_VIDEO_AVCLevel12:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_2;
+ break;
+ case OMX_VIDEO_AVCLevel13:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_3;
+ break;
+ case OMX_VIDEO_AVCLevel2:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_0;
+ break;
+ case OMX_VIDEO_AVCLevel21:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
+ break;
+ case OMX_VIDEO_AVCLevel22:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
+ break;
+ case OMX_VIDEO_AVCLevel3:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_0;
+ break;
+ case OMX_VIDEO_AVCLevel31:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
+ break;
+ case OMX_VIDEO_AVCLevel32:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
+ break;
+ case OMX_VIDEO_AVCLevel4:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
+ break;
+ case OMX_VIDEO_AVCLevel41:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
+ break;
+ case OMX_VIDEO_AVCLevel42:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
+ break;
+ case OMX_VIDEO_AVCLevel5:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
+ break;
+ case OMX_VIDEO_AVCLevel51:
+ requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
+ break;
+ default :
+ DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %u",
+ requested_level.level);
+ return false;
+ break;
+ }
+ }
+ if(!m_profile_set)
+ {
+ int rc;
+ struct v4l2_control control;
+
+ control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
+ control.value = requested_profile.profile;
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_CODEC_PROFILE,(void*)&ioctl_msg)< */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting profile failed");
+ return false;
+ }
+ codec_profile.profile = control.value;
+ m_profile_set = true;
+ }
+
+ if(!m_level_set)
+ {
+ int rc;
+ struct v4l2_control control;
+ control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
+ control.value = requested_level.level;
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,(void*)&ioctl_msg)< */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting profile level failed");
+ return false;
+ }
+ profile_level.level = control.value;
+ m_level_set = true;
+ }
+
+ return true;
+}
+
+bool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
+{
+
+ struct venc_voptimingcfg vop_timing_cfg;
+
+ DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
+ TimeIncRes);
+
+ vop_timing_cfg.voptime_resolution = TimeIncRes;
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_VOP_TIMING_CFG,(void*)&ioctl_msg)< */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Vop Timing failed");
+ return false;
+ }
+
+ voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
+ return true;
+}
+
+bool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
+{
+
+ DEBUG_PRINT_LOW("\n venc_set_intra_period: nPFrames = %u",
+ nPFrames);
+ int rc;
+ struct v4l2_control control;
+ if((codec_profile.profile != V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) &&
+ (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) &&
+ (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH))
+ {
+ nBFrames=0;
+ }
+
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
+ control.value = nPFrames;
+
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+ intra_period.num_pframes = control.value;
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
+ control.value = nBFrames;
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_PERIOD,(void*)&ioctl_msg)< */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
+ return false;
+ }
+ intra_period.num_bframes = control.value;
+ return true;
+}
+
+bool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
+{
+ //struct venc_entropycfg entropy_cfg;
+
+ // memset(&entropy_cfg,0,sizeof(entropy_cfg));
+ int rc;
+ struct v4l2_control control;
+
+ DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
+
+ if(enable &&(codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE)){
+
+ control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC;
+ control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+ entropy.longentropysel = control.value;
+ if (i_cabac_level == 0) {
+ control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0;
+ }
+ else if (i_cabac_level == 1) {
+ control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1;
+ }
+ else if (i_cabac_level == 2) {
+ control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2;
+ }
+
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL;
+ //control.value = entropy_cfg.cabacmodel;
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+ entropy.longentropysel=control.value;
+ }
+ else if(!enable){
+ control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
+ control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+ entropy.longentropysel=control.value;
+ //entropy_cfg.longentropysel = control.value;
+ }
+ else{
+ DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
+ return false;
+ }
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_ENTROPY_CFG,(void*)&ioctl_msg)< */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting entropy config failed");
+ return false;
+ }
+ //entropy.longentropysel = entropy_cfg.longentropysel;
+ //entropy.cabacmodel = entropy_cfg.cabacmodel;
+ return true;
+}
+
+bool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
+{
+ int rc;
+ struct v4l2_control control;
+ bool status = true;
+ //struct venc_multiclicecfg multislice_cfg;
+
+ if((Codec != OMX_IndexParamVideoH263) && (nSlicesize)){
+ // multislice_cfg.mslice_mode = VEN_MSLICE_CNT_MB;
+ //multislice_cfg.mslice_size = nSlicesize;
+ control.value = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
+ }
+ else{
+ control.value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
+ //multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
+ //multislice_cfg.mslice_size = 0;
+ }
+ control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+ multislice.mslice_mode=control.value;
+
+ if(multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE){
+
+ control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
+ control.value = nSlicesize;
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+ multislice.mslice_size=control.value;
+
+ }
+
+
+ if(/*ioctl (m_nDriver_fd, VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
+ status = false;
+ }
+ else
+ {
+ //multislice.mslice_mode = multislice_cfg.mslice_mode;
+ //multislice.mslice_size = nSlicesize;
+ }
+ return status;
+}
+
+bool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
+{
+ bool status = true;
+ int rc;
+ struct v4l2_control control_mode,control_mbs;
+ control_mode.id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE;
+ // There is no disabled mode. Disabled mode is indicated by a 0 count.
+ if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax)
+ {
+ control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE;
+ }
+ else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
+ (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
+ {
+ control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC;
+ control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS;
+ control_mbs.value=irMBs;
+ }
+ else if ((ir_mode == OMX_VIDEO_IntraRefreshAdaptive) &&
+ (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
+ {
+ control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_ADAPTIVE;
+ control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS;
+ control_mbs.value=irMBs;
+ }
+ else if ((ir_mode == OMX_VIDEO_IntraRefreshBoth) &&
+ (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
+ {
+ control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC_ADAPTIVE;
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
+ "mb count: %d, mb mode:%d", irMBs, ir_mode);
+ return false;
+ }
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control_mode.id, control_mode.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control_mode.id, control_mode.value);
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control_mbs.id, control_mbs.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mbs);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control_mbs.id, control_mbs.value);
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_REFRESH,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra Refresh failed");
+ status = false;
+ }
+ else
+ {
+ intra_refresh.irmode = control_mode.value;
+ intra_refresh.mbcount = control_mbs.value;
+ }
+ return status;
+}
+
+bool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
+{
+ bool status = true;
+ struct venc_headerextension hec_cfg;
+ struct venc_multiclicecfg multislice_cfg;
+
+ if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
+ if (error_resilience->bEnableHEC) {
+ hec_cfg.header_extension = 1;
+ }
+ else {
+ hec_cfg.header_extension = 0;
+ }
+
+ if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_HEC,(void*)&ioctl_msg) < */0) {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting HEader Error correction failed");
+ return false;
+ }
+ hec.header_extension = error_resilience->bEnableHEC;
+ }
+
+ if (error_resilience->bEnableRVLC) {
+ DEBUG_PRINT_ERROR("\n RVLC is not Supported");
+ return false;
+ }
+
+ if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
+ (error_resilience->bEnableDataPartitioning)) {
+ DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
+ return false;
+ }
+
+ if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
+ (error_resilience->nResynchMarkerSpacing)) {
+ multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
+ multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
+ }
+ else if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingH263 &&
+ error_resilience->bEnableDataPartitioning) {
+ multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
+ multislice_cfg.mslice_size = 0;
+ }
+ else {
+ multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
+ multislice_cfg.mslice_size = 0;
+ }
+ DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
+ multislice_cfg.mslice_size);
+ if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < */0) {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
+ status = false;
+ }
+ else
+ {
+ multislice.mslice_mode = multislice_cfg.mslice_mode ;
+ multislice.mslice_size = multislice_cfg.mslice_size;
+
+ }
+ return status;
+}
+
+bool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
+{
+ int rc;
+ struct v4l2_control control;
+ control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE;
+ if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable){
+ control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED;
+ }
+ else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisable){
+ control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED;
+ }
+ else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary){
+ control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY;
+ }
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+ dbkfilter.db_mode=control.value;
+
+ control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA;
+ control.value=0;
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+ control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA;
+ control.value=0;
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_DEBLOCKING_CFG,(void*)&ioctl_msg)< */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting inloop filter failed");
+ return false;
+ }
+
+ dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
+ return true;
+}
+
+bool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
+{
+ DEBUG_PRINT_LOW("\n venc_set_target_bitrate: bitrate = %u",
+ nTargetBitrate);
+ struct v4l2_control control;
+ int rc;
+ control.id = V4L2_CID_MPEG_VIDEO_BITRATE;
+ control.value = nTargetBitrate/1000;
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_TARGET_BITRATE,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting bit rate failed");
+ return false;
+ }
+ m_sVenc_cfg.targetbitrate = control.value*1000;
+ bitrate.target_bitrate = control.value*1000;
+ if(!config)
+ {
+ m_level_set = false;
+ if(venc_set_profile_level(0, 0))
+ {
+ DEBUG_PRINT_HIGH("Calling set level (Bitrate) with %d\n",profile_level.level);
+ }
+ }
+ return true;
+}
+
+bool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
+{
+
+ struct v4l2_control control;
+ int rc;
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_FRAME_RATE;
+ control.value = encode_framerate;
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+ if(//ioctl(m_nDriver_fd, VEN_IOCTL_SET_FRAME_RATE,
+ /*(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting framerate failed");
+ return false;
+ }
+
+ m_sVenc_cfg.fps_den = 1;
+ m_sVenc_cfg.fps_num = control.value;
+ if(!config)
+ {
+ m_level_set = false;
+ if(venc_set_profile_level(0, 0))
+ {
+ DEBUG_PRINT_HIGH("Calling set level (Framerate) with %d\n",profile_level.level);
+ }
+ }
+ return true;
+}
+
+bool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
+{
+ DEBUG_PRINT_LOW("\n venc_set_color_format: color_format = %u ", color_format);
+
+ if(color_format == OMX_COLOR_FormatYUV420SemiPlanar)
+ {
+ m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
+ m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
+ DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
+ }
+ if (/*ioctl(m_nDriver_fd, VEN_IOCTL_SET_BASE_CFG, (void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting color format failed");
+ return false;
+ }
+ return true;
+}
+
+bool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
+{
+ DEBUG_PRINT_LOW("\n venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
+ if(intra_vop_refresh == OMX_TRUE)
+ {
+ if(/*ioctl(m_nDriver_fd, VEN_IOCTL_CMD_REQUEST_IFRAME, NULL) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra VOP Refresh failed");
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
+ }
+ return true;
+}
+
+bool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
+{
+ bool status = true;
+ struct v4l2_control control;
+ int rc;
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
+ switch(eControlRate)
+ {
+ case OMX_Video_ControlRateDisable:
+ control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
+ break;
+ case OMX_Video_ControlRateVariableSkipFrames:
+ control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR;
+ break;
+ case OMX_Video_ControlRateVariable:
+ control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR;
+ break;
+ case OMX_Video_ControlRateConstantSkipFrames:
+ control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR;
+ break;
+ case OMX_Video_ControlRateConstant:
+ control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR;
+ break;
+ default:
+ status = false;
+ break;
+ }
+
+ if(status)
+ {
+
+ printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc) {
+ printf("Failed to set control\n");
+ return false;
+ }
+ printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
+
+
+ if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,(void*)&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR("\nERROR: Request for setting rate control failed");
+ status = false;
+ }
+ else
+ rate_ctrl.rcmode = control.value;
+ }
+ return status;
+}
+
+bool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
+{
+ bool status = true;
+ if(eProfile == NULL || eLevel == NULL)
+ {
+ return false;
+ }
+
+ if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
+ {
+ switch(codec_profile.profile)
+ {
+ case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
+ *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+ break;
+ case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
+ *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+ break;
+ default:
+ *eProfile = OMX_VIDEO_MPEG4ProfileMax;
+ status = false;
+ break;
+ }
+
+ if(!status)
+ {
+ return status;
+ }
+
+ //profile level
+ switch(profile_level.level)
+ {
+ case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0:
+ *eLevel = OMX_VIDEO_MPEG4Level0;
+ break;
+ case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B:
+ *eLevel = OMX_VIDEO_MPEG4Level0b;
+ break;
+ case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1:
+ *eLevel = OMX_VIDEO_MPEG4Level1;
+ break;
+ case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2:
+ *eLevel = OMX_VIDEO_MPEG4Level2;
+ break;
+ case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3:
+ *eLevel = OMX_VIDEO_MPEG4Level3;
+ break;
+ case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4:
+ *eLevel = OMX_VIDEO_MPEG4Level4;
+ break;
+ case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5:
+ *eLevel = OMX_VIDEO_MPEG4Level5;
+ break;
+ default:
+ *eLevel = OMX_VIDEO_MPEG4LevelMax;
+ status = false;
+ break;
+ }
+ }
+ else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
+ {
+ if(codec_profile.profile == VEN_PROFILE_H263_BASELINE)
+ {
+ *eProfile = OMX_VIDEO_H263ProfileBaseline;
+ }
+ else
+ {
+ *eProfile = OMX_VIDEO_H263ProfileMax;
+ return false;
+ }
+ switch(profile_level.level)
+ {
+ case VEN_LEVEL_H263_10:
+ *eLevel = OMX_VIDEO_H263Level10;
+ break;
+ case VEN_LEVEL_H263_20:
+ *eLevel = OMX_VIDEO_H263Level20;
+ break;
+ case VEN_LEVEL_H263_30:
+ *eLevel = OMX_VIDEO_H263Level30;
+ break;
+ case VEN_LEVEL_H263_40:
+ *eLevel = OMX_VIDEO_H263Level40;
+ break;
+ case VEN_LEVEL_H263_45:
+ *eLevel = OMX_VIDEO_H263Level45;
+ break;
+ case VEN_LEVEL_H263_50:
+ *eLevel = OMX_VIDEO_H263Level50;
+ break;
+ case VEN_LEVEL_H263_60:
+ *eLevel = OMX_VIDEO_H263Level60;
+ break;
+ case VEN_LEVEL_H263_70:
+ *eLevel = OMX_VIDEO_H263Level70;
+ break;
+ default:
+ *eLevel = OMX_VIDEO_H263LevelMax;
+ status = false;
+ break;
+ }
+ }
+ else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
+ {
+ switch(codec_profile.profile)
+ {
+ case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
+ *eProfile = OMX_VIDEO_AVCProfileBaseline;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
+ *eProfile = OMX_VIDEO_AVCProfileMain;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
+ *eProfile = OMX_VIDEO_AVCProfileHigh;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
+ *eProfile = OMX_VIDEO_AVCProfileExtended;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
+ *eProfile = OMX_VIDEO_AVCProfileHigh10;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
+ *eProfile = OMX_VIDEO_AVCProfileHigh422;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
+ *eProfile = OMX_VIDEO_AVCProfileHigh444;
+ break;
+ default:
+ *eProfile = OMX_VIDEO_AVCProfileMax;
+ status = false;
+ break;
+ }
+
+ if(!status)
+ {
+ return status;
+ }
+
+ switch(profile_level.level)
+ {
+ case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
+ *eLevel = OMX_VIDEO_AVCLevel1;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
+ *eLevel = OMX_VIDEO_AVCLevel1b;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
+ *eLevel = OMX_VIDEO_AVCLevel11;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
+ *eLevel = OMX_VIDEO_AVCLevel12;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
+ *eLevel = OMX_VIDEO_AVCLevel13;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
+ *eLevel = OMX_VIDEO_AVCLevel2;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
+ *eLevel = OMX_VIDEO_AVCLevel21;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
+ *eLevel = OMX_VIDEO_AVCLevel22;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
+ *eLevel = OMX_VIDEO_AVCLevel3;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
+ *eLevel = OMX_VIDEO_AVCLevel31;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
+ *eLevel = OMX_VIDEO_AVCLevel32;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
+ *eLevel = OMX_VIDEO_AVCLevel4;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
+ *eLevel = OMX_VIDEO_AVCLevel41;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
+ *eLevel = OMX_VIDEO_AVCLevel42;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
+ *eLevel = OMX_VIDEO_AVCLevel5;
+ break;
+ case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
+ *eLevel = OMX_VIDEO_AVCLevel51;
+ break;
+ default :
+ *eLevel = OMX_VIDEO_AVCLevelMax;
+ status = false;
+ break;
+ }
+ }
+ return status;
+}
+
+bool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
+{
+ OMX_U32 new_profile = 0, new_level = 0;
+ unsigned const int *profile_tbl = NULL;
+ OMX_U32 mb_per_frame, mb_per_sec;
+ bool profile_level_found = false;
+
+ DEBUG_PRINT_LOW("\n Init profile table for respective codec");
+ //validate the ht,width,fps,bitrate and set the appropriate profile and level
+ if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
+ {
+ if(*eProfile == 0)
+ {
+ if(!m_profile_set)
+ {
+ *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+ }
+ else
+ {
+ switch(codec_profile.profile)
+ {
+ case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
+ *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
+ break;
+ case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
+ *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
+ break;
+ default:
+ DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+ return false;
+ }
+ }
+ }
+
+ if(*eLevel == 0 && !m_level_set)
+ {
+ *eLevel = OMX_VIDEO_MPEG4LevelMax;
+ }
+
+ if(*eProfile == OMX_VIDEO_MPEG4ProfileSimple)
+ {
+ profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
+ }
+ else if(*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
+ {
+ profile_tbl = (unsigned int const *)
+ (&mpeg4_profile_level_table[MPEG4_ASP_START]);
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Unsupported MPEG4 profile type %lu", *eProfile);
+ return false;
+ }
+ }
+ else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
+ {
+ if(*eProfile == 0)
+ {
+ if(!m_profile_set)
+ {
+ *eProfile = OMX_VIDEO_AVCProfileBaseline;
+ }
+ else
+ {
+ switch(codec_profile.profile)
+ {
+ case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
+ *eProfile = OMX_VIDEO_AVCProfileBaseline;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
+ *eProfile = OMX_VIDEO_AVCProfileMain;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
+ *eProfile = OMX_VIDEO_AVCProfileExtended;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
+ *eProfile = OMX_VIDEO_AVCProfileHigh;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
+ *eProfile = OMX_VIDEO_AVCProfileHigh10;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
+ *eProfile = OMX_VIDEO_AVCProfileHigh422;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
+ *eProfile = OMX_VIDEO_AVCProfileHigh444;
+ break;
+ default:
+ DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+ return false;
+ }
+ }
+ }
+
+ if(*eLevel == 0 && !m_level_set)
+ {
+ *eLevel = OMX_VIDEO_AVCLevelMax;
+ }
+
+ if(*eProfile == OMX_VIDEO_AVCProfileBaseline)
+ {
+ profile_tbl = (unsigned int const *)h264_profile_level_table;
+ }
+ else if(*eProfile == OMX_VIDEO_AVCProfileHigh)
+ {
+ profile_tbl = (unsigned int const *)
+ (&h264_profile_level_table[H264_HP_START]);
+ }
+ else if(*eProfile == OMX_VIDEO_AVCProfileMain)
+ {
+ profile_tbl = (unsigned int const *)
+ (&h264_profile_level_table[H264_MP_START]);
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Unsupported AVC profile type %lu", *eProfile);
+ return false;
+ }
+ }
+ else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
+ {
+ if(*eProfile == 0)
+ {
+ if(!m_profile_set)
+ {
+ *eProfile = OMX_VIDEO_H263ProfileBaseline;
+ }
+ else
+ {
+ switch(codec_profile.profile)
+ {
+ case VEN_PROFILE_H263_BASELINE:
+ *eProfile = OMX_VIDEO_H263ProfileBaseline;
+ break;
+ default:
+ DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
+ return false;
+ }
+ }
+ }
+
+ if(*eLevel == 0 && !m_level_set)
+ {
+ *eLevel = OMX_VIDEO_H263LevelMax;
+ }
+
+ if(*eProfile == OMX_VIDEO_H263ProfileBaseline)
+ {
+ profile_tbl = (unsigned int const *)h263_profile_level_table;
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Unsupported H.263 profile type %lu", *eProfile);
+ return false;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_LOW("\n Invalid codec type");
+ return false;
+ }
+
+ mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
+ ((m_sVenc_cfg.input_width + 15)>> 4);
+
+ if((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4))
+ {
+ if(codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
+ profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+ if(codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
+ profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
+ {
+ new_level = profile_level.level;
+ new_profile = codec_profile.profile;
+ return true;
+ }
+ }
+
+ mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
+
+ do{
+ if(mb_per_frame <= (int)profile_tbl[0])
+ {
+ if(mb_per_sec <= (int)profile_tbl[1])
+ {
+ if(m_sVenc_cfg.targetbitrate <= (int)profile_tbl[2])
+ {
+ new_level = (int)profile_tbl[3];
+ new_profile = (int)profile_tbl[4];
+ profile_level_found = true;
+ DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
+ break;
+ }
+ }
+ }
+ profile_tbl = profile_tbl + 5;
+ }while(profile_tbl[0] != 0);
+
+ if (profile_level_found != true)
+ {
+ DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
+ return false;
+ }
+
+ if((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
+ || (*eLevel == OMX_VIDEO_H263LevelMax))
+ {
+ *eLevel = new_level;
+ }
+ DEBUG_PRINT_HIGH("%s: Returning with eProfile = %lu"
+ "Level = %lu", __func__, *eProfile, *eLevel);
+
+ return true;
+}
+#ifdef _ANDROID_ICS_
+bool venc_dev::venc_set_meta_mode(bool mode)
+{
+ if(/*ioctl(m_nDriver_fd,VEN_IOCTL_SET_METABUFFER_MODE,&ioctl_msg) < */0)
+ {
+ DEBUG_PRINT_ERROR(" Set meta buffer mode failed");
+ return false;
+ }
+ return true;
+}
+#endif
diff --git a/mm-video/vidc/venc/test/camera_test.cpp b/mm-video/vidc/venc/test/camera_test.cpp
index fbbc409f..bb3e73cb 100644..100755
--- a/mm-video/vidc/venc/test/camera_test.cpp
+++ b/mm-video/vidc/venc/test/camera_test.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/venc/test/fb_test.c b/mm-video/vidc/venc/test/fb_test.c
index 258218e6..06e6f2f5 100644..100755
--- a/mm-video/vidc/venc/test/fb_test.c
+++ b/mm-video/vidc/venc/test/fb_test.c
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/venc/test/queue.c b/mm-video/vidc/venc/test/queue.c
index 3f17c9e7..f645720b 100644..100755
--- a/mm-video/vidc/venc/test/queue.c
+++ b/mm-video/vidc/venc/test/queue.c
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/venc/test/venc_test.cpp b/mm-video/vidc/venc/test/venc_test.cpp
index e3a0d034..c2749861 100644..100755
--- a/mm-video/vidc/venc/test/venc_test.cpp
+++ b/mm-video/vidc/venc/test/venc_test.cpp
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -52,12 +52,12 @@ REFERENCES
//#include <sys/time.h>
#include <time.h>
#include <sys/ioctl.h>
+#include <limits.h>
#include <string.h>
//#include <sys/stat.h>
#include "OMX_QCOMExtns.h"
#include "OMX_Core.h"
-
#define QCOM_EXT 1
#include "OMX_Core.h"
@@ -66,6 +66,10 @@ REFERENCES
#include "camera_test.h"
#include "fb_test.h"
#include "venc_util.h"
+#include "extra_data_handler.h"
+#ifdef USE_ION
+#include <ion_msm.h>
+#endif
//////////////////////////
// MACROS
@@ -76,12 +80,12 @@ REFERENCES
#ifdef VENC_SYSLOG
#include "cutils/log.h"
/// Debug message macro
-#define D(fmt, ...) ALOGE("venc_test Debug %s::%d "fmt"\n", \
+#define D(fmt, ...) LOGE("venc_test Debug %s::%d "fmt"\n", \
__FUNCTION__, __LINE__, \
## __VA_ARGS__)
/// Error message macro
-#define E(fmt, ...) ALOGE("venc_test Error %s::%d "fmt"\n", \
+#define E(fmt, ...) LOGE("venc_test Error %s::%d "fmt"\n", \
__FUNCTION__, __LINE__, \
## __VA_ARGS__)
@@ -122,21 +126,21 @@ static const unsigned int mpeg4_profile_level_table[][5]=
{
/*max mb per frame, max mb per sec, max bitrate, level, profile*/
{99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
- {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
+ {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
{396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
{396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
{1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
{1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
- {3600,108000,14000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
+ {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
+ {0,0,0,0,0},
- {99,2970,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
- {99,2970,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
+ {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
{396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
{396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
{792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
{1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
- {3600,108000,14000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
- {0 ,0 ,0 ,0 ,0 }
+ {0,0,0,0,0},
};
/* H264 profile and level table*/
@@ -153,6 +157,9 @@ static const unsigned int h264_profile_level_table[][5]=
{1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
{1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
{3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
+ {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
+ {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
+ {0,0,0,0,0},
{99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
{99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
@@ -164,7 +171,24 @@ static const unsigned int h264_profile_level_table[][5]=
{1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
{1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
{3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
- {0 ,0 ,0 ,0 }
+ {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
+ {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
+ {0,0,0,0,0},
+
+ {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
+ {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
+ {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
+ {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
+ {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
+ {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
+ {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
+ {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
+ {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
+ {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
+ {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
+ {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
+ {0,0,0,0,0}
+
};
/* H263 profile and level table*/
@@ -179,9 +203,12 @@ static const unsigned int h263_profile_level_table[][5]=
{396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
{810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
{1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
- {0 , 0 , 0 , 0 }
+ {0,0,0,0,0}
};
+#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } }
+#define FractionToQ16(q,num,den) { OMX_U32 power; Log2(den,power); q = num << (16 - power); }
+
//////////////////////////
// TYPES
//////////////////////////
@@ -194,10 +221,16 @@ struct ProfileType
OMX_U32 nFrameWidth;
OMX_U32 nFrameHeight;
OMX_U32 nFrameBytes;
+#ifdef BADGER
+ OMX_U32 nFramestride;
+ OMX_U32 nFrameScanlines;
+ OMX_U32 nFrameRead;
+#endif
OMX_U32 nBitrate;
- OMX_U32 nFramerate;
+ float nFramerate;
char* cInFileName;
char* cOutFileName;
+ OMX_U32 nUserProfile;
};
enum MsgId
@@ -234,6 +267,41 @@ enum Mode
MODE_LIVE_ENCODE
};
+enum ResyncMarkerType
+{
+ RESYNC_MARKER_NONE, ///< No resync marker
+ RESYNC_MARKER_BYTE, ///< BYTE Resync marker for MPEG4, H.264
+ RESYNC_MARKER_MB, ///< MB resync marker for MPEG4, H.264
+ RESYNC_MARKER_GOB ///< GOB resync marker for H.263
+};
+
+union DynamicConfigData
+{
+ OMX_VIDEO_CONFIG_BITRATETYPE bitrate;
+ OMX_CONFIG_FRAMERATETYPE framerate;
+ QOMX_VIDEO_INTRAPERIODTYPE intraperiod;
+ OMX_CONFIG_INTRAREFRESHVOPTYPE intravoprefresh;
+ OMX_CONFIG_ROTATIONTYPE rotation;
+ float f_framerate;
+};
+
+struct DynamicConfig
+{
+ bool pending;
+ unsigned frame_num;
+ OMX_INDEXTYPE config_param;
+ union DynamicConfigData config_data;
+};
+
+#ifdef USE_ION
+struct enc_ion
+{
+ int ion_device_fd;
+ struct ion_allocation_data alloc_data;
+ struct ion_fd_data ion_alloc_fd;
+};
+#endif
+
//////////////////////////
// MODULE VARS
//////////////////////////
@@ -259,13 +327,29 @@ static int m_nTimeStamp = 0;
static int m_nFrameIn = 0; // frames pushed to encoder
static int m_nFrameOut = 0; // frames returned by encoder
static int m_nAVCSliceMode = 0;
-
static bool m_bWatchDogKicked = false;
+FILE *m_pDynConfFile = NULL;
+static struct DynamicConfig dynamic_config;
/* Statistics Logging */
static long long tot_bufsize = 0;
int ebd_cnt=0, fbd_cnt=0;
+#ifdef USE_ION
+static const char* PMEM_DEVICE = "/dev/ion";
+#elif MAX_RES_720P
+static const char* PMEM_DEVICE = "/dev/pmem_adsp";
+#elif MAX_RES_1080P_EBI
+static const char* PMEM_DEVICE = "/dev/pmem_adsp";
+#elif MAX_RES_1080P
+static const char* PMEM_DEVICE = "/dev/pmem_smipool";
+#else
+#error PMEM_DEVICE cannot be determined.
+#endif
+
+#ifdef USE_ION
+struct enc_ion ion_data;
+#endif
//////////////////////////
// MODULE FUNCTIONS
//////////////////////////
@@ -273,14 +357,45 @@ int ebd_cnt=0, fbd_cnt=0;
void* PmemMalloc(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem, int nSize)
{
void *pvirt = NULL;
+ int rc = 0;
if (!pMem)
return NULL;
- pMem->pmem_fd = open("/dev/pmem_adsp", O_RDWR | O_SYNC);
+#ifdef USE_ION
+ ion_data.ion_device_fd = open (PMEM_DEVICE,O_RDONLY/*|O_DSYNC*/);
+ if(ion_data.ion_device_fd < 0)
+ {
+ E("\nERROR: ION Device open() Failed");
+ return NULL;
+ }
+ nSize = (nSize + 4095) & (~4095);
+ ion_data.alloc_data.len = nSize;
+ ion_data.alloc_data.flags = 0x1 << ION_CP_MM_HEAP_ID;
+ ion_data.alloc_data.align = 4096;
+
+ rc = ioctl(ion_data.ion_device_fd,ION_IOC_ALLOC,&ion_data.alloc_data);
+ if(rc || !ion_data.alloc_data.handle) {
+ E("\n ION ALLOC memory failed ");
+ ion_data.alloc_data.handle=NULL;
+ return NULL;
+ }
+
+ ion_data.ion_alloc_fd.handle = ion_data.alloc_data.handle;
+ rc = ioctl(ion_data.ion_device_fd,ION_IOC_MAP,&ion_data.ion_alloc_fd);
+ if(rc) {
+ E("\n ION MAP failed ");
+ ion_data.ion_alloc_fd.fd =-1;
+ ion_data.ion_alloc_fd.fd =-1;
+ return NULL;
+ }
+ pMem->pmem_fd = ion_data.ion_alloc_fd.fd;
+#else
+ pMem->pmem_fd = open(PMEM_DEVICE, O_RDWR);
if ((int)(pMem->pmem_fd) < 0)
return NULL;
nSize = (nSize + 4095) & (~4095);
+#endif
pMem->offset = 0;
pvirt = mmap(NULL, nSize,
PROT_READ | PROT_WRITE,
@@ -288,8 +403,18 @@ void* PmemMalloc(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem, int nSize)
if (pvirt == (void*) MAP_FAILED)
{
close(pMem->pmem_fd);
- pMem->pmem_fd = -1;
- return NULL;
+ pMem->pmem_fd = -1;
+#ifdef USE_ION
+ if(ioctl(ion_data.ion_device_fd,ION_IOC_FREE,
+ &ion_data.alloc_data.handle)) {
+ E("ion recon buffer free failed");
+ }
+ ion_data.alloc_data.handle = NULL;
+ ion_data.ion_alloc_fd.fd =-1;
+ close(ion_data.ion_device_fd);
+ ion_data.ion_device_fd =-1;
+#endif
+ return NULL;
}
D("allocated pMem->fd = %d pvirt=0x%x, pMem->phys=0x%x, size = %d", pMem->pmem_fd,
pvirt, pMem->offset, nSize);
@@ -305,9 +430,57 @@ int PmemFree(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO* pMem, void* pvirt, int nSize)
munmap(pvirt, nSize);
close(pMem->pmem_fd);
pMem->pmem_fd = -1;
+#ifdef USE_ION
+ if(ioctl(ion_data.ion_device_fd,ION_IOC_FREE,
+ &ion_data.alloc_data.handle)) {
+ E("ion recon buffer free failed");
+ }
+ ion_data.alloc_data.handle = NULL;
+ ion_data.ion_alloc_fd.fd =-1;
+ close(ion_data.ion_device_fd);
+ ion_data.ion_device_fd =-1;
+#endif
return 0;
}
-
+void PrintFramePackArrangement(OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement)
+{
+ printf("id (%d)\n",
+ framePackingArrangement.id);
+ printf("cancel_flag (%d)\n",
+ framePackingArrangement.cancel_flag);
+ printf("type (%d)\n",
+ framePackingArrangement.type);
+ printf("quincunx_sampling_flag (%d)\n",
+ framePackingArrangement.quincunx_sampling_flag);
+ printf("content_interpretation_type (%d)\n",
+ framePackingArrangement.content_interpretation_type);
+ printf("spatial_flipping_flag (%d)\n",
+ framePackingArrangement.spatial_flipping_flag);
+ printf("frame0_flipped_flag (%d)\n",
+ framePackingArrangement.frame0_flipped_flag);
+ printf("field_views_flag (%d)\n",
+ framePackingArrangement.field_views_flag);
+ printf("current_frame_is_frame0_flag (%d)\n",
+ framePackingArrangement.current_frame_is_frame0_flag);
+ printf("frame0_self_contained_flag (%d)\n",
+ framePackingArrangement.frame0_self_contained_flag);
+ printf("frame1_self_contained_flag (%d)\n",
+ framePackingArrangement.frame1_self_contained_flag);
+ printf("frame0_grid_position_x (%d)\n",
+ framePackingArrangement.frame0_grid_position_x);
+ printf("frame0_grid_position_y (%d)\n",
+ framePackingArrangement.frame0_grid_position_y);
+ printf("frame1_grid_position_x (%d)\n",
+ framePackingArrangement.frame1_grid_position_x);
+ printf("frame1_grid_position_y (%d)\n",
+ framePackingArrangement.frame1_grid_position_y);
+ printf("reserved_byte (%d)\n",
+ framePackingArrangement.reserved_byte);
+ printf("repetition_period (%d)\n",
+ framePackingArrangement.repetition_period);
+ printf("extension_flag (%d)\n",
+ framePackingArrangement.extension_flag);
+}
void SetState(OMX_STATETYPE eState)
{
#define GOTO_STATE(eState) \
@@ -340,7 +513,7 @@ void SetState(OMX_STATETYPE eState)
OMX_ERRORTYPE ConfigureEncoder()
{
OMX_ERRORTYPE result = OMX_ErrorNone;
- unsigned const int *profile_tbl = NULL;
+ unsigned const int *profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
OMX_U32 mb_per_sec, mb_per_frame;
bool profile_level_found = false;
OMX_U32 eProfile,eLevel;
@@ -349,7 +522,6 @@ OMX_ERRORTYPE ConfigureEncoder()
#ifdef QCOM_EXT
OMX_QCOM_PARAM_PORTDEFINITIONTYPE qPortDefnType;
#endif
-
portdef.nPortIndex = (OMX_U32) 0; // input
result = OMX_GetParameter(m_hHandle,
OMX_IndexParamPortDefinition,
@@ -366,6 +538,14 @@ OMX_ERRORTYPE ConfigureEncoder()
&portdef);
E("\n OMX_IndexParamPortDefinition Set Paramter on input port");
CHK(result);
+ // once more to get proper buffer size
+ result = OMX_GetParameter(m_hHandle,
+ OMX_IndexParamPortDefinition,
+ &portdef);
+ E("\n OMX_IndexParamPortDefinition Get Paramter on input port, 2nd pass");
+ CHK(result);
+ // update size accordingly
+ m_sProfile.nFrameBytes = portdef.nBufferSize;
portdef.nPortIndex = (OMX_U32) 1; // output
result = OMX_GetParameter(m_hHandle,
OMX_IndexParamPortDefinition,
@@ -375,7 +555,7 @@ OMX_ERRORTYPE ConfigureEncoder()
portdef.format.video.nFrameWidth = m_sProfile.nFrameWidth;
portdef.format.video.nFrameHeight = m_sProfile.nFrameHeight;
portdef.format.video.nBitrate = m_sProfile.nBitrate;
- portdef.format.video.xFramerate = m_sProfile.nFramerate << 16;
+ FractionToQ16(portdef.format.video.xFramerate,(int) (m_sProfile.nFramerate * 2),2);
result = OMX_SetParameter(m_hHandle,
OMX_IndexParamPortDefinition,
&portdef);
@@ -393,6 +573,8 @@ result = OMX_SetParameter(m_hHandle,
&qPortDefnType);
#endif
+ if (!m_sProfile.nUserProfile) // profile not set by user, go ahead with table calculation
+ {
//validate the ht,width,fps,bitrate and set the appropriate profile and level
if(m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
{
@@ -421,7 +603,7 @@ result = OMX_SetParameter(m_hHandle,
{
eLevel = (int)profile_tbl[3];
eProfile = (int)profile_tbl[4];
- E("\n profile and level found \n");
+ E("\n profile/level found: %d/%d\n",eProfile/eLevel);
profile_level_found = true;
break;
}
@@ -435,7 +617,12 @@ result = OMX_SetParameter(m_hHandle,
E("\n Error: Unsupported profile/level\n");
return OMX_ErrorNone;
}
-
+ }
+ else // Profile set by user!
+ {
+ eProfile = m_sProfile.nUserProfile;
+ eLevel = 0;
+ }
if (m_sProfile.eCodec == OMX_VIDEO_CodingH263)
{
D("Configuring H263...");
@@ -452,9 +639,9 @@ result = OMX_SetParameter(m_hHandle,
h263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel;
h263.bPLUSPTYPEAllowed = OMX_FALSE;
h263.nAllowedPictureTypes = 2;
- h263.bForceRoundingTypeToZero = OMX_TRUE; ///@todo determine what this should be
- h263.nPictureHeaderRepetition = 0; ///@todo determine what this should be
- h263.nGOBHeaderInterval = 0; ///@todo determine what this should be
+ h263.bForceRoundingTypeToZero = OMX_TRUE;
+ h263.nPictureHeaderRepetition = 0;
+ h263.nGOBHeaderInterval = 1;
result = OMX_SetParameter(m_hHandle,
OMX_IndexParamVideoH263,
&h263);
@@ -464,6 +651,7 @@ result = OMX_SetParameter(m_hHandle,
D("Configuring MP4/H264...");
OMX_VIDEO_PARAM_PROFILELEVELTYPE profileLevel; // OMX_IndexParamVideoProfileLevelCurrent
+ profileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
profileLevel.eProfile = eProfile;
profileLevel.eLevel = eLevel;
result = OMX_SetParameter(m_hHandle,
@@ -479,59 +667,48 @@ result = OMX_SetParameter(m_hHandle,
D ("\n Profile = %d level = %d",profileLevel.eProfile,profileLevel.eLevel);
CHK(result);
- /*OMX_VIDEO_PARAM_MPEG4TYPE mp4;
-
- result = OMX_GetParameter(m_hHandle,
- OMX_IndexParamVideoMpeg4,
- &mp4);
- E("\n OMX_IndexParamVideoMpeg4 Set Paramter port");
- CHK(result);
-
- mp4.nTimeIncRes = m_sProfile.nFramerate * 2;
- mp4.nPFrames = mp4.nTimeIncRes - 1; // intra period
-
- result = OMX_SetParameter(m_hHandle,
- OMX_IndexParamVideoMpeg4,
- &mp4);
- CHK(result);*/
-
-// OMX_VIDEO_PARAM_MPEG4TYPE mp4; // OMX_IndexParamVideoMpeg4
-// result = OMX_GetParameter(m_hHandle,
-// OMX_IndexParamVideoMpeg4,
-// &mp4);
-// CHK(result);
-// mp4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
-// mp4.eProfile = OMX_VIDEO_MPEG4ProfileSimple;
-// mp4.eLevel = m_sProfile.eLevel;
-// mp4.nSliceHeaderSpacing = 0;
-// mp4.bSVH = OMX_FALSE;
-// mp4.bGov = OMX_FALSE;
-// mp4.nPFrames = m_sProfile.nFramerate * 2 - 1; // intra period
-// mp4.bACPred = OMX_TRUE;
-// mp4.nTimeIncRes = m_sProfile.nFramerate * 2; // delta = 2 @ 15 fps
-// mp4.nAllowedPictureTypes = 2; // pframe and iframe
-// result = OMX_SetParameter(m_hHandle,
-// OMX_IndexParamVideoMpeg4,
-// &mp4);
-// CHK(result);
+ if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
+ {
+ OMX_VIDEO_PARAM_MPEG4TYPE mp4; // OMX_IndexParamVideoMpeg4
+ result = OMX_GetParameter(m_hHandle,
+ OMX_IndexParamVideoMpeg4,
+ &mp4);
+ CHK(result);
+ mp4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+ mp4.nTimeIncRes = 1000;
+ result = OMX_SetParameter(m_hHandle,
+ OMX_IndexParamVideoMpeg4,
+ &mp4);
+ CHK(result);
+ }
}
-
if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)
{
- OMX_VIDEO_PARAM_AVCSLICEFMO avcslicefmo;
- avcslicefmo.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+#if 1
+/////////////C A B A C ///A N D/////D E B L O C K I N G /////////////////
+
+ OMX_VIDEO_PARAM_AVCTYPE avcdata;
+ avcdata.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
result = OMX_GetParameter(m_hHandle,
- OMX_IndexParamVideoSliceFMO,
- &avcslicefmo);
- E("\n OMX_IndexParamVideoSliceFMO Get Paramter port");
+ OMX_IndexParamVideoAvc,
+ &avcdata);
CHK(result);
+// TEST VALUES (CHANGE FOR DIFF CONFIG's)
+ avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
+// avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterDisable;
+// avcdata.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterDisableSliceBoundary;
+ avcdata.bEntropyCodingCABAC = OMX_FALSE;
+// avcdata.bEntropyCodingCABAC = OMX_TRUE;
+ avcdata.nCabacInitIdc = 1;
+///////////////////////////////////////////////
- avcslicefmo.eSliceMode = m_sProfile.eSliceMode;
result = OMX_SetParameter(m_hHandle,
- OMX_IndexParamVideoSliceFMO,
- &avcslicefmo);
- E("\n OMX_IndexParamVideoSliceFMO Set Paramter port");
+ OMX_IndexParamVideoAvc,
+ &avcdata);
CHK(result);
+
+/////////////C A B A C ///A N D/////D E B L O C K I N G /////////////////
+#endif
}
OMX_VIDEO_PARAM_BITRATETYPE bitrate; // OMX_IndexParamVideoBitrate
@@ -556,7 +733,7 @@ result = OMX_SetParameter(m_hHandle,
&framerate);
E("\n OMX_IndexParamVideoPortFormat Get Paramter port");
CHK(result);
- framerate.xFramerate = m_sProfile.nFramerate << 16;
+ FractionToQ16(framerate.xFramerate,(int) (m_sProfile.nFramerate * 2),2);
result = OMX_SetParameter(m_hHandle,
OMX_IndexParamVideoPortFormat,
&framerate);
@@ -564,20 +741,254 @@ result = OMX_SetParameter(m_hHandle,
CHK(result);
#if 1
+///////////////////I N T R A P E R I O D ///////////////////
+
+ QOMX_VIDEO_INTRAPERIODTYPE intra;
+
+ intra.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
+ result = OMX_GetConfig(m_hHandle,
+ (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod,
+ (OMX_PTR) &intra);
+
+ if (result == OMX_ErrorNone)
+ {
+ intra.nPFrames = (OMX_U32) (2 * m_sProfile.nFramerate - 1); //setting I
+ //frame interval to
+ //2 x framerate
+ intra.nIDRPeriod = 1; //every I frame is an IDR
+ intra.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
+ result = OMX_SetConfig(m_hHandle,
+ (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod,
+ (OMX_PTR) &intra);
+ }
+ else
+ {
+ E("failed to get state", 0, 0, 0);
+ }
+
+
+///////////////////I N T R A P E R I O D ///////////////////
+#endif
+
+#if 1
+///////////////////E R R O R C O R R E C T I O N ///////////////////
+
+ ResyncMarkerType eResyncMarkerType = RESYNC_MARKER_NONE;
+ unsigned long int nResyncMarkerSpacing = 0;
+ OMX_BOOL enableHEC = OMX_FALSE;
+
+//For Testing ONLY
+ if (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)
+ {
+// MPEG4
+// eResyncMarkerType = RESYNC_MARKER_BYTE;
+// nResyncMarkerSpacing = 1920;
+ eResyncMarkerType = RESYNC_MARKER_MB;
+ nResyncMarkerSpacing = 50;
+ enableHEC = OMX_TRUE;
+ }
+ else if (m_sProfile.eCodec == OMX_VIDEO_CodingH263)
+ {
+//H263
+ eResyncMarkerType = RESYNC_MARKER_GOB;
+ nResyncMarkerSpacing = 0;
+ }
+ else if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)
+ {
+//H264
+// eResyncMarkerType = RESYNC_MARKER_BYTE;
+// nResyncMarkerSpacing = 1920;
+
+ //nResyncMarkerSpacing sets the slice size in venc_set_multislice_cfg
+ //
+ //As of 9/24/10, it is known that the firmware has a bitstream
+ //corruption issue when RateControl and multislice are enabled for 720P
+ //So, disabling multislice for 720P when ratecontrol is enabled until
+ //the firmware issue is resolved.
+
+ if ( ( (m_sProfile.nFrameWidth == 1280) && (m_sProfile.nFrameHeight = 720) ) &&
+ (m_sProfile.eControlRate != OMX_Video_ControlRateDisable) )
+ {
+ eResyncMarkerType = RESYNC_MARKER_NONE;
+ nResyncMarkerSpacing = 0;
+ }
+ else
+ {
+ eResyncMarkerType = RESYNC_MARKER_MB;
+ nResyncMarkerSpacing = 50;
+ }
+ }
+
+ OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrection; //OMX_IndexParamVideoErrorCorrection
+ errorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
+ result = OMX_GetParameter(m_hHandle,
+ (OMX_INDEXTYPE) OMX_IndexParamVideoErrorCorrection,
+ (OMX_PTR) &errorCorrection);
+
+ errorCorrection.bEnableRVLC = OMX_FALSE;
+ errorCorrection.bEnableDataPartitioning = OMX_FALSE;
+
+ if ((eResyncMarkerType == RESYNC_MARKER_BYTE) &&
+ (m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4)){
+ errorCorrection.bEnableResync = OMX_TRUE;
+ errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
+ errorCorrection.bEnableHEC = enableHEC;
+ }
+ else if ((eResyncMarkerType == RESYNC_MARKER_BYTE) &&
+ (m_sProfile.eCodec == OMX_VIDEO_CodingAVC)){
+ errorCorrection.bEnableResync = OMX_TRUE;
+ errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
+ }
+ else if ((eResyncMarkerType == RESYNC_MARKER_GOB) &&
+ (m_sProfile.eCodec == OMX_VIDEO_CodingH263)){
+ errorCorrection.bEnableResync = OMX_FALSE;
+ errorCorrection.nResynchMarkerSpacing = nResyncMarkerSpacing;
+ errorCorrection.bEnableDataPartitioning = OMX_TRUE;
+ }
+
+ result = OMX_SetParameter(m_hHandle,
+ (OMX_INDEXTYPE) OMX_IndexParamVideoErrorCorrection,
+ (OMX_PTR) &errorCorrection);
+ CHK(result);
+
+ if (eResyncMarkerType == RESYNC_MARKER_MB){
+ if (m_sProfile.eCodec == OMX_VIDEO_CodingAVC){
+ OMX_VIDEO_PARAM_AVCTYPE avcdata;
+ avcdata.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
+ result = OMX_GetParameter(m_hHandle,
+ OMX_IndexParamVideoAvc,
+ (OMX_PTR) &avcdata);
+ CHK(result);
+ if (result == OMX_ErrorNone)
+ {
+ avcdata.nSliceHeaderSpacing = nResyncMarkerSpacing;
+ result = OMX_SetParameter(m_hHandle,
+ OMX_IndexParamVideoAvc,
+ (OMX_PTR) &avcdata);
+ CHK(result);
+
+ }
+ }
+ else if(m_sProfile.eCodec == OMX_VIDEO_CodingMPEG4){
+ OMX_VIDEO_PARAM_MPEG4TYPE mp4;
+ mp4.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
+ result = OMX_GetParameter(m_hHandle,
+ OMX_IndexParamVideoMpeg4,
+ (OMX_PTR) &mp4);
+ CHK(result);
+
+ if (result == OMX_ErrorNone)
+ {
+ mp4.nSliceHeaderSpacing = nResyncMarkerSpacing;
+ result = OMX_SetParameter(m_hHandle,
+ OMX_IndexParamVideoMpeg4,
+ (OMX_PTR) &mp4);
+ CHK(result);
+ }
+ }
+ }
+
+///////////////////E R R O R C O R R E C T I O N ///////////////////
+#endif
+
+#if 1
+///////////////////I N T R A R E F R E S H///////////////////
+ bool bEnableIntraRefresh = OMX_TRUE;
+
+ if (result == OMX_ErrorNone)
+ {
+ OMX_VIDEO_PARAM_INTRAREFRESHTYPE ir; // OMX_IndexParamVideoIntraRefresh
+ ir.nPortIndex = (OMX_U32) PORT_INDEX_OUT; // output
+ result = OMX_GetParameter(m_hHandle,
+ OMX_IndexParamVideoIntraRefresh,
+ (OMX_PTR) &ir);
+ if (result == OMX_ErrorNone)
+ {
+ if (bEnableIntraRefresh)
+ {
+ ir.eRefreshMode = OMX_VIDEO_IntraRefreshCyclic;
+ ir.nCirMBs = 5;
+ result = OMX_SetParameter(m_hHandle,
+ OMX_IndexParamVideoIntraRefresh,
+ (OMX_PTR) &ir);
+ CHK(result);
+ }
+ }
+ }
+#endif
+#if 1
+///////////////////FRAMEPACKING DATA///////////////////
+ OMX_QCOM_FRAME_PACK_ARRANGEMENT framePackingArrangement;
+ FILE *m_pConfigFile;
+ char m_configFilename [128] = "/data/configFile.cfg";
+ memset(&framePackingArrangement, 0, sizeof(framePackingArrangement));
+ m_pConfigFile = fopen(m_configFilename, "r");
+ if (m_pConfigFile != NULL)
+ {
+ //read all frame packing data
+ framePackingArrangement.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+ int totalSizeToRead = FRAME_PACK_SIZE * sizeof(OMX_U32);
+ char *pFramePack = (char *) &(framePackingArrangement.id);
+ while ( ( (fscanf(m_pConfigFile, "%d", pFramePack)) != EOF ) &&
+ (totalSizeToRead != 0) )
+ {
+ //printf("Addr = %p, Value read = %d, sizeToRead remaining=%d\n",
+ // pFramePack, *pFramePack, totalSizeToRead);
+ pFramePack += sizeof(OMX_U32);
+ totalSizeToRead -= sizeof(OMX_U32);
+ }
+ //close the file.
+ fclose(m_pConfigFile);
+
+ printf("Frame Packing data from config file:\n");
+ PrintFramePackArrangement(framePackingArrangement);
+ }
+ else
+ {
+ D("\n Config file does not exist or could not be opened.");
+ //set the default values
+ framePackingArrangement.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+ framePackingArrangement.id = 123;
+ framePackingArrangement.cancel_flag = false;
+ framePackingArrangement.type = 3;
+ framePackingArrangement.quincunx_sampling_flag = false;
+ framePackingArrangement.content_interpretation_type = 0;
+ framePackingArrangement.spatial_flipping_flag = true;
+ framePackingArrangement.frame0_flipped_flag = false;
+ framePackingArrangement.field_views_flag = false;
+ framePackingArrangement.current_frame_is_frame0_flag = false;
+ framePackingArrangement.frame0_self_contained_flag = true;
+ framePackingArrangement.frame1_self_contained_flag = false;
+ framePackingArrangement.frame0_grid_position_x = 3;
+ framePackingArrangement.frame0_grid_position_y = 15;
+ framePackingArrangement.frame1_grid_position_x = 11;
+ framePackingArrangement.frame1_grid_position_y = 7;
+ framePackingArrangement.reserved_byte = 0;
+ framePackingArrangement.repetition_period = 16381;
+ framePackingArrangement.extension_flag = false;
+
+ printf("Frame Packing Defaults :\n");
+ PrintFramePackArrangement(framePackingArrangement);
+ }
+ result = OMX_SetConfig(m_hHandle,
+ (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement,
+ (OMX_PTR) &framePackingArrangement);
+ CHK(result);
+
+//////////////////////OMX_VIDEO_PARAM_INTRAREFRESHTYPE///////////////////
+#endif
+
OMX_CONFIG_FRAMERATETYPE enc_framerate; // OMX_IndexConfigVideoFramerate
enc_framerate.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
result = OMX_GetConfig(m_hHandle,
OMX_IndexConfigVideoFramerate,
&enc_framerate);
- E("\n OMX_IndexConfigVideoFramerate Get config port");
CHK(result);
- enc_framerate.xEncodeFramerate = m_sProfile.nFramerate << 16;
+ FractionToQ16(enc_framerate.xEncodeFramerate,(int) (m_sProfile.nFramerate * 2),2);
result = OMX_SetConfig(m_hHandle,
OMX_IndexConfigVideoFramerate,
&enc_framerate);
- E("\n OMX_IndexConfigVideoFramerate Set config port");
CHK(result);
-#endif
return OMX_ErrorNone;
}
////////////////////////////////////////////////////////////////////////////////
@@ -908,16 +1319,162 @@ OMX_ERRORTYPE VencTest_Exit(void)
return result;
}
////////////////////////////////////////////////////////////////////////////////
+
+void VencTest_ReadDynamicConfigMsg()
+{
+ char frame_n[8], config[16], param[8];
+ char *dest = frame_n;
+ bool end = false;
+ int cntr, nparam = 0;
+ memset(&dynamic_config, 0, sizeof(struct DynamicConfig));
+ do
+ {
+ cntr = -1;
+ do
+ {
+ dest[++cntr] = fgetc(m_pDynConfFile);
+ } while(dest[cntr] != ' ' && dest[cntr] != '\t' && dest[cntr] != '\n' && dest[cntr] != '\r' && !feof(m_pDynConfFile));
+ if (dest[cntr] == '\n' || dest[cntr] == '\r')
+ end = true;
+ dest[cntr] = NULL;
+ if (dest == frame_n)
+ dest = config;
+ else if (dest == config)
+ dest = param;
+ else
+ end = true;
+ nparam++;
+ } while (!end && !feof(m_pDynConfFile));
+
+ if (nparam > 1)
+ {
+ dynamic_config.pending = true;
+ dynamic_config.frame_num = atoi(frame_n);
+ if (!strcmp(config, "bitrate"))
+ {
+ dynamic_config.config_param = OMX_IndexConfigVideoBitrate;
+ dynamic_config.config_data.bitrate.nPortIndex = PORT_INDEX_OUT;
+ dynamic_config.config_data.bitrate.nEncodeBitrate = strtoul(param, NULL, 10);
+ }
+ else if (!strcmp(config, "framerate"))
+ {
+ dynamic_config.config_param = OMX_IndexConfigVideoFramerate;
+ dynamic_config.config_data.framerate.nPortIndex = PORT_INDEX_OUT;
+ dynamic_config.config_data.f_framerate = atof(param);
+ }
+ else if (!strcmp(config, "iperiod"))
+ {
+ dynamic_config.config_param = (OMX_INDEXTYPE)QOMX_IndexConfigVideoIntraperiod;
+ dynamic_config.config_data.intraperiod.nPortIndex = PORT_INDEX_OUT;
+ dynamic_config.config_data.intraperiod.nPFrames = strtoul(param, NULL, 10) - 1;
+ dynamic_config.config_data.intraperiod.nIDRPeriod = 1; // This value is ignored in OMX component
+ }
+ else if (!strcmp(config, "ivoprefresh"))
+ {
+ dynamic_config.config_param = OMX_IndexConfigVideoIntraVOPRefresh;
+ dynamic_config.config_data.intravoprefresh.nPortIndex = PORT_INDEX_OUT;
+ dynamic_config.config_data.intravoprefresh.IntraRefreshVOP = OMX_TRUE;
+ }
+ else if (!strcmp(config, "rotation"))
+ {
+ dynamic_config.config_param = OMX_IndexConfigCommonRotate;
+ dynamic_config.config_data.rotation.nPortIndex = PORT_INDEX_OUT;
+ dynamic_config.config_data.rotation.nRotation = strtoul(param, NULL, 10);
+ }
+ else
+ {
+ E("UNKNOWN CONFIG PARAMETER: %s!", config);
+ dynamic_config.pending = false;
+ }
+ }
+ else if (feof(m_pDynConfFile))
+ {
+ fclose(m_pDynConfFile);
+ m_pDynConfFile = NULL;
+ }
+}
+
+void VencTest_ProcessDynamicConfigurationFile()
+{
+ do
+ {
+ if (dynamic_config.pending)
+ {
+ if(m_nFrameIn == dynamic_config.frame_num)
+ {
+ if (dynamic_config.config_param == OMX_IndexConfigVideoFramerate)
+ {
+ m_sProfile.nFramerate = dynamic_config.config_data.f_framerate;
+ FractionToQ16(dynamic_config.config_data.framerate.xEncodeFramerate,
+ (int)(m_sProfile.nFramerate * 2), 2);
+ }
+ if (OMX_SetConfig(m_hHandle, dynamic_config.config_param,
+ &dynamic_config.config_data) != OMX_ErrorNone)
+ E("ERROR: Setting dynamic config to OMX param[0x%x]", dynamic_config.config_param);
+ dynamic_config.pending = false;
+ }
+ else if (m_nFrameIn > dynamic_config.frame_num)
+ {
+ E("WARNING: Config change requested in passed frame(%d)", dynamic_config.frame_num);
+ dynamic_config.pending = false;
+ }
+ }
+ if (!dynamic_config.pending)
+ VencTest_ReadDynamicConfigMsg();
+ } while (!dynamic_config.pending && m_pDynConfFile);
+}
+
+////////////////////////////////////////////////////////////////////////////////
OMX_ERRORTYPE VencTest_ReadAndEmpty(OMX_BUFFERHEADERTYPE* pYUVBuffer)
{
OMX_ERRORTYPE result = OMX_ErrorNone;
#ifdef T_ARM
+#ifdef MAX_RES_720P
if (read(m_nInFd,
pYUVBuffer->pBuffer,
m_sProfile.nFrameBytes) != m_sProfile.nFrameBytes)
{
return OMX_ErrorUndefined;
}
+#elif BADGER
+ int bytes;
+ E("will read YUV now: %d bytes to buffer %p\n", m_sProfile.nFrameRead, pYUVBuffer->pBuffer);
+ E("W: %d H: %d Str: %d scal: %d \n", m_sProfile.nFrameWidth, m_sProfile.nFrameHeight,
+ m_sProfile.nFramestride, m_sProfile.nFrameScanlines);
+ bytes = read(m_nInFd, pYUVBuffer->pBuffer, m_sProfile.nFrameRead);
+ if (bytes != m_sProfile.nFrameRead) {
+ E("read failed: %d != %d\n", read, m_sProfile.nFrameRead);
+ return OMX_ErrorUndefined;
+ }
+ E("\n\nRead %d bytes\n\n\n", m_sProfile.nFrameRead);
+#else
+ OMX_U32 bytestoread = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight;
+ // read Y first
+ if (read(m_nInFd,
+ pYUVBuffer->pBuffer,
+ bytestoread) != bytestoread)
+ return OMX_ErrorUndefined;
+
+ // check alignment for offset to C
+ OMX_U32 offset_to_c = m_sProfile.nFrameWidth * m_sProfile.nFrameHeight;
+
+ const OMX_U32 C_2K = (1024*2),
+ MASK_2K = C_2K-1,
+ IMASK_2K = ~MASK_2K;
+
+ if (offset_to_c & MASK_2K)
+ {
+ // offset to C is not 2k aligned, adjustment is required
+ offset_to_c = (offset_to_c & IMASK_2K) + C_2K;
+ }
+
+ bytestoread = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight/2;
+ // read C
+ if (read(m_nInFd,
+ pYUVBuffer->pBuffer + offset_to_c,
+ bytestoread)!= bytestoread)
+ return OMX_ErrorUndefined;
+#endif
#else
{
char * pInputbuf = (char *)(pYUVBuffer->pBuffer) ;
@@ -925,10 +1482,16 @@ OMX_ERRORTYPE VencTest_ReadAndEmpty(OMX_BUFFERHEADERTYPE* pYUVBuffer)
}
#endif
+ if (m_pDynConfFile)
+ VencTest_ProcessDynamicConfigurationFile();
D("about to call VencTest_EncodeFrame...");
pthread_mutex_lock(&m_mutex);
++m_nFrameIn;
+#ifdef BADGER
+ pYUVBuffer->nFilledLen = m_sProfile.nFrameRead;
+#else
pYUVBuffer->nFilledLen = m_sProfile.nFrameBytes;
+#endif
D("Called Buffer with Data filled length %d",pYUVBuffer->nFilledLen);
result = VencTest_EncodeFrame(pYUVBuffer->pBuffer,
@@ -1020,7 +1583,7 @@ void usage(char* filename)
fprintf(stderr, "usage: %s LIVE <QCIF|QVGA> <MP4|H263> <FPS> <BITRATE> <NFRAMES> <OUTFILE>\n", fname);
fprintf(stderr, "usage: %s FILE <QCIF|QVGA> <MP4|H263 <FPS> <BITRATE> <NFRAMES> <INFILE> <OUTFILE> ", fname);
- fprintf(stderr, "<Rate Control - optional> <AVC Slice Mode - optional\n", fname);
+ fprintf(stderr, "<Dynamic config file - opt> <Rate Control - opt> <AVC Slice Mode - opt>\n", fname);
fprintf(stderr, "usage: %s PROFILE <QCIF|QVGA> <MP4|H263 <FPS> <BITRATE> <NFRAMES> <INFILE>\n", fname);
fprintf(stderr, "usage: %s PREVIEW <QCIF|QVGA> <FPS> <NFRAMES>\n", fname);
fprintf(stderr, "usage: %s DISPLAY <QCIF|QVGA> <FPS> <NFRAMES> <INFILE>\n", fname);
@@ -1030,10 +1593,53 @@ void usage(char* filename)
fprintf(stderr, " RateControl (Values 0 - 4 for RC_OFF, RC_CBR_CFR, RC_CBR_VFR, RC_VBR_CFR, RC_VBR_VFR\n");
exit(1);
}
+
+bool parseWxH(char *str, OMX_U32 *width, OMX_U32 *height)
+{
+ bool parseOK = false;
+ const char delimiters[] = " x*,";
+ char *token, *dupstr, *temp;
+ OMX_U32 w, h;
+
+ dupstr = strdup(str);
+ token = strtok_r(dupstr, delimiters, &temp);
+ if (token)
+ {
+ w = strtoul(token, NULL, 10);
+ token = strtok_r(NULL, delimiters, &temp);
+ if (token)
+ {
+ h = strtoul(token, NULL, 10);
+ if (w != ULONG_MAX && h != ULONG_MAX)
+ {
+#ifdef MAX_RES_720P
+ if ((w * h >> 8) <= 3600)
+ {
+ parseOK = true;
+ *width = w;
+ *height = h;
+ }
+#else
+ if ((w * h >> 8) <= 8160)
+ {
+ parseOK = true;
+ *width = w;
+ *height = h;
+ }
+#endif
+ else
+ E("\nInvalid dimensions %dx%d",w,h);
+ }
+ }
+ }
+ free(dupstr);
+ return parseOK;
+}
+
////////////////////////////////////////////////////////////////////////////////
void parseArgs(int argc, char** argv)
{
-
+ int dyn_file_arg = argc;
if (argc == 1)
{
usage(argv[0]);
@@ -1074,16 +1680,19 @@ void parseArgs(int argc, char** argv)
{//263
m_eMode = MODE_FILE_ENCODE;
- if(argc < 9 || argc > 11)
+ if(argc < 9 || argc > 13)
{
usage(argv[0]);
}
else
{
- if ((argc == 10))
+ if (argc > 9)
+ dyn_file_arg = 9;
+
+ if (argc > 10)
{
m_sProfile.eControlRate = OMX_Video_ControlRateVariable;
- int RC = atoi(argv[9]);
+ int RC = atoi(argv[10]);
switch (RC)
{
@@ -1113,12 +1722,14 @@ void parseArgs(int argc, char** argv)
}
}
- if (argc == 11)
+ if (argc > 11)
{
+ int profile_argi = 11;
if(!strcmp(argv[3], "H264") || !strcmp(argv[3], "h264"))
{
- E("\nSetting AVCSliceMode ... ");
- int AVCSliceMode = atoi(argv[10]);
+ profile_argi = 12;
+ D("\nSetting AVCSliceMode ... ");
+ int AVCSliceMode = atoi(argv[11]);
switch(AVCSliceMode)
{
case 0:
@@ -1139,10 +1750,21 @@ void parseArgs(int argc, char** argv)
break;
}
}
- else
+ if (profile_argi < argc)
{
- E("SliceMode support only for H.264 codec");
- usage(argv[0]);
+ if (!strncmp(argv[profile_argi], "0x", 2) || !strncmp(argv[profile_argi], "0x", 2))
+ {
+ m_sProfile.nUserProfile = strtoul(argv[profile_argi], NULL, 16);
+ }
+ else
+ {
+ m_sProfile.nUserProfile = strtoul(argv[profile_argi], NULL, 10);
+ }
+ if (!m_sProfile.nUserProfile || m_sProfile.nUserProfile == ULONG_MAX)
+ {
+ E("invalid specified Profile %s, using default", argv[profile_argi]);
+ m_sProfile.nUserProfile = 0;
+ }
}
}
}
@@ -1202,37 +1824,56 @@ void parseArgs(int argc, char** argv)
m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
}
else if (strcmp("CIF", argv[2]) == 0 ||
- strcmp("CIF", argv[2]) == 0)
+ strcmp("cif", argv[2]) == 0)
{
m_sProfile.nFrameWidth = 352;
m_sProfile.nFrameHeight = 288;
m_sProfile.nFrameBytes = 352*288*3/2;
m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
}
- else if (strcmp("720", argv[2]) == 0 ||
- strcmp("720", argv[2]) == 0)
+ else if (strcmp("720", argv[2]) == 0)
{
m_sProfile.nFrameWidth = 1280;
m_sProfile.nFrameHeight = 720;
m_sProfile.nFrameBytes = 720*1280*3/2;
m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
}
+ else if (strcmp("1080", argv[2]) == 0)
+ {
+ m_sProfile.nFrameWidth = 1920;
+ m_sProfile.nFrameHeight = 1080;
+ m_sProfile.nFrameBytes = 1920*1080*3/2;
+ m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+ }
+ else if (parseWxH(argv[2], &m_sProfile.nFrameWidth, &m_sProfile.nFrameHeight))
+ {
+ m_sProfile.nFrameBytes = m_sProfile.nFrameWidth*m_sProfile.nFrameHeight*3/2;
+ m_sProfile.eLevel = OMX_VIDEO_MPEG4Level1;
+ }
else
{
usage(argv[0]);
}
+#ifdef BADGER
+ m_sProfile.nFramestride = (m_sProfile.nFrameWidth + 31) & (~31);
+ m_sProfile.nFrameScanlines = (m_sProfile.nFrameHeight + 31) & (~31);
+ m_sProfile.nFrameBytes = ((m_sProfile.nFramestride * m_sProfile.nFrameScanlines * 3/2) + 4095) & (~4095);
+ E("stride: %d, Scanlines: %d, Size: %d",
+ m_sProfile.nFramestride, m_sProfile.nFrameScanlines, m_sProfile.nFrameBytes);
+ m_sProfile.nFrameRead = m_sProfile.nFramestride * m_sProfile.nFrameScanlines * 3/2;
+#endif
if (m_eMode == MODE_DISPLAY ||
m_eMode == MODE_PREVIEW)
{
- m_sProfile.nFramerate = atoi(argv[3]);
+ m_sProfile.nFramerate = atof(argv[3]);
m_nFramePlay = atoi(argv[4]);
}
else if (m_eMode == MODE_LIVE_ENCODE ||
m_eMode == MODE_FILE_ENCODE ||
m_eMode == MODE_PROFILE)
- {//263
+ {
if ((!strcmp(argv[3], "MP4")) || (!strcmp(argv[3], "mp4")))
{
m_sProfile.eCodec = OMX_VIDEO_CodingMPEG4;
@@ -1250,14 +1891,23 @@ void parseArgs(int argc, char** argv)
usage(argv[0]);
}
- m_sProfile.nFramerate = atoi(argv[4]);
+ m_sProfile.nFramerate = atof(argv[4]);
m_sProfile.nBitrate = atoi(argv[5]);
// m_sProfile.eControlRate = OMX_Video_ControlRateVariable;
m_nFramePlay = atoi(argv[6]);
+ if (dyn_file_arg < argc)
+ {
+ m_pDynConfFile = fopen(argv[dyn_file_arg], "r");
+ if (!m_pDynConfFile)
+ E("ERROR: Cannot open dynamic config file: %s", argv[dyn_file_arg]);
+ else
+ {
+ memset(&dynamic_config, 0, sizeof(struct DynamicConfig));
+ }
+ }
}
}
-
void* Watchdog(void* data)
{
while (1)
@@ -1353,6 +2003,7 @@ int main(int argc, char** argv)
{
E("could not open input file");
CHK(1);
+
}
D("going to idle state");
//SetState(OMX_StateIdle);
@@ -1367,8 +2018,6 @@ int main(int argc, char** argv)
result = OMX_GetParameter(m_hHandle, OMX_IndexParamPortDefinition, &portDef);
CHK(result);
- D("allocating output buffers");
-
D("allocating Input buffers");
num_in_buffers = portDef.nBufferCountActual;
for (i = 0; i < portDef.nBufferCountActual; i++)
@@ -1433,7 +2082,6 @@ int main(int argc, char** argv)
D("going to executing state");
SetState(OMX_StateExecuting);
-
for (i = 0; i < num_out_buffers; i++)
{
D("filling buffer %d", i);
@@ -1458,9 +2106,34 @@ int main(int argc, char** argv)
for (i = 0; i < num_in_buffers; i++)
{
D("[%d] address 0x%x",i, m_pInBuffers[i]->pBuffer);
+#ifdef MAX_RES_720P
read(m_nInFd,
m_pInBuffers[i]->pBuffer,
m_sProfile.nFrameBytes);
+#else
+ // read Y first
+ read(m_nInFd,
+ m_pInBuffers[i]->pBuffer,
+ m_sProfile.nFrameWidth*m_sProfile.nFrameHeight);
+
+ // check alignment for offset to C
+ OMX_U32 offset_to_c = m_sProfile.nFrameWidth * m_sProfile.nFrameHeight;
+
+ const OMX_U32 C_2K = (1024*2),
+ MASK_2K = C_2K-1,
+ IMASK_2K = ~MASK_2K;
+
+ if (offset_to_c & MASK_2K)
+ {
+ // offset to C is not 2k aligned, adjustment is required
+ offset_to_c = (offset_to_c & IMASK_2K) + C_2K;
+ }
+
+ // read C
+ read(m_nInFd,
+ m_pInBuffers[i]->pBuffer + offset_to_c,
+ m_sProfile.nFrameWidth*m_sProfile.nFrameHeight/2);
+#endif
}
@@ -1575,6 +2248,26 @@ int main(int argc, char** argv)
default:
E("invalid msg id %d", (int) msg.id);
} // end switch (msg.id)
+
+/* // TO UNCOMMENT FOR PAUSE TESTINGS
+ if(m_nFrameOut == 10)
+ {
+ E("\nGoing to Pause state\n");
+ SetState(OMX_StatePause);
+ sleep(3);
+//REQUEST AN I FRAME AFTER PAUSE
+ OMX_CONFIG_INTRAREFRESHVOPTYPE voprefresh;
+ voprefresh.nPortIndex = (OMX_U32)PORT_INDEX_OUT;
+ voprefresh.IntraRefreshVOP = OMX_TRUE;
+ result = OMX_SetConfig(m_hHandle,
+ OMX_IndexConfigVideoIntraVOPRefresh,
+ &voprefresh);
+ E("\n OMX_IndexConfigVideoIntraVOPRefresh Set Paramter port");
+ CHK(result);
+ E("\nGoing to executing state\n");
+ SetState(OMX_StateExecuting);
+ }
+*/
} // end while (!bQuit)
@@ -1600,6 +2293,11 @@ int main(int argc, char** argv)
{
close(m_nOutFd);
}
+ if (m_pDynConfFile)
+ {
+ fclose(m_pDynConfFile);
+ m_pDynConfFile = NULL;
+ }
}
if (m_eMode != MODE_PREVIEW)
diff --git a/mm-video/vidc/venc/test/venc_util.c b/mm-video/vidc/venc/test/venc_util.c
index 6e4364fc..ed7f9768 100644..100755
--- a/mm-video/vidc/venc/test/venc_util.c
+++ b/mm-video/vidc/venc/test/venc_util.c
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/mm-video/vidc/venc/test/video_encoder_test.c b/mm-video/vidc/venc/test/video_encoder_test.c
index 8ff49c05..f32214cc 100644..100755
--- a/mm-video/vidc/venc/test/video_encoder_test.c
+++ b/mm-video/vidc/venc/test/video_encoder_test.c
@@ -1,5 +1,5 @@
/*--------------------------------------------------------------------------
-Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -86,16 +86,13 @@ int main (int argc, char **argv)
encoder_context = (struct video_encoder_context *) \
calloc (sizeof (struct video_encoder_context),1);
-
- encoder_context->outputBufferFile = NULL;
- encoder_context->inputBufferFile = NULL;
- encoder_context->video_driver_fd = -1;
-
if (encoder_context == NULL)
{
return -1;
}
-
+ encoder_context->outputBufferFile = NULL;
+ encoder_context->inputBufferFile = NULL;
+ encoder_context->video_driver_fd = -1;
encoder_context->inputBufferFile = file_ptr;
encoder_context->input_width = 176;
encoder_context->input_height = 144;
@@ -109,6 +106,7 @@ int main (int argc, char **argv)
if (file_ptr == NULL)
{
DEBUG_PRINT("\n File can't be created");
+ free (encoder_context);
return -1;
}
encoder_context->outputBufferFile = file_ptr;
@@ -258,8 +256,8 @@ int init_encoder ( struct video_encoder_context *init_decode )
basecfg.targetbitrate = init_decode->targetbitrate;
/*Initialize Decoder with codec type and resolution*/
- ioctl_msg.inputparam = &basecfg;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &basecfg;
+ ioctl_msg.out = NULL;
if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_BASE_CFG,
(void*)&ioctl_msg) < 0)
@@ -270,8 +268,8 @@ int init_encoder ( struct video_encoder_context *init_decode )
/*Initialize Decoder with codec type and resolution*/
DEBUG_PRINT ("\n Switch off rate control");
- ioctl_msg.inputparam = &ratecrl;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &ratecrl;
+ ioctl_msg.out = NULL;
ratecrl.rcmode = VEN_RC_OFF;
if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,
(void*)&ioctl_msg) < 0)
@@ -283,8 +281,8 @@ int init_encoder ( struct video_encoder_context *init_decode )
if (basecfg.codectype == VEN_CODEC_H264)
{
DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
- ioctl_msg.inputparam = &profile;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &profile;
+ ioctl_msg.out = NULL;
profile.profile = VEN_PROFILE_H264_BASELINE;
if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE,
(void*)&ioctl_msg) < 0)
@@ -294,8 +292,8 @@ int init_encoder ( struct video_encoder_context *init_decode )
}
DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
- ioctl_msg.inputparam = &profilelevel;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &profilelevel;
+ ioctl_msg.out = NULL;
profilelevel.level = VEN_LEVEL_H264_1p1;
if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,
(void*)&ioctl_msg) < 0)
@@ -307,8 +305,8 @@ int init_encoder ( struct video_encoder_context *init_decode )
if (basecfg.input_width > 720)
{
DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
- ioctl_msg.inputparam = &profile;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &profile;
+ ioctl_msg.out = NULL;
profile.profile = VEN_PROFILE_H264_HIGH;
if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_CODEC_PROFILE,
(void*)&ioctl_msg) < 0)
@@ -318,8 +316,8 @@ int init_encoder ( struct video_encoder_context *init_decode )
}
DEBUG_PRINT ("\n Set the VEN_IOCTL_SET_CODEC_PROFILE High");
- ioctl_msg.inputparam = &profilelevel;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &profilelevel;
+ ioctl_msg.out = NULL;
profilelevel.level = VEN_LEVEL_H264_3p1;
if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,
(void*)&ioctl_msg) < 0)
@@ -335,8 +333,8 @@ int init_encoder ( struct video_encoder_context *init_decode )
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &init_decode->input_buffer;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = &init_decode->input_buffer;
if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,
(void*)&ioctl_msg) < 0)
@@ -351,8 +349,8 @@ int init_encoder ( struct video_encoder_context *init_decode )
(int)init_decode->input_buffer.actualcount);
- ioctl_msg.inputparam = &init_decode->input_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &init_decode->input_buffer;
+ ioctl_msg.out = NULL;
init_decode->input_buffer.actualcount = init_decode->input_buffer.mincount + 2;
if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,
@@ -364,8 +362,8 @@ int init_encoder ( struct video_encoder_context *init_decode )
DEBUG_PRINT("\n Query output bufffer requirements");
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = &init_decode->output_buffer;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = &init_decode->output_buffer;
if (ioctl (init_decode->video_driver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,
(void*)&ioctl_msg) < 0)
@@ -571,11 +569,11 @@ int allocate_buffer ( unsigned int buffer_dir,
for (i=0; i< buffercount; i++)
{
- ptemp [i]->fd = open ("/dev/pmem_adsp", O_RDWR | O_SYNC);
+ ptemp [i]->fd = open ("/dev/pmem_adsp",O_RDWR);
if (ptemp [i]->fd < 0)
{
- DEBUG_PRINT ("\nallocate_buffer: open pmem failed");
+ DEBUG_PRINT ("\nallocate_buffer: open pmem_adsp failed");
return -1;
}
@@ -589,11 +587,11 @@ int allocate_buffer ( unsigned int buffer_dir,
DEBUG_PRINT ("\nallocate_buffer: MMAP failed");
return -1;
}
- ptemp [i]->nsize = buffersize;
+ ptemp [i]->sz = buffersize;
ptemp [i]->maped_size = clp2 (buffersize);
- ioctl_msg.inputparam = ptemp [i];
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = ptemp [i];
+ ioctl_msg.out = NULL;
if (buffer_dir == OUTPUT_BUFFER)
{
@@ -651,15 +649,15 @@ int start_encoding (struct video_encoder_context *encoder_context)
{
enc_buffer.clientdata = (void *)encoder_context->ptr_outputbuffer [i];
enc_buffer.flags = 0;
- enc_buffer.size = encoder_context->ptr_outputbuffer [i]->nsize;
+ enc_buffer.sz = encoder_context->ptr_outputbuffer [i]->sz;
enc_buffer.len = 0;
enc_buffer.ptrbuffer = encoder_context->ptr_outputbuffer [i]->pbuffer;
enc_buffer.offset = 0;
enc_buffer.timestamp = 0;
DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata);
- ioctl_msg.inputparam = &enc_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &enc_buffer;
+ ioctl_msg.out = NULL;
if (ioctl (encoder_context->video_driver_fd,
VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
@@ -679,7 +677,7 @@ int start_encoding (struct video_encoder_context *encoder_context)
enc_buffer.clientdata = (void *)encoder_context->ptr_inputbuffer [i];
enc_buffer.flags = 0;
- enc_buffer.size = encoder_context->ptr_inputbuffer [i]->nsize;
+ enc_buffer.sz = encoder_context->ptr_inputbuffer [i]->sz;
enc_buffer.len = 0;
enc_buffer.ptrbuffer = encoder_context->ptr_inputbuffer [i]->pbuffer;
enc_buffer.offset = 0;
@@ -699,8 +697,8 @@ int start_encoding (struct video_encoder_context *encoder_context)
DEBUG_PRINT("\n Read Frame from File szie = %d",(int)data_len);
DEBUG_PRINT ("\n Client Data on output = %p",(void *)enc_buffer.clientdata);
- ioctl_msg.inputparam = &enc_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &enc_buffer;
+ ioctl_msg.out = NULL;
if (ioctl (encoder_context->video_driver_fd,
VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < 0)
@@ -729,8 +727,8 @@ int stop_encoding (struct video_encoder_context *encoder_context)
return -1;
}
buffer_flush.flush_mode = VEN_FLUSH_INPUT;
- ioctl_msg.inputparam = &buffer_flush;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &buffer_flush;
+ ioctl_msg.out = NULL;
if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH,
&ioctl_msg) < 0)
@@ -743,8 +741,8 @@ int stop_encoding (struct video_encoder_context *encoder_context)
}
buffer_flush.flush_mode = VEN_FLUSH_OUTPUT;
- ioctl_msg.inputparam = &buffer_flush;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &buffer_flush;
+ ioctl_msg.out = NULL;
if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_FLUSH,
&ioctl_msg) < 0)
@@ -864,15 +862,15 @@ static void* video_thread (void *context)
enc_buffer.clientdata = (void *)tempbuffer;
enc_buffer.flags = 0;
enc_buffer.ptrbuffer = tempbuffer->pbuffer;
- enc_buffer.size = tempbuffer->nsize;
+ enc_buffer.sz = tempbuffer->sz;
enc_buffer.len = tempbuffer->filled_len;
enc_buffer.offset = 0;
enc_buffer.timestamp = total_frames *
((encoder_context->fps_den * 1000000)/encoder_context->fps_num);
/*TODO: Time stamp needs to be updated*/
- ioctl_msg.inputparam = &enc_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &enc_buffer;
+ ioctl_msg.out = NULL;
total_frames++;
if (ioctl(encoder_context->video_driver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,
&ioctl_msg) < 0)
@@ -906,14 +904,14 @@ static void* video_thread (void *context)
tempbuffer->pbuffer);
enc_buffer.clientdata = (void *)tempbuffer;
enc_buffer.flags = 0;
- enc_buffer.size = tempbuffer->nsize;
+ enc_buffer.sz = tempbuffer->sz;
enc_buffer.len = 0;
enc_buffer.ptrbuffer = tempbuffer->pbuffer;
enc_buffer.offset = 0;
enc_buffer.timestamp = 0;
- ioctl_msg.inputparam = &enc_buffer;
- ioctl_msg.outputparam = NULL;
+ ioctl_msg.in = &enc_buffer;
+ ioctl_msg.out = NULL;
if (ioctl (encoder_context->video_driver_fd,
VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0)
@@ -933,18 +931,19 @@ static void* video_thread (void *context)
DEBUG_PRINT("\n Flush output complete");
sem_post (&encoder_context->sem_synchronize);
break;
- }
+ }
+
+ if (queueitem->cmd == VEN_MSG_STOP)
+ {
+ DEBUG_PRINT("\n Playback has ended thread will exit");
+ return NULL;
+ }
}
else
{
DEBUG_PRINT("\n Error condition recieved NULL from Queue");
}
- if (queueitem->cmd == VEN_MSG_STOP)
- {
- DEBUG_PRINT("\n Playback has ended thread will exit");
- return NULL;
- }
}
}
@@ -967,11 +966,11 @@ static void* async_thread (void *context)
while (1)
{
- ioctl_msg.inputparam = NULL;
- ioctl_msg.outputparam = (void*)&venc_msg;
+ ioctl_msg.in = NULL;
+ ioctl_msg.out = (void*)&venc_msg;
DEBUG_PRINT ("\n Sizeof venc_msginfo = %d ",sizeof (venc_msg));
DEBUG_PRINT("\n Address of Venc msg in async thread %p",\
- ioctl_msg.outputparam);
+ ioctl_msg.out);
if (ioctl (encoder_context->video_driver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,\
(void*)&ioctl_msg) < 0)
{