From 0c3e106f6c57254086d0617e5c20c1c3df7308d1 Mon Sep 17 00:00:00 2001
From: Jindrich Makovicka <makovick@gmail.com>
Date: Mon, 29 Apr 2013 12:02:07 +0200
Subject: [PATCH] mpegaudio: export original and copyright flag

Signed-off-by: Jindrich Makovicka <makovick@gmail.com>
---
 avprobe.c                       |    5 +++++
 libavcodec/avcodec.h            |   10 ++++++++++
 libavcodec/mpegaudio_parser.c   |    5 +++--
 libavcodec/mpegaudiodecheader.c |   13 ++++++++++---
 libavcodec/mpegaudiodecheader.h |    6 ++++--
 libavformat/mp3dec.c            |    4 ++--
 6 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/avprobe.c b/avprobe.c
index c410cd2..51f3b05 100644
--- a/avprobe.c
+++ b/avprobe.c
@@ -660,6 +660,11 @@ static void show_stream(AVFormatContext *fmt_ctx, int stream_idx)
     if (stream->nb_frames)
         probe_int("nb_frames", stream->nb_frames);
 
+    if (dec_ctx->mpeg_flags & AV_MPEG_FLAG_ORIGINAL)
+        probe_int("original", 1);
+    if (dec_ctx->mpeg_flags & AV_MPEG_FLAG_COPYRIGHT)
+        probe_int("copyright", 1);
+
     probe_dict(stream->metadata, "tags");
 
     probe_object_footer("stream");
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index d8e5d5e..9b4fb45 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2639,6 +2639,16 @@ typedef struct AVCodecContext {
      * - decoding: unused.
      */
     uint64_t vbv_delay;
+
+    /**
+     * Miscellaneous flags from MPEG audio frame headers
+     * - encoding: unused.
+     * - decoding: Set libavcodec.
+     */
+    int mpeg_flags;
+#define AV_MPEG_FLAG_ORIGINAL      0x01
+#define AV_MPEG_FLAG_COPYRIGHT     0x02
+
 } AVCodecContext;
 
 /**
diff --git a/libavcodec/mpegaudio_parser.c b/libavcodec/mpegaudio_parser.c
index 58ea452..00b5914 100644
--- a/libavcodec/mpegaudio_parser.c
+++ b/libavcodec/mpegaudio_parser.c
@@ -62,11 +62,11 @@ static int mpegaudio_parse(AVCodecParserContext *s1,
             }
         }else{
             while(i<buf_size){
-                int ret, sr, channels, bit_rate, frame_size;
+                int ret, sr, channels, bit_rate, frame_size, flags;
 
                 state= (state<<8) + buf[i++];
 
-                ret = avpriv_mpa_decode_header(avctx, state, &sr, &channels, &frame_size, &bit_rate);
+                ret = avpriv_mpa_decode_header(avctx, state, &sr, &channels, &frame_size, &bit_rate, &flags);
                 if (ret < 4) {
                     if (i > 4)
                         s->header_count = -2;
@@ -80,6 +80,7 @@ static int mpegaudio_parse(AVCodecParserContext *s1,
                     if (s->header_count > 0) {
                         avctx->sample_rate= sr;
                         avctx->channels   = channels;
+                        avctx->mpeg_flags = flags;
                         s1->duration      = frame_size;
                         if (s->no_bitrate || !avctx->bit_rate) {
                             s->no_bitrate = 1;
diff --git a/libavcodec/mpegaudiodecheader.c b/libavcodec/mpegaudiodecheader.c
index f8fc833..d952314 100644
--- a/libavcodec/mpegaudiodecheader.c
+++ b/libavcodec/mpegaudiodecheader.c
@@ -57,8 +57,8 @@ int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
     //extension = (header >> 8) & 1;
     s->mode = (header >> 6) & 3;
     s->mode_ext = (header >> 4) & 3;
-    //copyright = (header >> 3) & 1;
-    //original = (header >> 2) & 1;
+    s->copyright = (header >> 3) & 1;
+    s->original = (header >> 2) & 1;
     //emphasis = header & 3;
 
     if (s->mode == MPA_MONO)
@@ -109,7 +109,7 @@ int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
     return 0;
 }
 
-int avpriv_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate)
+int avpriv_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate, int *flags)
 {
     MPADecodeHeader s1, *s = &s1;
 
@@ -142,5 +142,12 @@ int avpriv_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_r
     *sample_rate = s->sample_rate;
     *channels = s->nb_channels;
     *bit_rate = s->bit_rate;
+
+    *flags = 0;
+    if (s->original)
+        *flags |= AV_MPEG_FLAG_ORIGINAL;
+    if (s->copyright)
+        *flags |= AV_MPEG_FLAG_COPYRIGHT;
+
     return s->frame_size;
 }
diff --git a/libavcodec/mpegaudiodecheader.h b/libavcodec/mpegaudiodecheader.h
index 764e8ab..004b18a 100644
--- a/libavcodec/mpegaudiodecheader.h
+++ b/libavcodec/mpegaudiodecheader.h
@@ -41,7 +41,9 @@
     int nb_channels; \
     int mode; \
     int mode_ext; \
-    int lsf;
+    int lsf; \
+    int copyright; \
+    int original;
 
 typedef struct MPADecodeHeader {
   MPA_DECODE_HEADER
@@ -54,7 +56,7 @@ int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header);
 
 /* useful helper to get mpeg audio stream infos. Return -1 if error in
    header, otherwise the coded frame size in bytes */
-int avpriv_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bitrate);
+int avpriv_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bitrate, int *flags);
 
 /* fast header check for resync */
 static inline int ff_mpa_check_header(uint32_t header){
diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c
index 9da9aa8..e603958 100644
--- a/libavformat/mp3dec.c
+++ b/libavformat/mp3dec.c
@@ -44,7 +44,7 @@ typedef struct MP3DecContext {
 static int mp3_read_probe(AVProbeData *p)
 {
     int max_frames, first_frames = 0;
-    int fsize, frames, sample_rate;
+    int fsize, frames, sample_rate, flags;
     uint32_t header;
     uint8_t *buf, *buf0, *buf2, *end;
     AVCodecContext avctx;
@@ -62,7 +62,7 @@ static int mp3_read_probe(AVProbeData *p)
 
         for(frames = 0; buf2 < end; frames++) {
             header = AV_RB32(buf2);
-            fsize = avpriv_mpa_decode_header(&avctx, header, &sample_rate, &sample_rate, &sample_rate, &sample_rate);
+            fsize = avpriv_mpa_decode_header(&avctx, header, &sample_rate, &sample_rate, &sample_rate, &sample_rate, &flags);
             if(fsize < 0)
                 break;
             buf2 += fsize;
-- 
1.7.10.4

