On Wed, Jul 12, 2017 at 9:16 AM, Louis O'Bryan <lou...@google.com> wrote:

> On Wed, Jul 12, 2017 at 12:50 AM, wm4 <nfx...@googlemail.com> wrote:
>
>> On Tue, 11 Jul 2017 16:17:33 -0700
>> "Louis O'Bryan" <louiso-at-google....@ffmpeg.org> wrote:
>>
>> > If I need to write a new atom under stsd for my stream in the mov muxer
>> > <https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/movenc.c>
>> > (mov_write_stsd_tag),
>> > is it appropriate to indicate that through the AVStream metadata rather
>> > than the codec_tag?
>>
>> It seemed to have lots of unrelated changes, but maybe I'm missing
>> something. If those codec tag refactors are needed, they should
>> probably be split into a separate patch.
>>
>> But it looks like most of those changes were unintended (Moritz
>> suspected that too). The tag addition itself is probably fine.
>>
>> Also, please don't top post on mailing lists.
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>
> That file had unrelated changes that shouldn't have been there, please
> ignore them.
> Now that there is no codec associated with the stream, there shouldn't be
> a codec tag at all, I would assume. (Another issue I need to deal with is
> that the MOV muxer also doesn't support streams without a codec, but that
> is separate.)
>

My goal is to modify the MOV/MP4 muxer so that I can mux the new stream
with video and audio streams. Part of that is writing a new sample entry
box under the stsd box.
Since I no longer plan to use an encoder for the stream, I was wondering if
the AVStream::metadata
<https://www.ffmpeg.org/doxygen/3.2/structAVStream.html#a50d250a128a3da9ce3d135e84213fb82>
would be an appropriate way to recognize that stream. Other cases in the
mov_write_stsd_tag function use the codec tag.
I have the following sample of that idea here, which allows me to use the
new stream and write the sample entry box:

---
 libavformat/movenc.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 88f2f2c819..8d57a18864 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -109,6 +109,13 @@ static const AVClass flavor ## _muxer_class = {\

 static int get_moov_size(AVFormatContext *s);

+static int stream_has_metadata(AVStream *st, const char *metadata_key) {
+    if (!st->metadata) {
+        return 0;
+    }
+    return av_dict_get(st->metadata, metadata_key, NULL, 0) != NULL;
+}
+
 static int utf8len(const uint8_t *b)
 {
     int len = 0;
@@ -2060,6 +2067,16 @@ static int mov_write_tmcd_tag(AVIOContext *pb,
MOVTrack *track)
     return update_size(pb, pos);
 }

+static int mov_write_camm_tag(AVIOContext *pb) {
+    int64_t pos = avio_tell(pb);
+    avio_wb32(pb, 0); /* size */
+    ffio_wfourcc(pb, "camm");
+    avio_wb32(pb, 0); /* Reserved */
+    avio_wb16(pb, 0); /* Reserved */
+    avio_wb16(pb, 1); /* Data-reference index */
+    return update_size(pb, pos);
+}
+
 static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb,
MOVMuxContext *mov, MOVTrack *track)
 {
     int64_t pos = avio_tell(pb);
@@ -2077,6 +2094,8 @@ static int mov_write_stsd_tag(AVFormatContext *s,
AVIOContext *pb, MOVMuxContext
         mov_write_rtp_tag(pb, track);
     else if (track->par->codec_tag == MKTAG('t','m','c','d'))
         mov_write_tmcd_tag(pb, track);
+    else if (stream_has_metadata(track->st, "camm"))
+        mov_write_camm_tag(pb);
     return update_size(pb, pos);
 }

@@ -2443,6 +2462,9 @@ static int mov_write_hdlr_tag(AVFormatContext *s,
AVIOContext *pb, MOVTrack *tra
         } else if (track->par->codec_tag == MKTAG('t','m','c','d')) {
             hdlr_type = "tmcd";
             descr = "TimeCodeHandler";
+        } else if (stream_has_metadata(track->st, "camm")) {
+            hdlr_type = "camm";
+            descr = "CameraMetadataMotionHandler";
         } else {
             av_log(s, AV_LOG_WARNING,
                    "Unknown hldr_type for %s, writing dummy values\n",
@@ -5875,7 +5897,7 @@ static int mov_init(AVFormatContext *s)
             track->language = 0;
         track->mode = mov->mode;
         track->tag  = mov_find_codec_tag(s, track);
-        if (!track->tag) {
+        if (!track->tag && !stream_has_metadata(st, "camm")) {
             av_log(s, AV_LOG_ERROR, "Could not find tag for codec %s in
stream #%d, "
                    "codec not currently supported in container\n",
                    avcodec_get_name(st->codecpar->codec_id), i);
-- 
2.13.2.932.g7449e964c-goog
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to