This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit f31675400b9956f178e8743e4f9038a6fc1211d8
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Sun Mar 8 20:41:02 2026 +0100
Commit:     Andreas Rheinhardt <[email protected]>
CommitDate: Tue Jun 23 17:15:02 2026 +0200

    avcodec: Remove FF_CODEC_OMX
    
    The omx encoders were deprecated on 2024-11-09.
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 MAINTAINERS                |   1 -
 configure                  |  16 -
 libavcodec/Makefile        |   2 -
 libavcodec/allcodecs.c     |   2 -
 libavcodec/omx.c           | 986 ---------------------------------------------
 libavcodec/version_major.h |   4 -
 6 files changed, 1011 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 88a6478a64..7ffa6982fc 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -234,7 +234,6 @@ Codecs:
   nuv.c                                 Reimar Doeffinger
   nvdec*, nvenc*                        Timo Rothenpieler
   oh*                                   Zhao Zhili
-  omx.c                                 Martin Storsjo, Aman Gupta
   opus*                                 Rostislav Pehlivanov
   pcx.c                                 Ivo van Poorten
   pgssubdec.c                           Reimar Doeffinger
diff --git a/configure b/configure
index d3ea7ca6b5..2bf25e9755 100755
--- a/configure
+++ b/configure
@@ -364,8 +364,6 @@ External library support:
   --enable-mmal            enable Broadcom Multi-Media Abstraction Layer 
(Raspberry Pi) via MMAL [no]
   --disable-nvdec          disable Nvidia video decoding acceleration (via 
hwaccel) [autodetect]
   --disable-nvenc          disable Nvidia video encoding code [autodetect]
-  --enable-omx             enable OpenMAX IL code [no]
-  --enable-omx-rpi         enable OpenMAX IL code for Raspberry Pi [no]
   --enable-rkmpp           enable Rockchip Media Process Platform code [no]
   --disable-v4l2-m2m       disable V4L2 mem2mem code [autodetect]
   --disable-vaapi          disable Video Acceleration API (mainly Unix/Intel) 
code [autodetect]
@@ -2205,7 +2203,6 @@ HWACCEL_LIBRARY_LIST="
     libmfx
     libvpl
     mmal
-    omx
     opencl
 "
 
@@ -2222,7 +2219,6 @@ FEATURE_LIST="
     ftrapv
     gray
     hardcoded_tables
-    omx_rpi
     runtime_cpudetect
     safe_bitstream_reader
     shared
@@ -3566,8 +3562,6 @@ wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
 # hardware-accelerated codecs
 d3d12va_encode_deps="d3d12va ID3D12VideoEncoder d3d12_encoder_feature"
 mediafoundation_deps="mftransform_h MFCreateAlignedMemoryBuffer"
-omx_deps="libdl pthreads"
-omx_rpi_select="omx"
 qsv_deps="libmfx"
 qsvdec_select="qsv"
 qsvenc_select="qsv"
@@ -3651,7 +3645,6 @@ h264_nvenc_encoder_select="atsc_a53"
 h264_oh_decoder_deps="ohcodec"
 h264_oh_decoder_select="h264_mp4toannexb_bsf"
 h264_oh_encoder_deps="ohcodec"
-h264_omx_encoder_deps="omx"
 h264_qsv_decoder_select="h264_mp4toannexb_bsf qsvdec"
 h264_qsv_encoder_select="atsc_a53 qsvenc"
 h264_rkmpp_decoder_deps="rkmpp"
@@ -3711,7 +3704,6 @@ mpeg4_mediacodec_decoder_deps="mediacodec"
 mpeg4_mediacodec_encoder_deps="mediacodec"
 mpeg4_mediacodec_encoder_select="extract_extradata_bsf"
 mpeg4_mmal_decoder_deps="mmal"
-mpeg4_omx_encoder_deps="omx"
 mpeg4_v4l2m2m_decoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
 mpeg4_v4l2m2m_encoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
 vc1_cuvid_decoder_deps="cuvid"
@@ -7582,14 +7574,6 @@ enabled opengl            && { check_lib opengl GL/glx.h 
glXGetProcAddress "-lGL
                                check_lib opengl ES2/gl.h glGetError 
"-isysroot=${sysroot} -framework OpenGLES" ||
                                die "ERROR: opengl not found."
                              }
-enabled omx_rpi           && { test_code cc OMX_Core.h 
OMX_IndexConfigBrcmVideoRequestIFrame ||
-                               { ! enabled cross_compile &&
-                                 add_cflags -isystem/opt/vc/include/IL &&
-                                 test_code cc OMX_Core.h 
OMX_IndexConfigBrcmVideoRequestIFrame; } ||
-                               die "ERROR: OpenMAX IL headers from 
raspberrypi/firmware not found"; } &&
-                             enable omx
-enabled omx               && require_headers OMX_Core.h && \
-    warn "The OpenMAX encoders are deprecated and will be removed in future 
versions"
 
 enabled openssl           && { { check_pkg_config openssl "openssl >= 3.0.0" 
openssl/ssl.h DTLS_get_data_mtu &&
                                  { enabled gplv3 || ! enabled gpl || enabled 
nonfree || die "ERROR: OpenSSL >=3.0.0 requires --enable-version3"; }; } ||
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 7abf2d2d89..95ba308504 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -442,7 +442,6 @@ OBJS-$(CONFIG_H264_MMAL_DECODER)       += mmaldec.o
 OBJS-$(CONFIG_H264_NVENC_ENCODER)      += nvenc_h264.o nvenc.o
 OBJS-$(CONFIG_H264_OH_DECODER)         += ohcodec.o ohdec.o
 OBJS-$(CONFIG_H264_OH_ENCODER)         += ohcodec.o ohenc.o
-OBJS-$(CONFIG_H264_OMX_ENCODER)        += omx.o
 OBJS-$(CONFIG_H264_QSV_DECODER)        += qsvdec.o
 OBJS-$(CONFIG_H264_QSV_ENCODER)        += qsvenc_h264.o
 OBJS-$(CONFIG_H264_RKMPP_DECODER)      += rkmppdec.o
@@ -587,7 +586,6 @@ OBJS-$(CONFIG_MPEG4_ENCODER)           += mpeg4videoenc.o
 OBJS-$(CONFIG_MPEG4_CUVID_DECODER)     += cuviddec.o
 OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec.o
 OBJS-$(CONFIG_MPEG4_MEDIACODEC_ENCODER) += mediacodecenc.o
-OBJS-$(CONFIG_MPEG4_OMX_ENCODER)       += omx.o
 OBJS-$(CONFIG_MPEG4_V4L2M2M_DECODER)   += v4l2_m2m_dec.o
 OBJS-$(CONFIG_MPEG4_V4L2M2M_ENCODER)   += v4l2_m2m_enc.o
 OBJS-$(CONFIG_MPL2_DECODER)            += mpl2dec.o ass.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 592b026c9f..7a0224c7d6 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -879,7 +879,6 @@ extern const FFCodec ff_h264_mf_encoder;
 extern const FFCodec ff_h264_nvenc_encoder;
 extern const FFCodec ff_h264_oh_decoder;
 extern const FFCodec ff_h264_oh_encoder;
-extern const FFCodec ff_h264_omx_encoder;
 extern const FFCodec ff_h264_qsv_encoder;
 extern const FFCodec ff_h264_v4l2m2m_encoder;
 extern const FFCodec ff_h264_vaapi_encoder;
@@ -914,7 +913,6 @@ extern const FFCodec ff_mpeg2_vaapi_encoder;
 extern const FFCodec ff_mpeg4_cuvid_decoder;
 extern const FFCodec ff_mpeg4_mediacodec_decoder;
 extern const FFCodec ff_mpeg4_mediacodec_encoder;
-extern const FFCodec ff_mpeg4_omx_encoder;
 extern const FFCodec ff_mpeg4_v4l2m2m_encoder;
 extern const FFCodec ff_prores_videotoolbox_encoder;
 extern const FFCodec ff_vc1_cuvid_decoder;
diff --git a/libavcodec/omx.c b/libavcodec/omx.c
deleted file mode 100644
index 7b003ac1b7..0000000000
--- a/libavcodec/omx.c
+++ /dev/null
@@ -1,986 +0,0 @@
-/*
- * OMX Video encoder
- * Copyright (C) 2011 Martin Storsjo
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "config.h"
-
-#if CONFIG_OMX_RPI
-#define OMX_SKIP64BIT
-#endif
-
-#include <dlfcn.h>
-#include <OMX_Core.h>
-#include <OMX_Component.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/time.h>
-
-#include "libavutil/avstring.h"
-#include "libavutil/avutil.h"
-#include "libavutil/common.h"
-#include "libavutil/imgutils.h"
-#include "libavutil/log.h"
-#include "libavutil/mem.h"
-#include "libavutil/opt.h"
-
-#include "avcodec.h"
-#include "codec_internal.h"
-#include "h264.h"
-#include "pthread_internal.h"
-
-#ifdef OMX_SKIP64BIT
-static OMX_TICKS to_omx_ticks(int64_t value)
-{
-    OMX_TICKS s;
-    s.nLowPart  = value & 0xffffffff;
-    s.nHighPart = value >> 32;
-    return s;
-}
-static int64_t from_omx_ticks(OMX_TICKS value)
-{
-    return (((int64_t)value.nHighPart) << 32) | value.nLowPart;
-}
-#else
-#define to_omx_ticks(x) (x)
-#define from_omx_ticks(x) (x)
-#endif
-
-#define INIT_STRUCT(x) do {                                               \
-        x.nSize = sizeof(x);                                              \
-        x.nVersion = s->version;                                          \
-    } while (0)
-#define CHECK(x) do {                                                     \
-        if (x != OMX_ErrorNone) {                                         \
-            av_log(avctx, AV_LOG_ERROR,                                   \
-                   "err %x (%d) on line %d\n", x, x, __LINE__);           \
-            return AVERROR_UNKNOWN;                                       \
-        }                                                                 \
-    } while (0)
-
-typedef struct OMXContext {
-    void *lib;
-    void *lib2;
-    OMX_ERRORTYPE (*ptr_Init)(void);
-    OMX_ERRORTYPE (*ptr_Deinit)(void);
-    OMX_ERRORTYPE (*ptr_ComponentNameEnum)(OMX_STRING, OMX_U32, OMX_U32);
-    OMX_ERRORTYPE (*ptr_GetHandle)(OMX_HANDLETYPE*, OMX_STRING, OMX_PTR, 
OMX_CALLBACKTYPE*);
-    OMX_ERRORTYPE (*ptr_FreeHandle)(OMX_HANDLETYPE);
-    OMX_ERRORTYPE (*ptr_GetComponentsOfRole)(OMX_STRING, OMX_U32*, OMX_U8**);
-    OMX_ERRORTYPE (*ptr_GetRolesOfComponent)(OMX_STRING, OMX_U32*, OMX_U8**);
-    void (*host_init)(void);
-} OMXContext;
-
-static av_cold void *dlsym_prefixed(void *handle, const char *symbol, const 
char *prefix)
-{
-    char buf[50];
-    snprintf(buf, sizeof(buf), "%s%s", prefix ? prefix : "", symbol);
-    return dlsym(handle, buf);
-}
-
-static av_cold int omx_try_load(OMXContext *s, void *logctx,
-                                const char *libname, const char *prefix,
-                                const char *libname2)
-{
-    if (libname2) {
-        s->lib2 = dlopen(libname2, RTLD_NOW | RTLD_GLOBAL);
-        if (!s->lib2) {
-            av_log(logctx, AV_LOG_WARNING, "%s not found\n", libname2);
-            return AVERROR_ENCODER_NOT_FOUND;
-        }
-        s->host_init = dlsym(s->lib2, "bcm_host_init");
-        if (!s->host_init) {
-            av_log(logctx, AV_LOG_WARNING, "bcm_host_init not found\n");
-            dlclose(s->lib2);
-            s->lib2 = NULL;
-            return AVERROR_ENCODER_NOT_FOUND;
-        }
-    }
-    s->lib = dlopen(libname, RTLD_NOW | RTLD_GLOBAL);
-    if (!s->lib) {
-        av_log(logctx, AV_LOG_WARNING, "%s not found\n", libname);
-        return AVERROR_ENCODER_NOT_FOUND;
-    }
-    s->ptr_Init                = dlsym_prefixed(s->lib, "OMX_Init", prefix);
-    s->ptr_Deinit              = dlsym_prefixed(s->lib, "OMX_Deinit", prefix);
-    s->ptr_ComponentNameEnum   = dlsym_prefixed(s->lib, 
"OMX_ComponentNameEnum", prefix);
-    s->ptr_GetHandle           = dlsym_prefixed(s->lib, "OMX_GetHandle", 
prefix);
-    s->ptr_FreeHandle          = dlsym_prefixed(s->lib, "OMX_FreeHandle", 
prefix);
-    s->ptr_GetComponentsOfRole = dlsym_prefixed(s->lib, 
"OMX_GetComponentsOfRole", prefix);
-    s->ptr_GetRolesOfComponent = dlsym_prefixed(s->lib, 
"OMX_GetRolesOfComponent", prefix);
-    if (!s->ptr_Init || !s->ptr_Deinit || !s->ptr_ComponentNameEnum ||
-        !s->ptr_GetHandle || !s->ptr_FreeHandle ||
-        !s->ptr_GetComponentsOfRole || !s->ptr_GetRolesOfComponent) {
-        av_log(logctx, AV_LOG_WARNING, "Not all functions found in %s\n", 
libname);
-        dlclose(s->lib);
-        s->lib = NULL;
-        if (s->lib2)
-            dlclose(s->lib2);
-        s->lib2 = NULL;
-        return AVERROR_ENCODER_NOT_FOUND;
-    }
-    return 0;
-}
-
-static av_cold OMXContext *omx_init(void *logctx, const char *libname, const 
char *prefix)
-{
-    static const char * const libnames[] = {
-#if CONFIG_OMX_RPI
-        "/opt/vc/lib/libopenmaxil.so", "/opt/vc/lib/libbcm_host.so",
-#else
-        "libOMX_Core.so", NULL,
-        "libOmxCore.so", NULL,
-#endif
-        NULL
-    };
-    const char* const* nameptr;
-    int ret = AVERROR_ENCODER_NOT_FOUND;
-    OMXContext *omx_context;
-
-    omx_context = av_mallocz(sizeof(*omx_context));
-    if (!omx_context)
-        return NULL;
-    if (libname) {
-        ret = omx_try_load(omx_context, logctx, libname, prefix, NULL);
-        if (ret < 0) {
-            av_free(omx_context);
-            return NULL;
-        }
-    } else {
-        for (nameptr = libnames; *nameptr; nameptr += 2)
-            if (!(ret = omx_try_load(omx_context, logctx, nameptr[0], prefix, 
nameptr[1])))
-                break;
-        if (!*nameptr) {
-            av_free(omx_context);
-            return NULL;
-        }
-    }
-
-    if (omx_context->host_init)
-        omx_context->host_init();
-    omx_context->ptr_Init();
-    return omx_context;
-}
-
-static av_cold void omx_deinit(OMXContext *omx_context)
-{
-    if (!omx_context)
-        return;
-    omx_context->ptr_Deinit();
-    dlclose(omx_context->lib);
-    av_free(omx_context);
-}
-
-typedef struct OMXCodecContext {
-    const AVClass *class;
-    char *libname;
-    char *libprefix;
-    OMXContext *omx_context;
-
-    AVCodecContext *avctx;
-
-    char component_name[OMX_MAX_STRINGNAME_SIZE];
-    OMX_VERSIONTYPE version;
-    OMX_HANDLETYPE handle;
-    int in_port, out_port;
-    OMX_COLOR_FORMATTYPE color_format;
-    int stride, plane_size;
-
-    int num_in_buffers, num_out_buffers;
-    OMX_BUFFERHEADERTYPE **in_buffer_headers;
-    OMX_BUFFERHEADERTYPE **out_buffer_headers;
-    int num_free_in_buffers;
-    OMX_BUFFERHEADERTYPE **free_in_buffers;
-    int num_done_out_buffers;
-    OMX_BUFFERHEADERTYPE **done_out_buffers;
-    pthread_mutex_t input_mutex;
-    pthread_cond_t input_cond;
-    pthread_mutex_t output_mutex;
-    pthread_cond_t output_cond;
-
-    pthread_mutex_t state_mutex;
-    pthread_cond_t state_cond;
-    OMX_STATETYPE state;
-    OMX_ERRORTYPE error;
-
-    unsigned mutex_cond_inited_cnt;
-
-    int eos_sent, got_eos;
-
-    uint8_t *output_buf;
-    int output_buf_size;
-
-    int input_zerocopy;
-    int profile;
-} OMXCodecContext;
-
-#define NB_MUTEX_CONDS 6
-#define OFF(field) offsetof(OMXCodecContext, field)
-DEFINE_OFFSET_ARRAY(OMXCodecContext, omx_codec_context, mutex_cond_inited_cnt,
-                    (OFF(input_mutex), OFF(output_mutex), OFF(state_mutex)),
-                    (OFF(input_cond),  OFF(output_cond),  OFF(state_cond)));
-
-static void append_buffer(pthread_mutex_t *mutex, pthread_cond_t *cond,
-                          int* array_size, OMX_BUFFERHEADERTYPE **array,
-                          OMX_BUFFERHEADERTYPE *buffer)
-{
-    pthread_mutex_lock(mutex);
-    array[(*array_size)++] = buffer;
-    pthread_cond_broadcast(cond);
-    pthread_mutex_unlock(mutex);
-}
-
-static OMX_BUFFERHEADERTYPE *get_buffer(pthread_mutex_t *mutex, pthread_cond_t 
*cond,
-                                        int* array_size, OMX_BUFFERHEADERTYPE 
**array,
-                                        int wait)
-{
-    OMX_BUFFERHEADERTYPE *buffer;
-    pthread_mutex_lock(mutex);
-    if (wait) {
-        while (!*array_size)
-           pthread_cond_wait(cond, mutex);
-    }
-    if (*array_size > 0) {
-        buffer = array[0];
-        (*array_size)--;
-        memmove(&array[0], &array[1], (*array_size) * 
sizeof(OMX_BUFFERHEADERTYPE*));
-    } else {
-        buffer = NULL;
-    }
-    pthread_mutex_unlock(mutex);
-    return buffer;
-}
-
-static OMX_ERRORTYPE event_handler(OMX_HANDLETYPE component, OMX_PTR app_data, 
OMX_EVENTTYPE event,
-                                   OMX_U32 data1, OMX_U32 data2, OMX_PTR 
event_data)
-{
-    OMXCodecContext *s = app_data;
-    // This uses casts in the printfs, since OMX_U32 actually is a typedef for
-    // unsigned long in official header versions (but there are also modified
-    // versions where it is something else).
-    switch (event) {
-    case OMX_EventError:
-        pthread_mutex_lock(&s->state_mutex);
-        av_log(s->avctx, AV_LOG_ERROR, "OMX error %"PRIx32"\n", (uint32_t) 
data1);
-        s->error = data1;
-        pthread_cond_broadcast(&s->state_cond);
-        pthread_mutex_unlock(&s->state_mutex);
-        break;
-    case OMX_EventCmdComplete:
-        if (data1 == OMX_CommandStateSet) {
-            pthread_mutex_lock(&s->state_mutex);
-            s->state = data2;
-            av_log(s->avctx, AV_LOG_VERBOSE, "OMX state changed to 
%"PRIu32"\n", (uint32_t) data2);
-            pthread_cond_broadcast(&s->state_cond);
-            pthread_mutex_unlock(&s->state_mutex);
-        } else if (data1 == OMX_CommandPortDisable) {
-            av_log(s->avctx, AV_LOG_VERBOSE, "OMX port %"PRIu32" disabled\n", 
(uint32_t) data2);
-        } else if (data1 == OMX_CommandPortEnable) {
-            av_log(s->avctx, AV_LOG_VERBOSE, "OMX port %"PRIu32" enabled\n", 
(uint32_t) data2);
-        } else {
-            av_log(s->avctx, AV_LOG_VERBOSE, "OMX command complete, command 
%"PRIu32", value %"PRIu32"\n",
-                                             (uint32_t) data1, (uint32_t) 
data2);
-        }
-        break;
-    case OMX_EventPortSettingsChanged:
-        av_log(s->avctx, AV_LOG_VERBOSE, "OMX port %"PRIu32" settings 
changed\n", (uint32_t) data1);
-        break;
-    default:
-        av_log(s->avctx, AV_LOG_VERBOSE, "OMX event %d %"PRIx32" %"PRIx32"\n",
-                                         event, (uint32_t) data1, (uint32_t) 
data2);
-        break;
-    }
-    return OMX_ErrorNone;
-}
-
-static OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE component, OMX_PTR 
app_data,
-                                       OMX_BUFFERHEADERTYPE *buffer)
-{
-    OMXCodecContext *s = app_data;
-    if (s->input_zerocopy) {
-        if (buffer->pAppPrivate) {
-            if (buffer->pOutputPortPrivate)
-                av_free(buffer->pAppPrivate);
-            else
-                av_frame_free((AVFrame**)&buffer->pAppPrivate);
-            buffer->pAppPrivate = NULL;
-        }
-    }
-    append_buffer(&s->input_mutex, &s->input_cond,
-                  &s->num_free_in_buffers, s->free_in_buffers, buffer);
-    return OMX_ErrorNone;
-}
-
-static OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE component, OMX_PTR 
app_data,
-                                      OMX_BUFFERHEADERTYPE *buffer)
-{
-    OMXCodecContext *s = app_data;
-    append_buffer(&s->output_mutex, &s->output_cond,
-                  &s->num_done_out_buffers, s->done_out_buffers, buffer);
-    return OMX_ErrorNone;
-}
-
-static const OMX_CALLBACKTYPE callbacks = {
-    event_handler,
-    empty_buffer_done,
-    fill_buffer_done
-};
-
-static av_cold int find_component(OMXContext *omx_context, void *logctx,
-                                  const char *role, char *str, int str_size)
-{
-    OMX_U32 i, num = 0;
-    char **components;
-    int ret = 0;
-
-#if CONFIG_OMX_RPI
-    if (av_strstart(role, "video_encoder.", NULL)) {
-        av_strlcpy(str, "OMX.broadcom.video_encode", str_size);
-        return 0;
-    }
-#endif
-    omx_context->ptr_GetComponentsOfRole((OMX_STRING) role, &num, NULL);
-    if (!num) {
-        av_log(logctx, AV_LOG_WARNING, "No component for role %s found\n", 
role);
-        return AVERROR_ENCODER_NOT_FOUND;
-    }
-    components = av_calloc(num, sizeof(*components));
-    if (!components)
-        return AVERROR(ENOMEM);
-    for (i = 0; i < num; i++) {
-        components[i] = av_mallocz(OMX_MAX_STRINGNAME_SIZE);
-        if (!components[i]) {
-            ret = AVERROR(ENOMEM);
-            goto end;
-        }
-    }
-    omx_context->ptr_GetComponentsOfRole((OMX_STRING) role, &num, (OMX_U8**) 
components);
-    av_strlcpy(str, components[0], str_size);
-end:
-    for (i = 0; i < num; i++)
-        av_free(components[i]);
-    av_free(components);
-    return ret;
-}
-
-static av_cold int wait_for_state(OMXCodecContext *s, OMX_STATETYPE state)
-{
-    int ret = 0;
-    pthread_mutex_lock(&s->state_mutex);
-    while (s->state != state && s->error == OMX_ErrorNone)
-        pthread_cond_wait(&s->state_cond, &s->state_mutex);
-    if (s->error != OMX_ErrorNone)
-        ret = AVERROR_ENCODER_NOT_FOUND;
-    pthread_mutex_unlock(&s->state_mutex);
-    return ret;
-}
-
-static av_cold int omx_component_init(AVCodecContext *avctx, const char *role)
-{
-    OMXCodecContext *s = avctx->priv_data;
-    OMX_PARAM_COMPONENTROLETYPE role_params = { 0 };
-    OMX_PORT_PARAM_TYPE video_port_params = { 0 };
-    OMX_PARAM_PORTDEFINITIONTYPE in_port_params = { 0 }, out_port_params = { 0 
};
-    OMX_VIDEO_PARAM_PORTFORMATTYPE video_port_format = { 0 };
-    OMX_VIDEO_PARAM_BITRATETYPE vid_param_bitrate = { 0 };
-    OMX_ERRORTYPE err;
-    int i;
-
-    s->version.s.nVersionMajor = 1;
-    s->version.s.nVersionMinor = 1;
-    s->version.s.nRevision     = 2;
-
-    err = s->omx_context->ptr_GetHandle(&s->handle, s->component_name, s, 
(OMX_CALLBACKTYPE*) &callbacks);
-    if (err != OMX_ErrorNone) {
-        av_log(avctx, AV_LOG_ERROR, "OMX_GetHandle(%s) failed: %x\n", 
s->component_name, err);
-        return AVERROR_UNKNOWN;
-    }
-
-    // This one crashes the mediaserver on qcom, if used over IOMX
-    INIT_STRUCT(role_params);
-    av_strlcpy(role_params.cRole, role, sizeof(role_params.cRole));
-    // Intentionally ignore errors on this one
-    OMX_SetParameter(s->handle, OMX_IndexParamStandardComponentRole, 
&role_params);
-
-    INIT_STRUCT(video_port_params);
-    err = OMX_GetParameter(s->handle, OMX_IndexParamVideoInit, 
&video_port_params);
-    CHECK(err);
-
-    s->in_port = s->out_port = -1;
-    for (i = 0; i < video_port_params.nPorts; i++) {
-        int port = video_port_params.nStartPortNumber + i;
-        OMX_PARAM_PORTDEFINITIONTYPE port_params = { 0 };
-        INIT_STRUCT(port_params);
-        port_params.nPortIndex = port;
-        err = OMX_GetParameter(s->handle, OMX_IndexParamPortDefinition, 
&port_params);
-        if (err != OMX_ErrorNone) {
-            av_log(avctx, AV_LOG_WARNING, "port %d error %x\n", port, err);
-            break;
-        }
-        if (port_params.eDir == OMX_DirInput && s->in_port < 0) {
-            in_port_params = port_params;
-            s->in_port = port;
-        } else if (port_params.eDir == OMX_DirOutput && s->out_port < 0) {
-            out_port_params = port_params;
-            s->out_port = port;
-        }
-    }
-    if (s->in_port < 0 || s->out_port < 0) {
-        av_log(avctx, AV_LOG_ERROR, "No in or out port found (in %d out 
%d)\n", s->in_port, s->out_port);
-        return AVERROR_UNKNOWN;
-    }
-
-    s->color_format = 0;
-    for (i = 0; ; i++) {
-        INIT_STRUCT(video_port_format);
-        video_port_format.nIndex = i;
-        video_port_format.nPortIndex = s->in_port;
-        if (OMX_GetParameter(s->handle, OMX_IndexParamVideoPortFormat, 
&video_port_format) != OMX_ErrorNone)
-            break;
-        if (video_port_format.eColorFormat == OMX_COLOR_FormatYUV420Planar ||
-            video_port_format.eColorFormat == 
OMX_COLOR_FormatYUV420PackedPlanar) {
-            s->color_format = video_port_format.eColorFormat;
-            break;
-        }
-    }
-    if (s->color_format == 0) {
-        av_log(avctx, AV_LOG_ERROR, "No supported pixel formats (%d formats 
available)\n", i);
-        return AVERROR_UNKNOWN;
-    }
-
-    in_port_params.bEnabled   = OMX_TRUE;
-    in_port_params.bPopulated = OMX_FALSE;
-    in_port_params.eDomain    = OMX_PortDomainVideo;
-
-    in_port_params.format.video.pNativeRender         = NULL;
-    in_port_params.format.video.bFlagErrorConcealment = OMX_FALSE;
-    in_port_params.format.video.eColorFormat          = s->color_format;
-    s->stride     = avctx->width;
-    s->plane_size = avctx->height;
-    // If specific codecs need to manually override the stride/plane_size,
-    // that can be done here.
-    in_port_params.format.video.nStride      = s->stride;
-    in_port_params.format.video.nSliceHeight = s->plane_size;
-    in_port_params.format.video.nFrameWidth  = avctx->width;
-    in_port_params.format.video.nFrameHeight = avctx->height;
-    if (avctx->framerate.den > 0 && avctx->framerate.num > 0)
-        in_port_params.format.video.xFramerate = (1LL << 16) * 
avctx->framerate.num / avctx->framerate.den;
-    else
-        in_port_params.format.video.xFramerate = (1LL << 16) * 
avctx->time_base.den / avctx->time_base.num;
-
-    err = OMX_SetParameter(s->handle, OMX_IndexParamPortDefinition, 
&in_port_params);
-    CHECK(err);
-    err = OMX_GetParameter(s->handle, OMX_IndexParamPortDefinition, 
&in_port_params);
-    CHECK(err);
-    s->stride         = in_port_params.format.video.nStride;
-    s->plane_size     = in_port_params.format.video.nSliceHeight;
-    s->num_in_buffers = in_port_params.nBufferCountActual;
-
-    err = OMX_GetParameter(s->handle, OMX_IndexParamPortDefinition, 
&out_port_params);
-    out_port_params.bEnabled   = OMX_TRUE;
-    out_port_params.bPopulated = OMX_FALSE;
-    out_port_params.eDomain    = OMX_PortDomainVideo;
-    out_port_params.format.video.pNativeRender = NULL;
-    out_port_params.format.video.nFrameWidth   = avctx->width;
-    out_port_params.format.video.nFrameHeight  = avctx->height;
-    out_port_params.format.video.nStride       = 0;
-    out_port_params.format.video.nSliceHeight  = 0;
-    out_port_params.format.video.nBitrate      = avctx->bit_rate;
-    out_port_params.format.video.xFramerate    = 
in_port_params.format.video.xFramerate;
-    out_port_params.format.video.bFlagErrorConcealment  = OMX_FALSE;
-    if (avctx->codec->id == AV_CODEC_ID_MPEG4)
-        out_port_params.format.video.eCompressionFormat = 
OMX_VIDEO_CodingMPEG4;
-    else if (avctx->codec->id == AV_CODEC_ID_H264)
-        out_port_params.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
-
-    err = OMX_SetParameter(s->handle, OMX_IndexParamPortDefinition, 
&out_port_params);
-    CHECK(err);
-    err = OMX_GetParameter(s->handle, OMX_IndexParamPortDefinition, 
&out_port_params);
-    CHECK(err);
-    s->num_out_buffers = out_port_params.nBufferCountActual;
-
-    INIT_STRUCT(vid_param_bitrate);
-    vid_param_bitrate.nPortIndex     = s->out_port;
-    vid_param_bitrate.eControlRate   = OMX_Video_ControlRateVariable;
-    vid_param_bitrate.nTargetBitrate = avctx->bit_rate;
-    err = OMX_SetParameter(s->handle, OMX_IndexParamVideoBitrate, 
&vid_param_bitrate);
-    if (err != OMX_ErrorNone)
-        av_log(avctx, AV_LOG_WARNING, "Unable to set video bitrate 
parameter\n");
-
-    if (avctx->codec->id == AV_CODEC_ID_H264) {
-        OMX_VIDEO_PARAM_AVCTYPE avc = { 0 };
-        INIT_STRUCT(avc);
-        avc.nPortIndex = s->out_port;
-        err = OMX_GetParameter(s->handle, OMX_IndexParamVideoAvc, &avc);
-        CHECK(err);
-        avc.nBFrames = 0;
-        avc.nPFrames = avctx->gop_size - 1;
-        switch (s->profile == AV_PROFILE_UNKNOWN ? avctx->profile : 
s->profile) {
-        case AV_PROFILE_H264_BASELINE:
-            avc.eProfile = OMX_VIDEO_AVCProfileBaseline;
-            break;
-        case AV_PROFILE_H264_MAIN:
-            avc.eProfile = OMX_VIDEO_AVCProfileMain;
-            break;
-        case AV_PROFILE_H264_HIGH:
-            avc.eProfile = OMX_VIDEO_AVCProfileHigh;
-            break;
-        default:
-            break;
-        }
-        err = OMX_SetParameter(s->handle, OMX_IndexParamVideoAvc, &avc);
-        CHECK(err);
-    }
-
-    err = OMX_SendCommand(s->handle, OMX_CommandStateSet, OMX_StateIdle, NULL);
-    CHECK(err);
-
-    s->in_buffer_headers  = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * 
s->num_in_buffers);
-    s->free_in_buffers    = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * 
s->num_in_buffers);
-    s->out_buffer_headers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * 
s->num_out_buffers);
-    s->done_out_buffers   = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * 
s->num_out_buffers);
-    if (!s->in_buffer_headers || !s->free_in_buffers || !s->out_buffer_headers 
|| !s->done_out_buffers)
-        return AVERROR(ENOMEM);
-    for (i = 0; i < s->num_in_buffers && err == OMX_ErrorNone; i++) {
-        if (s->input_zerocopy)
-            err = OMX_UseBuffer(s->handle, &s->in_buffer_headers[i], 
s->in_port, s, in_port_params.nBufferSize, NULL);
-        else
-            err = OMX_AllocateBuffer(s->handle, &s->in_buffer_headers[i],  
s->in_port,  s, in_port_params.nBufferSize);
-        if (err == OMX_ErrorNone)
-            s->in_buffer_headers[i]->pAppPrivate = 
s->in_buffer_headers[i]->pOutputPortPrivate = NULL;
-    }
-    CHECK(err);
-    s->num_in_buffers = i;
-    for (i = 0; i < s->num_out_buffers && err == OMX_ErrorNone; i++)
-        err = OMX_AllocateBuffer(s->handle, &s->out_buffer_headers[i], 
s->out_port, s, out_port_params.nBufferSize);
-    CHECK(err);
-    s->num_out_buffers = i;
-
-    if (wait_for_state(s, OMX_StateIdle) < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Didn't get OMX_StateIdle\n");
-        return AVERROR_UNKNOWN;
-    }
-    err = OMX_SendCommand(s->handle, OMX_CommandStateSet, OMX_StateExecuting, 
NULL);
-    CHECK(err);
-    if (wait_for_state(s, OMX_StateExecuting) < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Didn't get OMX_StateExecuting\n");
-        return AVERROR_UNKNOWN;
-    }
-
-    for (i = 0; i < s->num_out_buffers && err == OMX_ErrorNone; i++)
-        err = OMX_FillThisBuffer(s->handle, s->out_buffer_headers[i]);
-    if (err != OMX_ErrorNone) {
-        for (; i < s->num_out_buffers; i++)
-            s->done_out_buffers[s->num_done_out_buffers++] = 
s->out_buffer_headers[i];
-    }
-    for (i = 0; i < s->num_in_buffers; i++)
-        s->free_in_buffers[s->num_free_in_buffers++] = s->in_buffer_headers[i];
-    return err != OMX_ErrorNone ? AVERROR_UNKNOWN : 0;
-}
-
-static av_cold void cleanup(OMXCodecContext *s)
-{
-    int executing;
-
-    /* If the mutexes/condition variables have not been properly initialized,
-     * nothing has been initialized and locking the mutex might be unsafe. */
-    if (s->mutex_cond_inited_cnt == NB_MUTEX_CONDS) {
-        pthread_mutex_lock(&s->state_mutex);
-        executing = s->state == OMX_StateExecuting;
-        pthread_mutex_unlock(&s->state_mutex);
-
-        if (executing) {
-            OMX_SendCommand(s->handle, OMX_CommandStateSet, OMX_StateIdle, 
NULL);
-            wait_for_state(s, OMX_StateIdle);
-            OMX_SendCommand(s->handle, OMX_CommandStateSet, OMX_StateLoaded, 
NULL);
-            for (int i = 0; i < s->num_in_buffers; i++) {
-                OMX_BUFFERHEADERTYPE *buffer = get_buffer(&s->input_mutex, 
&s->input_cond,
-                                                        
&s->num_free_in_buffers, s->free_in_buffers, 1);
-                if (s->input_zerocopy)
-                    buffer->pBuffer = NULL;
-                OMX_FreeBuffer(s->handle, s->in_port, buffer);
-            }
-            for (int i = 0; i < s->num_out_buffers; i++) {
-                OMX_BUFFERHEADERTYPE *buffer = get_buffer(&s->output_mutex, 
&s->output_cond,
-                                                        
&s->num_done_out_buffers, s->done_out_buffers, 1);
-                OMX_FreeBuffer(s->handle, s->out_port, buffer);
-            }
-            wait_for_state(s, OMX_StateLoaded);
-        }
-        if (s->handle) {
-            s->omx_context->ptr_FreeHandle(s->handle);
-            s->handle = NULL;
-        }
-
-        omx_deinit(s->omx_context);
-        s->omx_context = NULL;
-        av_freep(&s->in_buffer_headers);
-        av_freep(&s->out_buffer_headers);
-        av_freep(&s->free_in_buffers);
-        av_freep(&s->done_out_buffers);
-        av_freep(&s->output_buf);
-    }
-    ff_pthread_free(s, omx_codec_context_offsets);
-}
-
-static av_cold int omx_encode_init(AVCodecContext *avctx)
-{
-    OMXCodecContext *s = avctx->priv_data;
-    int ret = AVERROR_ENCODER_NOT_FOUND;
-    const char *role;
-    OMX_BUFFERHEADERTYPE *buffer;
-    OMX_ERRORTYPE err;
-
-    av_log(avctx, AV_LOG_WARNING,
-           "The %s encoder is deprecated and will be removed in future 
versions\n",
-           avctx->codec->name);
-
-    /* cleanup relies on the mutexes/conditions being initialized first. */
-    ret = ff_pthread_init(s, omx_codec_context_offsets);
-    if (ret < 0)
-        return ret;
-    s->omx_context = omx_init(avctx, s->libname, s->libprefix);
-    if (!s->omx_context)
-        return AVERROR_ENCODER_NOT_FOUND;
-
-    s->avctx = avctx;
-    s->state = OMX_StateLoaded;
-    s->error = OMX_ErrorNone;
-
-    switch (avctx->codec->id) {
-    case AV_CODEC_ID_MPEG4:
-        role = "video_encoder.mpeg4";
-        break;
-    case AV_CODEC_ID_H264:
-        role = "video_encoder.avc";
-        break;
-    default:
-        return AVERROR(ENOSYS);
-    }
-
-    if ((ret = find_component(s->omx_context, avctx, role, s->component_name, 
sizeof(s->component_name))) < 0)
-        goto fail;
-
-    av_log(avctx, AV_LOG_INFO, "Using %s\n", s->component_name);
-
-    if ((ret = omx_component_init(avctx, role)) < 0)
-        goto fail;
-
-    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
-        while (1) {
-            buffer = get_buffer(&s->output_mutex, &s->output_cond,
-                                &s->num_done_out_buffers, s->done_out_buffers, 
1);
-            if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
-                if (buffer->nFilledLen > INT32_MAX - 
AV_INPUT_BUFFER_PADDING_SIZE - avctx->extradata_size) {
-                    ret = AVERROR(ENOMEM);
-                    goto fail;
-                }
-
-                if ((ret = av_reallocp(&avctx->extradata, 
avctx->extradata_size + buffer->nFilledLen + AV_INPUT_BUFFER_PADDING_SIZE)) < 
0) {
-                    avctx->extradata_size = 0;
-                    goto fail;
-                }
-                memcpy(avctx->extradata + avctx->extradata_size, 
buffer->pBuffer + buffer->nOffset, buffer->nFilledLen);
-                avctx->extradata_size += buffer->nFilledLen;
-                memset(avctx->extradata + avctx->extradata_size, 0, 
AV_INPUT_BUFFER_PADDING_SIZE);
-            }
-            err = OMX_FillThisBuffer(s->handle, buffer);
-            if (err != OMX_ErrorNone) {
-                append_buffer(&s->output_mutex, &s->output_cond,
-                              &s->num_done_out_buffers, s->done_out_buffers, 
buffer);
-                av_log(avctx, AV_LOG_ERROR, "OMX_FillThisBuffer failed: %x\n", 
err);
-                ret = AVERROR_UNKNOWN;
-                goto fail;
-            }
-            if (avctx->codec->id == AV_CODEC_ID_H264) {
-                // For H.264, the extradata can be returned in two separate 
buffers
-                // (the videocore encoder on raspberry pi does this);
-                // therefore check that we have got both SPS and PPS before 
continuing.
-                int nals[32] = { 0 };
-                int i;
-                for (i = 0; i + 4 < avctx->extradata_size; i++) {
-                     if (!avctx->extradata[i + 0] &&
-                         !avctx->extradata[i + 1] &&
-                         !avctx->extradata[i + 2] &&
-                         avctx->extradata[i + 3] == 1) {
-                         nals[avctx->extradata[i + 4] & 0x1f]++;
-                     }
-                }
-                if (nals[H264_NAL_SPS] && nals[H264_NAL_PPS])
-                    break;
-            } else {
-                if (avctx->extradata_size > 0)
-                    break;
-            }
-        }
-    }
-
-    return 0;
-fail:
-    return ret;
-}
-
-
-static int omx_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
-                            const AVFrame *frame, int *got_packet)
-{
-    OMXCodecContext *s = avctx->priv_data;
-    int ret = 0;
-    OMX_BUFFERHEADERTYPE* buffer;
-    OMX_ERRORTYPE err;
-    int had_partial = 0;
-
-    if (frame) {
-        uint8_t *dst[4];
-        int linesize[4];
-        int need_copy;
-        buffer = get_buffer(&s->input_mutex, &s->input_cond,
-                            &s->num_free_in_buffers, s->free_in_buffers, 1);
-
-        buffer->nFilledLen = av_image_fill_arrays(dst, linesize, 
buffer->pBuffer, avctx->pix_fmt, s->stride, s->plane_size, 1);
-
-        if (s->input_zerocopy) {
-            uint8_t *src[4] = { NULL };
-            int src_linesize[4];
-            av_image_fill_arrays(src, src_linesize, frame->data[0], 
avctx->pix_fmt, s->stride, s->plane_size, 1);
-            if (frame->linesize[0] == src_linesize[0] &&
-                frame->linesize[1] == src_linesize[1] &&
-                frame->linesize[2] == src_linesize[2] &&
-                frame->data[1] == src[1] &&
-                frame->data[2] == src[2]) {
-                // If the input frame happens to have all planes stored 
contiguously,
-                // with the right strides, just clone the frame and set the OMX
-                // buffer header to point to it
-                AVFrame *local = av_frame_clone(frame);
-                if (!local) {
-                    // Return the buffer to the queue so it's not lost
-                    append_buffer(&s->input_mutex, &s->input_cond, 
&s->num_free_in_buffers, s->free_in_buffers, buffer);
-                    return AVERROR(ENOMEM);
-                } else {
-                    buffer->pAppPrivate = local;
-                    buffer->pOutputPortPrivate = NULL;
-                    buffer->pBuffer = local->data[0];
-                    need_copy = 0;
-                }
-            } else {
-                // If not, we need to allocate a new buffer with the right
-                // size and copy the input frame into it.
-                uint8_t *buf = NULL;
-                int image_buffer_size = 
av_image_get_buffer_size(avctx->pix_fmt, s->stride, s->plane_size, 1);
-                if (image_buffer_size >= 0)
-                    buf = av_malloc(image_buffer_size);
-                if (!buf) {
-                    // Return the buffer to the queue so it's not lost
-                    append_buffer(&s->input_mutex, &s->input_cond, 
&s->num_free_in_buffers, s->free_in_buffers, buffer);
-                    return AVERROR(ENOMEM);
-                } else {
-                    buffer->pAppPrivate = buf;
-                    // Mark that pAppPrivate is an av_malloc'ed buffer, not an 
AVFrame
-                    buffer->pOutputPortPrivate = (void*) 1;
-                    buffer->pBuffer = buf;
-                    need_copy = 1;
-                    buffer->nFilledLen = av_image_fill_arrays(dst, linesize, 
buffer->pBuffer, avctx->pix_fmt, s->stride, s->plane_size, 1);
-                }
-            }
-        } else {
-            need_copy = 1;
-        }
-        if (need_copy)
-            av_image_copy2(dst, linesize, frame->data, frame->linesize,
-                           avctx->pix_fmt, avctx->width, avctx->height);
-        buffer->nFlags = OMX_BUFFERFLAG_ENDOFFRAME;
-        buffer->nOffset = 0;
-        // Convert the timestamps to microseconds; some encoders can ignore
-        // the framerate and do VFR bit allocation based on timestamps.
-        buffer->nTimeStamp = to_omx_ticks(av_rescale_q(frame->pts, 
avctx->time_base, AV_TIME_BASE_Q));
-        if (frame->pict_type == AV_PICTURE_TYPE_I) {
-#if CONFIG_OMX_RPI
-            OMX_CONFIG_BOOLEANTYPE config = {0, };
-            INIT_STRUCT(config);
-            config.bEnabled = OMX_TRUE;
-            err = OMX_SetConfig(s->handle, 
OMX_IndexConfigBrcmVideoRequestIFrame, &config);
-            if (err != OMX_ErrorNone) {
-                av_log(avctx, AV_LOG_ERROR, "OMX_SetConfig(RequestIFrame) 
failed: %x\n", err);
-            }
-#else
-            OMX_CONFIG_INTRAREFRESHVOPTYPE config = {0, };
-            INIT_STRUCT(config);
-            config.nPortIndex = s->out_port;
-            config.IntraRefreshVOP = OMX_TRUE;
-            err = OMX_SetConfig(s->handle, 
OMX_IndexConfigVideoIntraVOPRefresh, &config);
-            if (err != OMX_ErrorNone) {
-                av_log(avctx, AV_LOG_ERROR, "OMX_SetConfig(IntraVOPRefresh) 
failed: %x\n", err);
-            }
-#endif
-        }
-        err = OMX_EmptyThisBuffer(s->handle, buffer);
-        if (err != OMX_ErrorNone) {
-            append_buffer(&s->input_mutex, &s->input_cond, 
&s->num_free_in_buffers, s->free_in_buffers, buffer);
-            av_log(avctx, AV_LOG_ERROR, "OMX_EmptyThisBuffer failed: %x\n", 
err);
-            return AVERROR_UNKNOWN;
-        }
-    } else if (!s->eos_sent) {
-        buffer = get_buffer(&s->input_mutex, &s->input_cond,
-                            &s->num_free_in_buffers, s->free_in_buffers, 1);
-
-        buffer->nFilledLen = 0;
-        buffer->nFlags = OMX_BUFFERFLAG_EOS;
-        buffer->pAppPrivate = buffer->pOutputPortPrivate = NULL;
-        err = OMX_EmptyThisBuffer(s->handle, buffer);
-        if (err != OMX_ErrorNone) {
-            append_buffer(&s->input_mutex, &s->input_cond, 
&s->num_free_in_buffers, s->free_in_buffers, buffer);
-            av_log(avctx, AV_LOG_ERROR, "OMX_EmptyThisBuffer failed: %x\n", 
err);
-            return AVERROR_UNKNOWN;
-        }
-        s->eos_sent = 1;
-    }
-
-    while (!*got_packet && ret == 0 && !s->got_eos) {
-        // If not flushing, just poll the queue if there's finished packets.
-        // If flushing, do a blocking wait until we either get a completed
-        // packet, or get EOS.
-        buffer = get_buffer(&s->output_mutex, &s->output_cond,
-                            &s->num_done_out_buffers, s->done_out_buffers,
-                            !frame || had_partial);
-        if (!buffer)
-            break;
-
-        if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
-            s->got_eos = 1;
-
-        if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG && avctx->flags & 
AV_CODEC_FLAG_GLOBAL_HEADER) {
-            if ((ret = av_reallocp(&avctx->extradata, avctx->extradata_size + 
buffer->nFilledLen + AV_INPUT_BUFFER_PADDING_SIZE)) < 0) {
-                avctx->extradata_size = 0;
-                goto end;
-            }
-            memcpy(avctx->extradata + avctx->extradata_size, buffer->pBuffer + 
buffer->nOffset, buffer->nFilledLen);
-            avctx->extradata_size += buffer->nFilledLen;
-            memset(avctx->extradata + avctx->extradata_size, 0, 
AV_INPUT_BUFFER_PADDING_SIZE);
-        } else {
-            int newsize = s->output_buf_size + buffer->nFilledLen + 
AV_INPUT_BUFFER_PADDING_SIZE;
-            if ((ret = av_reallocp(&s->output_buf, newsize)) < 0) {
-                s->output_buf_size = 0;
-                goto end;
-            }
-            memcpy(s->output_buf + s->output_buf_size, buffer->pBuffer + 
buffer->nOffset, buffer->nFilledLen);
-            s->output_buf_size += buffer->nFilledLen;
-            if (buffer->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) {
-                memset(s->output_buf + s->output_buf_size, 0, 
AV_INPUT_BUFFER_PADDING_SIZE);
-                if ((ret = av_packet_from_data(pkt, s->output_buf, 
s->output_buf_size)) < 0) {
-                    av_freep(&s->output_buf);
-                    s->output_buf_size = 0;
-                    goto end;
-                }
-                s->output_buf = NULL;
-                s->output_buf_size = 0;
-                pkt->pts = av_rescale_q(from_omx_ticks(buffer->nTimeStamp), 
AV_TIME_BASE_Q, avctx->time_base);
-                // We don't currently enable B-frames for the encoders, so set
-                // pkt->dts = pkt->pts. (The calling code behaves worse if the 
encoder
-                // doesn't set the dts).
-                pkt->dts = pkt->pts;
-                if (buffer->nFlags & OMX_BUFFERFLAG_SYNCFRAME)
-                    pkt->flags |= AV_PKT_FLAG_KEY;
-                *got_packet = 1;
-            } else {
-#if CONFIG_OMX_RPI
-                had_partial = 1;
-#endif
-            }
-        }
-end:
-        err = OMX_FillThisBuffer(s->handle, buffer);
-        if (err != OMX_ErrorNone) {
-            append_buffer(&s->output_mutex, &s->output_cond, 
&s->num_done_out_buffers, s->done_out_buffers, buffer);
-            av_log(avctx, AV_LOG_ERROR, "OMX_FillThisBuffer failed: %x\n", 
err);
-            ret = AVERROR_UNKNOWN;
-        }
-    }
-    return ret;
-}
-
-static av_cold int omx_encode_end(AVCodecContext *avctx)
-{
-    OMXCodecContext *s = avctx->priv_data;
-
-    cleanup(s);
-    return 0;
-}
-
-#define OFFSET(x) offsetof(OMXCodecContext, x)
-#define VDE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM | 
AV_OPT_FLAG_ENCODING_PARAM
-#define VE  AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
-static const AVOption options[] = {
-    { "omx_libname", "OpenMAX library name", OFFSET(libname), 
AV_OPT_TYPE_STRING, { 0 }, 0, 0, VDE },
-    { "omx_libprefix", "OpenMAX library prefix", OFFSET(libprefix), 
AV_OPT_TYPE_STRING, { 0 }, 0, 0, VDE },
-    { "zerocopy", "Try to avoid copying input frames if possible", 
OFFSET(input_zerocopy), AV_OPT_TYPE_INT, { .i64 = CONFIG_OMX_RPI }, 0, 1, VE },
-    { "profile",  "Set the encoding profile", OFFSET(profile), 
AV_OPT_TYPE_INT,   { .i64 = AV_PROFILE_UNKNOWN },       AV_PROFILE_UNKNOWN, 
AV_PROFILE_H264_HIGH, VE, .unit = "profile" },
-    { "baseline", "",                         0,               
AV_OPT_TYPE_CONST, { .i64 = AV_PROFILE_H264_BASELINE }, 0, 0, VE, .unit = 
"profile" },
-    { "main",     "",                         0,               
AV_OPT_TYPE_CONST, { .i64 = AV_PROFILE_H264_MAIN },     0, 0, VE, .unit = 
"profile" },
-    { "high",     "",                         0,               
AV_OPT_TYPE_CONST, { .i64 = AV_PROFILE_H264_HIGH },     0, 0, VE, .unit = 
"profile" },
-    { NULL }
-};
-
-static const enum AVPixelFormat omx_encoder_pix_fmts[] = {
-    AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE
-};
-
-static const AVClass omx_mpeg4enc_class = {
-    .class_name = "mpeg4_omx",
-    .item_name  = av_default_item_name,
-    .option     = options,
-    .version    = LIBAVUTIL_VERSION_INT,
-};
-const FFCodec ff_mpeg4_omx_encoder = {
-    .p.name           = "mpeg4_omx",
-    CODEC_LONG_NAME("OpenMAX IL MPEG-4 video encoder"),
-    .p.type           = AVMEDIA_TYPE_VIDEO,
-    .p.id             = AV_CODEC_ID_MPEG4,
-    .priv_data_size   = sizeof(OMXCodecContext),
-    .init             = omx_encode_init,
-    FF_CODEC_ENCODE_CB(omx_encode_frame),
-    .close            = omx_encode_end,
-    CODEC_PIXFMTS_ARRAY(omx_encoder_pix_fmts),
-    .color_ranges     = AVCOL_RANGE_MPEG,
-    .p.capabilities   = AV_CODEC_CAP_DELAY,
-    .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,
-    .p.priv_class     = &omx_mpeg4enc_class,
-};
-
-static const AVClass omx_h264enc_class = {
-    .class_name = "h264_omx",
-    .item_name  = av_default_item_name,
-    .option     = options,
-    .version    = LIBAVUTIL_VERSION_INT,
-};
-const FFCodec ff_h264_omx_encoder = {
-    .p.name           = "h264_omx",
-    CODEC_LONG_NAME("OpenMAX IL H.264 video encoder"),
-    .p.type           = AVMEDIA_TYPE_VIDEO,
-    .p.id             = AV_CODEC_ID_H264,
-    .priv_data_size   = sizeof(OMXCodecContext),
-    .init             = omx_encode_init,
-    FF_CODEC_ENCODE_CB(omx_encode_frame),
-    .close            = omx_encode_end,
-    CODEC_PIXFMTS_ARRAY(omx_encoder_pix_fmts),
-    .color_ranges     = AVCOL_RANGE_MPEG, /* FIXME: implement tagging */
-    .p.capabilities   = AV_CODEC_CAP_DELAY,
-    .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,
-    .p.priv_class     = &omx_h264enc_class,
-};
diff --git a/libavcodec/version_major.h b/libavcodec/version_major.h
index 2723676245..df3f3236d8 100644
--- a/libavcodec/version_major.h
+++ b/libavcodec/version_major.h
@@ -50,10 +50,6 @@
 #define FF_API_PARSER_CODECID      (LIBAVCODEC_VERSION_MAJOR < 63)
 
 #define FF_API_MJPEG_EXTERN_HUFF   (LIBAVCODEC_VERSION_MAJOR < 63)
-
-// reminder to remove the OMX encoder on next major bump
-#define FF_CODEC_OMX               (LIBAVCODEC_VERSION_MAJOR < 63)
-
 #define FF_API_NVENC_H264_MAIN     (LIBAVCODEC_VERSION_MAJOR < 63)
 
 #endif /* AVCODEC_VERSION_MAJOR_H */

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to