[FFmpeg-devel] [PATCH] lavf/mov.c: Use the first sidx for tracks without sidx.
Sasi Inguva
isasi at google.com
Mon Oct 31 19:23:01 EET 2016
ping.
Thanks!
On Wed, Oct 26, 2016 at 11:31 AM, Sasi Inguva <isasi at google.com> wrote:
> According to spec ISO_IEC_15444_12 "For any media stream for which no
> segment index is present, referred to as non‐indexed stream, the media
> stream associated with the first Segment Index box in the segment serves as
> a reference stream in a sense that it also describes the subsegments for
> any non‐indexed media stream."
>
> Signed-off-by: Sasi Inguva <isasi at google.com>
> ---
> libavformat/isom.h | 1 +
> libavformat/mov.c | 25 ++++++++++++++++++++++---
> 2 files changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/libavformat/isom.h b/libavformat/isom.h
> index 9038057..d684502 100644
> --- a/libavformat/isom.h
> +++ b/libavformat/isom.h
> @@ -179,6 +179,7 @@ typedef struct MOVStreamContext {
> int32_t *display_matrix;
> uint32_t format;
>
> + int has_sidx; // If there is an sidx entry for this stream.
> struct {
> int use_subsamples;
> uint8_t* auxiliary_info;
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index 357d800..d9ed5a3 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -4202,7 +4202,8 @@ static int mov_read_sidx(MOVContext *c, AVIOContext
> *pb, MOVAtom atom)
> uint8_t version;
> unsigned i, track_id;
> AVStream *st = NULL;
> - MOVStreamContext *sc;
> + AVStream *ref_st;
> + MOVStreamContext *sc, *ref_sc;
> MOVFragmentIndex *index = NULL;
> MOVFragmentIndex **tmp;
> AVRational timescale;
> @@ -4284,9 +4285,26 @@ static int mov_read_sidx(MOVContext *c, AVIOContext
> *pb, MOVAtom atom)
>
> c->fragment_index_data = tmp;
> c->fragment_index_data[c->fragment_index_count++] = index;
> + sc->has_sidx = 1;
> +
> + if (offset == avio_size(pb)) {
> + for (i = 0; i < c->fc->nb_streams; i++) {
> + if (c->fc->streams[i]->id == c->fragment_index_data[0]->track_id)
> {
> + ref_st = c->fc->streams[i];
> + ref_sc = ref_st->priv_data;
> + break;
> + }
> + }
> + for (i = 0; i < c->fc->nb_streams; i++) {
> + st = c->fc->streams[i];
> + sc = st->priv_data;
> + if (!sc->has_sidx) {
> + st->duration = sc->track_end =
> av_rescale(ref_st->duration, sc->time_scale, ref_sc->time_scale);
> + }
> + }
>
> - if (offset == avio_size(pb))
> c->fragment_index_complete = 1;
> + }
>
> return 0;
> }
> @@ -5846,13 +5864,14 @@ static int mov_read_packet(AVFormatContext *s,
> AVPacket *pkt)
> static int mov_seek_fragment(AVFormatContext *s, AVStream *st, int64_t
> timestamp)
> {
> MOVContext *mov = s->priv_data;
> + MOVStreamContext *sc = st->priv_data;
> int i, j;
>
> if (!mov->fragment_index_complete)
> return 0;
>
> for (i = 0; i < mov->fragment_index_count; i++) {
> - if (mov->fragment_index_data[i]->track_id == st->id) {
> + if (mov->fragment_index_data[i]->track_id == st->id ||
> !sc->has_sidx) {
> MOVFragmentIndex *index = mov->fragment_index_data[i];
> for (j = index->item_count - 1; j >= 0; j--) {
> if (index->items[j].time <= timestamp) {
> --
> 2.8.0.rc3.226.g39d4020
>
>
More information about the ffmpeg-devel
mailing list