[FFmpeg-devel] [PATCH 1/2] avcodec: add avcodec_register_one() to register one codec/parser/bsf/hwaccel by its char* name

Michael Niedermayer michaelni at gmx.at
Tue Sep 30 02:02:49 CEST 2014


Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 libavcodec/allcodecs.c |   51 +++++++++++++++++++++++++++++++++---------------
 libavcodec/avcodec.h   |    5 +++++
 2 files changed, 40 insertions(+), 16 deletions(-)

diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 7650543..019d5ea 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -29,49 +29,55 @@
 #include "version.h"
 
 #define REGISTER_HWACCEL(X, x)                                          \
-    {                                                                   \
+    if (!name || !strcmp(name, AV_STRINGIFY(x##_hwaccel))) {            \
         extern AVHWAccel ff_##x##_hwaccel;                              \
-        if (CONFIG_##X##_HWACCEL)                                       \
+        if (CONFIG_##X##_HWACCEL) {                                     \
             av_register_hwaccel(&ff_##x##_hwaccel);                     \
+            found++;                                                    \
+        }                                                               \
     }
 
 #define REGISTER_ENCODER(X, x)                                          \
-    {                                                                   \
+    if (!name || !strcmp(name, AV_STRINGIFY(x##_encoder))) {            \
         extern AVCodec ff_##x##_encoder;                                \
-        if (CONFIG_##X##_ENCODER)                                       \
+        if (CONFIG_##X##_ENCODER) {                                     \
             avcodec_register(&ff_##x##_encoder);                        \
+            found++;                                                    \
+        }                                                               \
     }
 
 #define REGISTER_DECODER(X, x)                                          \
-    {                                                                   \
+    if (!name || !strcmp(name, AV_STRINGIFY(x##_decoder))) {            \
         extern AVCodec ff_##x##_decoder;                                \
-        if (CONFIG_##X##_DECODER)                                       \
+        if (CONFIG_##X##_DECODER) {                                     \
             avcodec_register(&ff_##x##_decoder);                        \
+            found++;                                                    \
+        }                                                               \
     }
 
 #define REGISTER_ENCDEC(X, x) REGISTER_ENCODER(X, x); REGISTER_DECODER(X, x)
 
 #define REGISTER_PARSER(X, x)                                           \
-    {                                                                   \
+    if (!name || !strcmp(name, AV_STRINGIFY(x##_parser))) {             \
         extern AVCodecParser ff_##x##_parser;                           \
-        if (CONFIG_##X##_PARSER)                                        \
+        if (CONFIG_##X##_PARSER) {                                      \
             av_register_codec_parser(&ff_##x##_parser);                 \
+            found++;                                                    \
+        }                                                               \
     }
 
 #define REGISTER_BSF(X, x)                                              \
-    {                                                                   \
+    if (!name || !strcmp(name, AV_STRINGIFY(x##_bsf))) {                \
         extern AVBitStreamFilter ff_##x##_bsf;                          \
-        if (CONFIG_##X##_BSF)                                           \
+        if (CONFIG_##X##_BSF) {                                         \
             av_register_bitstream_filter(&ff_##x##_bsf);                \
+            found++;                                                    \
+        }                                                               \
     }
 
-void avcodec_register_all(void)
+int avcodec_register_one(const char *name)
 {
-    static int initialized;
-
-    if (initialized)
-        return;
-    initialized = 1;
+    int found = 0;
 
     /* hardware accelerators */
     REGISTER_HWACCEL(H263_VAAPI,        h263_vaapi);
@@ -588,4 +594,17 @@ void avcodec_register_all(void)
     REGISTER_BSF(NOISE,                 noise);
     REGISTER_BSF(REMOVE_EXTRADATA,      remove_extradata);
     REGISTER_BSF(TEXT2MOVSUB,           text2movsub);
+
+    return found;
 }
+
+void avcodec_register_all(void)
+{
+    static int initialized;
+
+    if (initialized)
+        return;
+    initialized = 1;
+
+    avcodec_register_one(NULL);
+}
\ No newline at end of file
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 94e82f7..de936a5 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3472,6 +3472,11 @@ void avcodec_register(AVCodec *codec);
 void avcodec_register_all(void);
 
 /**
+ * @returns the number of newly registered entities
+ */
+int avcodec_register_one(const char *name);
+
+/**
  * Allocate an AVCodecContext and set its fields to default values. The
  * resulting struct should be freed with avcodec_free_context().
  *
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list