[FFmpeg-devel] [PATCH 03/11] Implement av_get_codec_tag_string() and use it in ffprobe.

Stefano Sabatini stefano.sabatini-lala
Sat May 22 17:58:07 CEST 2010


---
 ffprobe.c            |   14 +++-----------
 libavcodec/avcodec.h |    9 +++++++++
 libavcodec/utils.c   |   16 ++++++++++++++++
 3 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/ffprobe.c b/ffprobe.c
index 7cb6167..d422166 100644
--- a/ffprobe.c
+++ b/ffprobe.c
@@ -120,7 +120,6 @@ static void show_stream(AVFormatContext *fmt_ctx, int stream_idx)
     AVCodec *dec;
     char val_str[128];
     AVMetadataTag *tag = NULL;
-    char a, b, c, d;
     AVRational display_aspect_ratio;
 
     printf("[STREAM]\n");
@@ -139,16 +138,9 @@ static void show_stream(AVFormatContext *fmt_ctx, int stream_idx)
         printf("codec_time_base=%d/%d\n", dec_ctx->time_base.num, dec_ctx->time_base.den);
 
         /* print AVI/FourCC tag */
-        a = dec_ctx->codec_tag     & 0xff;
-        b = dec_ctx->codec_tag>>8  & 0xff;
-        c = dec_ctx->codec_tag>>16 & 0xff;
-        d = dec_ctx->codec_tag>>24 & 0xff;
-        printf("codec_tag_string=");
-        if (isprint(a)) printf("%c", a); else printf("[%d]", a);
-        if (isprint(b)) printf("%c", b); else printf("[%d]", b);
-        if (isprint(c)) printf("%c", c); else printf("[%d]", c);
-        if (isprint(d)) printf("%c", d); else printf("[%d]", d);
-        printf("\ncodec_tag=0x%04x\n", dec_ctx->codec_tag);
+        printf("codec_tag_string=%s\n",
+               av_get_codec_tag_string(val_str, sizeof(val_str), dec_ctx->codec_tag));
+        printf("codec_tag=0x%04x\n", dec_ctx->codec_tag);
 
         switch (dec_ctx->codec_type) {
         case AVMEDIA_TYPE_VIDEO:
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 8781c0a..fb44219 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3088,6 +3088,15 @@ attribute_deprecated enum PixelFormat avcodec_get_pix_fmt(const char* name);
  */
 unsigned int avcodec_pix_fmt_to_codec_tag(enum PixelFormat pix_fmt);
 
+/**
+ * Returns a string representing a codec tag, NULL if the codec_tag is
+ * unknown.
+ *
+ * @param buf buffer with size buf_size where the function puts the
+ * codec tag string
+ */
+const char *av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag);
+
 #define FF_LOSS_RESOLUTION  0x0001 /**< loss due to resolution change */
 #define FF_LOSS_DEPTH       0x0002 /**< loss due to color depth change */
 #define FF_LOSS_COLORSPACE  0x0004 /**< loss due to color space conversion */
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 56d4dbd..8d8826a 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -798,6 +798,22 @@ static int get_bit_rate(AVCodecContext *ctx)
     return bit_rate;
 }
 
+const char *av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag)
+{
+    int i, fourcc[4];
+    fourcc[0] = codec_tag     & 0xff;
+    fourcc[1] = codec_tag>>8  & 0xff;
+    fourcc[2] = codec_tag>>16 & 0xff;
+    fourcc[3] = codec_tag>>24 & 0xff;
+
+    buf[0] = 0;
+    for (i = 0; i < 4; i++) {
+        if (isprint(fourcc[i])) av_strlcatf(buf, buf_size,  "%c" , fourcc[i]);
+        else                    av_strlcatf(buf, buf_size, "[%d]", fourcc[i]);
+    }
+    return buf;
+}
+
 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
 {
     const char *codec_name;
-- 
1.7.1




More information about the ffmpeg-devel mailing list