Commit 0c5f76f7 authored by Baptiste Coudurier's avatar Baptiste Coudurier

support negative ctts in some way, unset wrong dts

Originally committed as revision 15468 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent ae4ffe9f
...@@ -133,6 +133,7 @@ typedef struct MOVStreamContext { ...@@ -133,6 +133,7 @@ typedef struct MOVStreamContext {
unsigned drefs_count; unsigned drefs_count;
MOV_dref_t *drefs; MOV_dref_t *drefs;
int dref_id; int dref_id;
int wrong_dts; ///< dts are wrong due to negative ctts
} MOVStreamContext; } MOVStreamContext;
typedef struct MOVContext { typedef struct MOVContext {
...@@ -1166,15 +1167,13 @@ static int mov_read_ctts(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) ...@@ -1166,15 +1167,13 @@ static int mov_read_ctts(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
int duration =get_be32(pb); int duration =get_be32(pb);
if (duration < 0) { if (duration < 0) {
av_log(c->fc, AV_LOG_WARNING, "negative ctts, ignoring\n"); sc->wrong_dts = 1;
sc->ctts_count = 0; st->codec->has_b_frames = 1;
url_fskip(pb, 8 * (entries - i - 1));
break;
} }
sc->ctts_data[i].count = count; sc->ctts_data[i].count = count;
sc->ctts_data[i].duration= duration; sc->ctts_data[i].duration= duration;
sc->time_rate= ff_gcd(sc->time_rate, duration); sc->time_rate= ff_gcd(sc->time_rate, FFABS(duration));
} }
return 0; return 0;
} }
...@@ -1882,6 +1881,8 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -1882,6 +1881,8 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
sc->sample_to_ctime_index++; sc->sample_to_ctime_index++;
sc->sample_to_ctime_sample = 0; sc->sample_to_ctime_sample = 0;
} }
if (sc->wrong_dts)
pkt->dts = AV_NOPTS_VALUE;
} else { } else {
AVStream *st = s->streams[sc->ffindex]; AVStream *st = s->streams[sc->ffindex];
int64_t next_dts = (sc->current_sample < sc->sample_count) ? int64_t next_dts = (sc->current_sample < sc->sample_count) ?
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment