dvenc: print allowed profiles if the video doesn't conform to any of them.
authorAnton Khirnov <anton@khirnov.net>
Mon, 26 Mar 2012 11:02:54 +0000 (13:02 +0200)
committerAnton Khirnov <anton@khirnov.net>
Wed, 28 Mar 2012 07:29:04 +0000 (09:29 +0200)
libavcodec/dv.c
libavcodec/dvdata.c
libavcodec/dvdata.h

index aba94eb..83b6960 100644 (file)
@@ -323,9 +323,11 @@ av_cold int ff_dvvideo_init(AVCodecContext *avctx)
 static av_cold int dvvideo_init_encoder(AVCodecContext *avctx)
 {
     if (!avpriv_dv_codec_profile(avctx)) {
-        av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video\n",
+        av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video. "
+               "Valid DV profiles are:\n",
                avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
-        return -1;
+        ff_dv_print_profiles(avctx, AV_LOG_ERROR);
+        return AVERROR(EINVAL);
     }
 
     return ff_dvvideo_init(avctx);
index 1d32304..6d123a9 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 #include "libavutil/rational.h"
+#include "libavutil/pixdesc.h"
 #include "avcodec.h"
 #include "dvdata.h"
 
@@ -322,3 +323,14 @@ const DVprofile* avpriv_dv_codec_profile(AVCodecContext* codec)
 
     return NULL;
 }
+
+void ff_dv_print_profiles(void *logctx, int loglevel)
+{
+    int i;
+    for (i = 0; i < FF_ARRAY_ELEMS(dv_profiles); i++) {
+        const DVprofile *p = &dv_profiles[i];
+        av_log(logctx, loglevel, "Frame size: %dx%d; pixel format: %s, "
+               "framerate: %d/%d\n", p->width, p->height, av_get_pix_fmt_name(p->pix_fmt),
+               p->time_base.den, p->time_base.num);
+    }
+}
index 8544d61..8b4811a 100644 (file)
@@ -154,4 +154,9 @@ static inline void dv_calculate_mb_xy(DVVideoContext *s, DVwork_chunk *work_chun
      }
 }
 
+/**
+ *  Print all allowed DV profiles into logctx at specified logging level.
+ */
+void ff_dv_print_profiles(void *logctx, int loglevel);
+
 #endif /* AVCODEC_DVDATA_H */