Combine SPS/PPS header to IDR frame.
(cherry picked from http://192.168.110.45/jh7100/buildroot/-/commit/ed8e94ec351c61073a1408df54fb01b5c1deff2c)
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
Combine SPS/PPS header to IDR frame.
|
||||
|
||||
Signed-off-by: Windsome Zeng <windsome.zeng@starfivetech.com>
|
||||
|
||||
diff -purN a/meson.build b/meson.build
|
||||
--- a/meson.build 2022-05-13 11:31:02.725614796 +0800
|
||||
+++ b/meson.build 2022-05-13 11:32:26.213975419 +0800
|
||||
@@ -218,6 +218,7 @@ elif omx_target == 'tizonia'
|
||||
omx_inc = []
|
||||
elif omx_target == 'stf'
|
||||
cdata.set('USE_OMX_TARGET_STARFIVE', 1)
|
||||
+ gst_omx_args += ['-DCOMBINE_SPS_PPS_HEADERS']
|
||||
warning('stf selected')
|
||||
else
|
||||
error ('Unsupported omx target specified. Use the -Dtarget option')
|
||||
diff -purN a/omx/gstomx.c b/omx/gstomx.c
|
||||
--- a/omx/gstomx.c 2022-05-13 11:31:02.725614796 +0800
|
||||
+++ b/omx/gstomx.c 2022-05-13 11:33:15.461950978 +0800
|
||||
@@ -70,6 +70,11 @@ static GHashTable *core_handles;
|
||||
G_LOCK_DEFINE_STATIC (buffer_flags_str);
|
||||
static GHashTable *buffer_flags_str;
|
||||
|
||||
+#ifdef COMBINE_SPS_PPS_HEADERS
|
||||
+static OMX_U8 *sps_pps_header = NULL;
|
||||
+static OMX_U32 sps_pps_header_size = 0;
|
||||
+#endif
|
||||
+
|
||||
GstOMXCore *
|
||||
gst_omx_core_acquire (const gchar * filename)
|
||||
{
|
||||
@@ -903,6 +908,36 @@ FillBufferDone (OMX_HANDLETYPE hComponen
|
||||
|
||||
g_assert (buf->omx_buf == pBuffer);
|
||||
|
||||
+#ifdef COMBINE_SPS_PPS_HEADERS
|
||||
+ if (pBuffer->nFlags == 0x80) {
|
||||
+ g_assert (sps_pps_header == NULL);
|
||||
+ if (sps_pps_header)
|
||||
+ g_free (sps_pps_header);
|
||||
+
|
||||
+ sps_pps_header = g_new (OMX_U8, pBuffer->nFilledLen);
|
||||
+ if (sps_pps_header) {
|
||||
+ sps_pps_header_size = pBuffer->nFilledLen;
|
||||
+ memcpy(sps_pps_header, pBuffer->pBuffer + pBuffer->nOffset, pBuffer->nFilledLen);
|
||||
+ }
|
||||
+ return OMX_ErrorNone;
|
||||
+ }
|
||||
+
|
||||
+ if (sps_pps_header) {
|
||||
+ g_assert (sps_pps_header_size + pBuffer->nFilledLen <= pBuffer->nAllocLen);
|
||||
+ if (sps_pps_header_size + pBuffer->nFilledLen <= pBuffer->nAllocLen) {
|
||||
+ OMX_U8 *buf;
|
||||
+ buf = pBuffer->pBuffer + pBuffer->nOffset;
|
||||
+ memmove (buf + sps_pps_header_size, buf, pBuffer->nFilledLen);
|
||||
+ memcpy (buf, sps_pps_header, sps_pps_header_size);
|
||||
+ pBuffer->nFilledLen += sps_pps_header_size;
|
||||
+
|
||||
+ g_free (sps_pps_header);
|
||||
+ sps_pps_header = NULL;
|
||||
+ sps_pps_header_size = 0;
|
||||
+ }
|
||||
+ }
|
||||
+#endif /* COMBINE_SPS_PPS_HEADERS */
|
||||
+
|
||||
if (buf->port->tunneled) {
|
||||
GST_ERROR ("FillBufferDone on tunneled port");
|
||||
return OMX_ErrorBadParameter;
|
||||
Reference in New Issue
Block a user