[FFmpeg-devel] [PATCH] libavcodec/libx264.c: distinguish between x264 parameter errors

Erik Slagter erik at slagter.name
Fri Jun 24 12:06:31 CEST 2011


On 24-06-11 11:31, Etienne Buira wrote:

> Most functions in ffmpeg returns 0 on success (or positive), !=0 (resp.<0) otherwise.

Okay, if that's the point... I've reversed the logic.

The rest of our talking is just a misunderstanding imho, I won't address it,
if you don't mind.

New version with also with Cléments comments included.

diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index cc5b983..2dc0e9c 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -198,14 +198,25 @@ static void check_default_settings(AVCodecContext *avctx)
      }
  }

-#define OPT_STR(opt, param)                                             \
-    do {                                                                \
-        if (param && x264_param_parse(&x4->params, opt, param) < 0) {   \
-            av_log(avctx, AV_LOG_ERROR,                                 \
-                   "bad value for '%s': '%s'\n", opt, param);           \
-            return -1;                                                  \
-        }                                                               \
-    } while (0);                                                        \
+static int opt_str(AVCodecContext *avctx, X264Context *x4,
+        const char *opt, const char *param)
+{
+    if (!param)
+        return 0;
+
+    switch (x264_param_parse(&x4->params, opt, param))
+    {
+        case(X264_PARAM_BAD_NAME):
+            av_log(avctx, AV_LOG_ERROR, "no such option: \"%s\"\n", opt);
+            return 1;
+        case(X264_PARAM_BAD_VALUE):
+            av_log(avctx, AV_LOG_ERROR, "bad value: \"%s\" for option \"%s\"\n",
+                param, opt);
+           return 1;
+        default:
+           return 0;
+    }
+}
   static av_cold int X264_init(AVCodecContext *avctx)
  {
@@ -308,7 +319,8 @@ static av_cold int X264_init(AVCodecContext *avctx)
      x4->params.p_log_private        = avctx;
      x4->params.i_log_level          = X264_LOG_DEBUG;

-    OPT_STR("weightp", x4->weightp);
+    if (opt_str(avctx, x4, "weightp", x4->weightp))
+        return -1;

      x4->params.b_intra_refresh      = avctx->flags2 & CODEC_FLAG2_INTRA_REFRESH;
      x4->params.rc.i_bitrate         = avctx->bit_rate       / 1000;
@@ -328,7 +340,8 @@ static av_cold int X264_init(AVCodecContext *avctx)
          }
      }

-    OPT_STR("stats", x4->stats);
+    if (opt_str(avctx, x4, "stats", x4->stats))
+        return -1;

      // if neither crf nor cqp modes are selected we have to enable the RC
      // we do it this way because we cannot check if the bitrate has been set
@@ -341,14 +354,16 @@ static av_cold int X264_init(AVCodecContext *avctx)
              (float)avctx->rc_initial_buffer_occupancy / avctx->rc_buffer_size;
      }

-    OPT_STR("level", x4->level);
+    if (opt_str(avctx, x4, "level", x4->level))
+        return -1;

      if(x4->x264opts){
          const char *p= x4->x264opts;
          while(p){
              char param[256]={0}, val[256]={0};
              sscanf(p, "%255[^:=]=%255[^:]", param, val);
-            OPT_STR(param, val);
+            if (opt_str(avctx, x4, param, val))
+                return -1;
              p= strchr(p, ':');
              p+=!!p;
          }

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5110 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20110624/aad1d678/attachment.p7s>


More information about the ffmpeg-devel mailing list