[FFmpeg-devel] [PATCH 1/2] avformat/mov: parse sdtp atom and set the pkt disposable flag accordingly
Matthieu Bouron
matthieu.bouron at gmail.com
Mon Oct 7 18:06:38 EEST 2019
On Fri, Sep 27, 2019 at 04:37:31PM +0200, Matthieu Bouron wrote:
> Allows the creation of the sdtp atom while remuxing MP4 to MP4. This
> atom is required by Apple devices (iPhone, Apple TV) in order to accept
> 2160p medias.
> ---
> libavformat/isom.h | 2 ++
> libavformat/mov.c | 41 +++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 43 insertions(+)
>
> diff --git a/libavformat/isom.h b/libavformat/isom.h
> index 69452cae8e..4943b80ccf 100644
> --- a/libavformat/isom.h
> +++ b/libavformat/isom.h
> @@ -163,6 +163,8 @@ typedef struct MOVStreamContext {
> int64_t *chunk_offsets;
> unsigned int stts_count;
> MOVStts *stts_data;
> + unsigned int sdtp_count;
> + uint8_t *sdtp_data;
> unsigned int ctts_count;
> unsigned int ctts_allocated_size;
> MOVStts *ctts_data;
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index 8e916a28c6..7dfa07b45e 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -2959,6 +2959,40 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> return 0;
> }
>
> +static int mov_read_sdtp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> +{
> + AVStream *st;
> + MOVStreamContext *sc;
> + int64_t i, entries;
> +
> + if (c->fc->nb_streams < 1)
> + return 0;
> + st = c->fc->streams[c->fc->nb_streams-1];
> + sc = st->priv_data;
> +
> + avio_r8(pb); /* version */
> + avio_rb24(pb); /* flags */
> + entries = atom.size - 4;
> +
> + av_log(c->fc, AV_LOG_TRACE, "track[%u].sdtp.entries = %" PRId64 "\n",
> + c->fc->nb_streams - 1, entries);
> +
> + if (sc->sdtp_data)
> + av_log(c->fc, AV_LOG_WARNING, "Duplicated SDTP atom\n");
> + av_freep(&sc->sdtp_data);
> + sc->sdtp_count = 0;
> +
> + sc->sdtp_data = av_mallocz(entries);
> + if (!sc->sdtp_data)
> + return AVERROR(ENOMEM);
> +
> + for (i = 0; i < entries && !pb->eof_reached; i++)
> + sc->sdtp_data[i] = avio_r8(pb);
> + sc->sdtp_count = i;
> +
> + return 0;
> +}
> +
> static void mov_update_dts_shift(MOVStreamContext *sc, int duration)
> {
> if (duration < 0) {
> @@ -6767,6 +6801,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
> { MKTAG('s','t','s','z'), mov_read_stsz }, /* sample size */
> { MKTAG('s','t','t','s'), mov_read_stts },
> { MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */
> +{ MKTAG('s','d','t','p'), mov_read_sdtp }, /* independant and disposable samples */
> { MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */
> { MKTAG('t','f','d','t'), mov_read_tfdt },
> { MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */
> @@ -7231,6 +7266,7 @@ static int mov_read_close(AVFormatContext *s)
> av_freep(&sc->sample_sizes);
> av_freep(&sc->keyframes);
> av_freep(&sc->stts_data);
> + av_freep(&sc->sdtp_data);
> av_freep(&sc->stps_data);
> av_freep(&sc->elst_data);
> av_freep(&sc->rap_group);
> @@ -7820,6 +7856,11 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
> }
> if (st->discard == AVDISCARD_ALL)
> goto retry;
> + if (sc->sdtp_data && sc->current_sample <= sc->sdtp_count) {
> + uint8_t sample_flags = sc->sdtp_data[sc->current_sample - 1];
> + uint8_t sample_is_depended_on = (sample_flags >> 2) & 0x3;
> + pkt->flags |= sample_is_depended_on == MOV_SAMPLE_DEPENDENCY_NO ? AV_PKT_FLAG_DISPOSABLE : 0;
> + }
> pkt->flags |= sample->flags & AVINDEX_KEYFRAME ? AV_PKT_FLAG_KEY : 0;
> pkt->pos = sample->pos;
>
> --
> 2.23.0
>
Ping.
--
Matthieu B.
More information about the ffmpeg-devel
mailing list