On Wed, 2 Jul 2014, Luca Barbato wrote:

---
libavformat/mov.c | 39 +++++++++++++++++++++++++++++++--------
1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 4a2d265..c78a7d9 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -506,6 +506,8 @@ static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, 
MOVAtom atom)
    AVStream *st;
    uint32_t type;
    uint32_t av_unused ctype;
+    uint32_t val;
+    char buf[1024];

    if (c->fc->nb_streams < 1) // meta before first trak
        return 0;
@@ -532,8 +534,16 @@ static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, 
MOVAtom atom)
        st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;

    avio_rb32(pb); /* component  manufacture */
-    avio_rb32(pb); /* component flags */
-    avio_rb32(pb); /* component flags mask */
+    val = avio_rb32(pb); /* component flags */
+    if (val) {
+        snprintf(buf, sizeof(buf), "%d", val);
+        av_dict_set(&st->metadata, "mov-component-flags", buf, 0);
+    }
+    val = avio_rb32(pb); /* component flags mask */
+    if (val) {
+        snprintf(buf, sizeof(buf), "%d", val);
+        av_dict_set(&st->metadata, "mov-component-mask", buf, 0);
+    }

    return 0;
}
@@ -2389,7 +2399,8 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, 
MOVAtom atom)
    AVStream *st;
    MOVStreamContext *sc;
    int version;
-    int flags;
+    int val;
+    char buf[256];

    if (c->fc->nb_streams < 1)
        return 0;
@@ -2397,8 +2408,10 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, 
MOVAtom atom)
    sc = st->priv_data;

    version = avio_r8(pb);
-    flags = avio_rb24(pb);
-    st->disposition |= (flags & MOV_TKHD_FLAG_ENABLED) ? 
AV_DISPOSITION_DEFAULT : 0;
+    val = avio_rb24(pb);
+    snprintf(buf, sizeof(buf), "%d", val);
+    av_dict_set(&st->metadata, "mov-flags", buf, 0);
+    st->disposition |= (val & MOV_TKHD_FLAG_ENABLED) ? AV_DISPOSITION_DEFAULT 
: 0;

Hmm... We will always be exporting this value, regardless of what value it is, which means that whenever we do stream copy, we will never use the original logic in movenc, we will always overwrite it with whatever was in the input file. I don't remember these fields too well off-hand, but perhaps that the desired behaviour (instinctively I'd like to only copy them verbatim if these are set to something odd, like with the component flags/mask).


    if (version == 1) {
        avio_rb64(pb);
@@ -2415,9 +2428,19 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, 
MOVAtom atom)
    avio_rb32(pb); /* reserved */
    avio_rb32(pb); /* reserved */

-    avio_rb16(pb); /* layer */
-    avio_rb16(pb); /* alternate group */
-    avio_rb16(pb); /* volume */
+    val = avio_rb16(pb); /* layer */
+    if (val) {
+        snprintf(buf, sizeof(buf), "%d", val);
+        av_dict_set(&st->metadata, "mov-layer", buf, 0);
+    }
+    val = avio_rb16(pb); /* alternate group */
+    snprintf(buf, sizeof(buf), "%d", val);
+    av_dict_set(&st->metadata, "mov-alternate-group", buf, 0);

Hmm, this one is always exported but not the others?

+    val = avio_rb16(pb); /* volume */
+    if (val) {
+        snprintf(buf, sizeof(buf), "%d", val);
+        av_dict_set(&st->metadata, "mov-volume", buf, 0);
+    }
    avio_rb16(pb); /* reserved */

    //read in the display matrix (outlined in ISO 14496-12, Section 6.2.2)
--
1.9.0

All in all doesn't seem too bad this either. Very fringe use case, and we'll be littering the output metadata with a lot of internals, but we already do that with e.g. the ftyp atom anyway.

// Martin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to