From 937a49d00139edfc8cc5eda9234c2b8afbaa4773 Mon Sep 17 00:00:00 2001
From: Erik Ackermann <kea@google.com>
Date: Mon, 21 May 2018 11:42:04 -0700
Subject: [PATCH] Add support for Camera Motion Metadata ('camm') track.
https://developers.google.com/streetview/publish/camm-spec
---
libavcodec/avcodec.h | 1 +
libavcodec/codec_desc.c | 6 ++++++
libavformat/isom.c | 1 +
libavformat/mov.c | 2 ++
libavformat/movenc.c | 9 +++++++++
5 files changed, 19 insertions(+)
@@ -689,6 +689,7 @@ enum AVCodecID {
* stream (only used by libavformat) */
AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information.
AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket
+ AV_CODEC_ID_CAMERA_MOTION_METADATA = 0x63616d6d,
};
/**
@@ -3047,6 +3047,12 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("HDMV Text subtitle"),
.props = AV_CODEC_PROP_TEXT_SUB,
},
+ {
+ .id = AV_CODEC_ID_CAMERA_MOTION_METADATA,
+ .type = AVMEDIA_TYPE_DATA,
+ .name = "camm",
+ .long_name = NULL_IF_CONFIG_SMALL("camera motion metadata"),
+ },
/* other kind of codecs and pseudo-codecs */
{
@@ -69,6 +69,7 @@ const AVCodecTag ff_mp4_obj_type[] = {
{ AV_CODEC_ID_QCELP , 0xE1 },
{ AV_CODEC_ID_MPEG4SYSTEMS, 0x01 },
{ AV_CODEC_ID_MPEG4SYSTEMS, 0x02 },
+ { AV_CODEC_ID_CAMERA_MOTION_METADATA, MKTAG('c', 'a', 'm', 'm') },
{ AV_CODEC_ID_NONE , 0 },
};
@@ -2327,6 +2327,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
}
}
}
+ } else if (st->codecpar->codec_tag == MKTAG('c','a','m','m')) {
+ st->codecpar->codec_id = AV_CODEC_ID_CAMERA_MOTION_METADATA;
} else {
/* other codec type, just skip (rtp, mp4s ...) */
avio_skip(pb, size);
@@ -2177,6 +2177,12 @@ static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext
mov_write_tmcd_tag(pb, track);
else if (track->par->codec_tag == MKTAG('g','p','m','d'))
mov_write_gpmd_tag(pb, track);
+ else if (track->par->codec_tag == MKTAG('c', 'a', 'm', 'm')) {
+ avio_wb32(pb, 16); /* size */
+ avio_wl32(pb, track->par->codec_tag); /* tag */
+ avio_wb32(pb, 0); /* reserved */
+ avio_wb32(pb, 0); /* data reference index*/
+ }
return update_size(pb, pos);
}
@@ -2567,6 +2573,9 @@ static int mov_write_hdlr_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra
} else if (track->par->codec_tag == MKTAG('g','p','m','d')) {
hdlr_type = "meta";
descr = "GoPro MET"; // GoPro Metadata
+ } else if (track->par->codec_tag == MKTAG('c','a','m','m')) {
+ hdlr_type = "meta";
+ descr = "MetadataHandler";
} else {
av_log(s, AV_LOG_WARNING,
"Unknown hldr_type for %s, writing dummy values\n",
--
2.17.0.441.gb46fe60e1d-goog