early-access version 1680
This commit is contained in:
217
externals/ffmpeg/libavformat/mov.c
vendored
217
externals/ffmpeg/libavformat/mov.c
vendored
@@ -181,7 +181,6 @@ static int mov_read_mac_string(MOVContext *c, AVIOContext *pb, int len,
|
||||
|
||||
static int mov_read_covr(MOVContext *c, AVIOContext *pb, int type, int len)
|
||||
{
|
||||
AVPacket pkt;
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
enum AVCodecID id;
|
||||
@@ -205,12 +204,12 @@ static int mov_read_covr(MOVContext *c, AVIOContext *pb, int type, int len)
|
||||
return AVERROR(ENOMEM);
|
||||
st->priv_data = sc;
|
||||
|
||||
ret = av_get_packet(pb, &pkt, len);
|
||||
ret = av_get_packet(pb, &st->attached_pic, len);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (pkt.size >= 8 && id != AV_CODEC_ID_BMP) {
|
||||
if (AV_RB64(pkt.data) == 0x89504e470d0a1a0a) {
|
||||
if (st->attached_pic.size >= 8 && id != AV_CODEC_ID_BMP) {
|
||||
if (AV_RB64(st->attached_pic.data) == 0x89504e470d0a1a0a) {
|
||||
id = AV_CODEC_ID_PNG;
|
||||
} else {
|
||||
id = AV_CODEC_ID_MJPEG;
|
||||
@@ -219,7 +218,6 @@ static int mov_read_covr(MOVContext *c, AVIOContext *pb, int type, int len)
|
||||
|
||||
st->disposition |= AV_DISPOSITION_ATTACHED_PIC;
|
||||
|
||||
st->attached_pic = pkt;
|
||||
st->attached_pic.stream_index = st->index;
|
||||
st->attached_pic.flags |= AV_PKT_FLAG_KEY;
|
||||
|
||||
@@ -646,7 +644,7 @@ static int mov_read_dref(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
avio_skip(pb, 16);
|
||||
|
||||
for (type = 0; type != -1 && avio_tell(pb) < next; ) {
|
||||
if(avio_feof(pb))
|
||||
if (avio_feof(pb))
|
||||
return AVERROR_EOF;
|
||||
type = avio_rb16(pb);
|
||||
len = avio_rb16(pb);
|
||||
@@ -859,26 +857,20 @@ static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
|
||||
static int mov_read_ddts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
const uint32_t ddts_size = 20;
|
||||
#define DDTS_SIZE 20
|
||||
uint8_t buf[DDTS_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
|
||||
AVStream *st = NULL;
|
||||
uint8_t *buf = NULL;
|
||||
uint32_t frame_duration_code = 0;
|
||||
uint32_t channel_layout_code = 0;
|
||||
GetBitContext gb;
|
||||
int ret;
|
||||
|
||||
buf = av_malloc(ddts_size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!buf) {
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
if (avio_read(pb, buf, ddts_size) < ddts_size) {
|
||||
av_free(buf);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if ((ret = ffio_read_size(pb, buf, DDTS_SIZE)) < 0)
|
||||
return ret;
|
||||
|
||||
init_get_bits(&gb, buf, 8*ddts_size);
|
||||
init_get_bits(&gb, buf, 8 * DDTS_SIZE);
|
||||
|
||||
if (c->fc->nb_streams < 1) {
|
||||
av_free(buf);
|
||||
return 0;
|
||||
}
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
@@ -886,7 +878,6 @@ static int mov_read_ddts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
st->codecpar->sample_rate = get_bits_long(&gb, 32);
|
||||
if (st->codecpar->sample_rate <= 0) {
|
||||
av_log(c->fc, AV_LOG_ERROR, "Invalid sample rate %d\n", st->codecpar->sample_rate);
|
||||
av_free(buf);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
skip_bits_long(&gb, 32); /* max bitrate */
|
||||
@@ -914,7 +905,6 @@ static int mov_read_ddts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
((channel_layout_code & 0x8) ? AV_CH_LOW_FREQUENCY : 0);
|
||||
|
||||
st->codecpar->channels = av_get_channel_layout_nb_channels(st->codecpar->channel_layout);
|
||||
av_free(buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1318,7 +1308,7 @@ static int update_frag_index(MOVContext *c, int64_t offset)
|
||||
&c->frag_index.allocated_size,
|
||||
(c->frag_index.nb_items + 1) *
|
||||
sizeof(*c->frag_index.item));
|
||||
if(!item)
|
||||
if (!item)
|
||||
return -1;
|
||||
c->frag_index.item = item;
|
||||
|
||||
@@ -1402,7 +1392,7 @@ static int mov_read_moof(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
static void mov_metadata_creation_time(AVDictionary **metadata, int64_t time, void *logctx)
|
||||
{
|
||||
if (time) {
|
||||
if(time >= 2082844800)
|
||||
if (time >= 2082844800)
|
||||
time -= 2082844800; /* seconds between 1904-01-01 and Epoch */
|
||||
|
||||
if ((int64_t)(time * 1000000ULL) / 1000000 != time) {
|
||||
@@ -1576,8 +1566,7 @@ static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
ret = ffio_read_size(pb, icc_profile, atom.size - 4);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
color_primaries = avio_rb16(pb);
|
||||
color_trc = avio_rb16(pb);
|
||||
color_matrix = avio_rb16(pb);
|
||||
@@ -1730,7 +1719,7 @@ static int mov_read_dpxe(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
static int mov_read_avid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
int ret = mov_read_extradata(c, pb, atom, AV_CODEC_ID_AVUI);
|
||||
if(ret == 0)
|
||||
if (!ret)
|
||||
ret = mov_read_extradata(c, pb, atom, AV_CODEC_ID_DNXHD);
|
||||
return ret;
|
||||
}
|
||||
@@ -2342,18 +2331,15 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
uint32_t format = AV_RB32(st->codecpar->extradata + 22);
|
||||
if (format == AV_RB32("name") && (int64_t)size >= (int64_t)len + 18) {
|
||||
uint16_t str_size = AV_RB16(st->codecpar->extradata + 26); /* string length */
|
||||
if (str_size > 0 && size >= (int)str_size + 30) {
|
||||
if (str_size > 0 && size >= (int)str_size + 30 &&
|
||||
st->codecpar->extradata[30] /* Don't add empty string */) {
|
||||
char *reel_name = av_malloc(str_size + 1);
|
||||
if (!reel_name)
|
||||
return AVERROR(ENOMEM);
|
||||
memcpy(reel_name, st->codecpar->extradata + 30, str_size);
|
||||
reel_name[str_size] = 0; /* Add null terminator */
|
||||
/* don't add reel_name if emtpy string */
|
||||
if (*reel_name == 0) {
|
||||
av_free(reel_name);
|
||||
} else {
|
||||
av_dict_set(&st->metadata, "reel_name", reel_name, AV_DICT_DONT_STRDUP_VAL);
|
||||
}
|
||||
av_dict_set(&st->metadata, "reel_name", reel_name,
|
||||
AV_DICT_DONT_STRDUP_VAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2550,11 +2536,8 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
|
||||
|
||||
/* Move the current stream extradata to the stream context one. */
|
||||
sc->extradata_size[pseudo_stream_id] = extra_size;
|
||||
sc->extradata[pseudo_stream_id] = av_malloc(extra_size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!sc->extradata[pseudo_stream_id])
|
||||
return AVERROR(ENOMEM);
|
||||
memcpy(sc->extradata[pseudo_stream_id], st->codecpar->extradata, extra_size);
|
||||
av_freep(&st->codecpar->extradata);
|
||||
sc->extradata[pseudo_stream_id] = st->codecpar->extradata;
|
||||
st->codecpar->extradata = NULL;
|
||||
st->codecpar->extradata_size = 0;
|
||||
}
|
||||
sc->stsd_count++;
|
||||
@@ -2781,8 +2764,7 @@ static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
|
||||
av_log(c->fc, AV_LOG_TRACE, "keyframe_count = %u\n", entries);
|
||||
|
||||
if (!entries)
|
||||
{
|
||||
if (!entries) {
|
||||
sc->keyframe_absent = 1;
|
||||
if (!st->need_parsing && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
|
||||
st->need_parsing = AVSTREAM_PARSE_HEADERS;
|
||||
@@ -2910,8 +2892,8 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
AVStream *st;
|
||||
MOVStreamContext *sc;
|
||||
unsigned int i, entries, alloc_size = 0;
|
||||
int64_t duration=0;
|
||||
int64_t total_sample_count=0;
|
||||
int64_t duration = 0;
|
||||
int64_t total_sample_count = 0;
|
||||
|
||||
if (c->fc->nb_streams < 1)
|
||||
return 0;
|
||||
@@ -2946,7 +2928,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
sc->stts_count = min_entries;
|
||||
sc->stts_data = stts_data;
|
||||
|
||||
sample_count=avio_rb32(pb);
|
||||
sample_count = avio_rb32(pb);
|
||||
sample_duration = avio_rb32(pb);
|
||||
|
||||
sc->stts_data[i].count= sample_count;
|
||||
@@ -2963,8 +2945,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
|
||||
if (duration > 0 &&
|
||||
duration <= INT64_MAX - sc->duration_for_fps &&
|
||||
total_sample_count <= INT_MAX - sc->nb_frames_for_fps
|
||||
) {
|
||||
total_sample_count <= INT_MAX - sc->nb_frames_for_fps) {
|
||||
sc->duration_for_fps += duration;
|
||||
sc->nb_frames_for_fps += total_sample_count;
|
||||
}
|
||||
@@ -3053,8 +3034,8 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
for (i = 0; i < entries && !pb->eof_reached; i++) {
|
||||
int count =avio_rb32(pb);
|
||||
int duration =avio_rb32(pb);
|
||||
int count = avio_rb32(pb);
|
||||
int duration = avio_rb32(pb);
|
||||
|
||||
if (count <= 0) {
|
||||
av_log(c->fc, AV_LOG_TRACE,
|
||||
@@ -3294,13 +3275,13 @@ static int64_t add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
|
||||
FFMAX(min_size_needed, 2 * st->index_entries_allocated_size) :
|
||||
min_size_needed;
|
||||
|
||||
if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
|
||||
if (st->nb_index_entries + 1U >= UINT_MAX / sizeof(AVIndexEntry))
|
||||
return -1;
|
||||
|
||||
entries = av_fast_realloc(st->index_entries,
|
||||
&st->index_entries_allocated_size,
|
||||
requested_size);
|
||||
if(!entries)
|
||||
if (!entries)
|
||||
return -1;
|
||||
|
||||
st->index_entries= entries;
|
||||
@@ -3345,12 +3326,12 @@ static int64_t add_ctts_entry(MOVStts** ctts_data, unsigned int* ctts_count, uns
|
||||
FFMAX(min_size_needed, 2 * (*allocated_size)) :
|
||||
min_size_needed;
|
||||
|
||||
if((unsigned)(*ctts_count) >= UINT_MAX / sizeof(MOVStts) - 1)
|
||||
if ((unsigned)(*ctts_count) >= UINT_MAX / sizeof(MOVStts) - 1)
|
||||
return -1;
|
||||
|
||||
ctts_buf_new = av_fast_realloc(*ctts_data, allocated_size, requested_size);
|
||||
|
||||
if(!ctts_buf_new)
|
||||
if (!ctts_buf_new)
|
||||
return -1;
|
||||
|
||||
*ctts_data = ctts_buf_new;
|
||||
@@ -3363,7 +3344,8 @@ static int64_t add_ctts_entry(MOVStts** ctts_data, unsigned int* ctts_count, uns
|
||||
}
|
||||
|
||||
#define MAX_REORDER_DELAY 16
|
||||
static void mov_estimate_video_delay(MOVContext *c, AVStream* st) {
|
||||
static void mov_estimate_video_delay(MOVContext *c, AVStream* st)
|
||||
{
|
||||
MOVStreamContext *msc = st->priv_data;
|
||||
int ind;
|
||||
int ctts_ind = 0;
|
||||
@@ -3378,7 +3360,7 @@ static void mov_estimate_video_delay(MOVContext *c, AVStream* st) {
|
||||
if (st->codecpar->video_delay <= 0 && msc->ctts_data &&
|
||||
st->codecpar->codec_id == AV_CODEC_ID_H264) {
|
||||
st->codecpar->video_delay = 0;
|
||||
for(ind = 0; ind < st->nb_index_entries && ctts_ind < msc->ctts_count; ++ind) {
|
||||
for (ind = 0; ind < st->nb_index_entries && ctts_ind < msc->ctts_count; ++ind) {
|
||||
// Point j to the last elem of the buffer and insert the current pts there.
|
||||
j = buf_start;
|
||||
buf_start = (buf_start + 1);
|
||||
@@ -4176,10 +4158,10 @@ static int mov_open_dref(MOVContext *c, AVIOContext **pb, const char *src, MOVDr
|
||||
return AVERROR(ENOENT);
|
||||
}
|
||||
|
||||
if(strstr(ref->path + l + 1, "..") ||
|
||||
strstr(ref->path + l + 1, ":") ||
|
||||
(ref->nlvl_from > 1 && same_origin < 0) ||
|
||||
(filename[0] == '/' && src_path == src))
|
||||
if (strstr(ref->path + l + 1, "..") ||
|
||||
strstr(ref->path + l + 1, ":") ||
|
||||
(ref->nlvl_from > 1 && same_origin < 0) ||
|
||||
(filename[0] == '/' && src_path == src))
|
||||
return AVERROR(ENOENT);
|
||||
}
|
||||
|
||||
@@ -4813,8 +4795,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
if (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS) first_sample_flags = avio_rb32(pb);
|
||||
|
||||
frag_stream_info = get_current_frag_stream_info(&c->frag_index);
|
||||
if (frag_stream_info)
|
||||
{
|
||||
if (frag_stream_info) {
|
||||
if (frag_stream_info->next_trun_dts != AV_NOPTS_VALUE) {
|
||||
dts = frag_stream_info->next_trun_dts - sc->time_offset;
|
||||
} else if (frag_stream_info->first_tfra_pts != AV_NOPTS_VALUE &&
|
||||
@@ -4863,7 +4844,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
new_entries = av_fast_realloc(st->index_entries,
|
||||
&st->index_entries_allocated_size,
|
||||
requested_size);
|
||||
if(!new_entries)
|
||||
if (!new_entries)
|
||||
return AVERROR(ENOMEM);
|
||||
st->index_entries= new_entries;
|
||||
|
||||
@@ -5773,12 +5754,9 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
st = c->fc->streams[c->fc->nb_streams - 1];
|
||||
sc = st->priv_data;
|
||||
|
||||
ret = avio_read(pb, uuid, sizeof(uuid));
|
||||
if (ret < 0) {
|
||||
ret = ffio_read_size(pb, uuid, sizeof(uuid));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else if (ret != sizeof(uuid)) {
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (!memcmp(uuid, uuid_isml_manifest, sizeof(uuid))) {
|
||||
uint8_t *buffer, *ptr;
|
||||
char *endptr;
|
||||
@@ -5794,13 +5772,10 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
if (!buffer) {
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
ret = avio_read(pb, buffer, len);
|
||||
ret = ffio_read_size(pb, buffer, len);
|
||||
if (ret < 0) {
|
||||
av_free(buffer);
|
||||
return ret;
|
||||
} else if (ret != len) {
|
||||
av_free(buffer);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
ptr = buffer;
|
||||
@@ -5831,13 +5806,10 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
if (!buffer) {
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
ret = avio_read(pb, buffer, len);
|
||||
ret = ffio_read_size(pb, buffer, len);
|
||||
if (ret < 0) {
|
||||
av_free(buffer);
|
||||
return ret;
|
||||
} else if (ret != len) {
|
||||
av_free(buffer);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
buffer[len] = '\0';
|
||||
av_dict_set(&c->fc->metadata, "xmp",
|
||||
@@ -5981,7 +5953,7 @@ static int get_current_encryption_info(MOVContext *c, MOVEncryptionIndex **encry
|
||||
|
||||
static int mov_read_sample_encryption_info(MOVContext *c, AVIOContext *pb, MOVStreamContext *sc, AVEncryptionInfo **sample, int use_subsamples)
|
||||
{
|
||||
int i;
|
||||
int i, ret;
|
||||
unsigned int subsample_count;
|
||||
AVSubsampleEncryptionInfo *subsamples;
|
||||
|
||||
@@ -5995,11 +5967,11 @@ static int mov_read_sample_encryption_info(MOVContext *c, AVIOContext *pb, MOVSt
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
if (sc->cenc.per_sample_iv_size != 0) {
|
||||
if (avio_read(pb, (*sample)->iv, sc->cenc.per_sample_iv_size) != sc->cenc.per_sample_iv_size) {
|
||||
if ((ret = ffio_read_size(pb, (*sample)->iv, sc->cenc.per_sample_iv_size)) < 0) {
|
||||
av_log(c->fc, AV_LOG_ERROR, "failed to read the initialization vector\n");
|
||||
av_encryption_info_free(*sample);
|
||||
*sample = NULL;
|
||||
return AVERROR_INVALIDDATA;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6367,9 +6339,8 @@ static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
if (!info)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
if (avio_read(pb, info->system_id, 16) != 16) {
|
||||
if ((ret = ffio_read_size(pb, info->system_id, 16)) < 0) {
|
||||
av_log(c->fc, AV_LOG_ERROR, "Failed to read the system id\n");
|
||||
ret = AVERROR_INVALIDDATA;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
@@ -6397,9 +6368,8 @@ static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
}
|
||||
info->num_key_ids = i + 1;
|
||||
|
||||
if (avio_read(pb, info->key_ids[i], 16) != 16) {
|
||||
if ((ret = ffio_read_size(pb, info->key_ids[i], 16)) < 0) {
|
||||
av_log(c->fc, AV_LOG_ERROR, "Failed to read the key id\n");
|
||||
ret = AVERROR_INVALIDDATA;
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
@@ -6618,15 +6588,13 @@ static int cenc_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *s
|
||||
|
||||
av_aes_ctr_set_full_iv(sc->cenc.aes_ctr, sample->iv);
|
||||
|
||||
if (!sample->subsample_count)
|
||||
{
|
||||
if (!sample->subsample_count) {
|
||||
/* decrypt the whole packet */
|
||||
av_aes_ctr_crypt(sc->cenc.aes_ctr, input, input, size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < sample->subsample_count; i++)
|
||||
{
|
||||
for (i = 0; i < sample->subsample_count; i++) {
|
||||
if (sample->subsamples[i].bytes_of_clear_data + sample->subsamples[i].bytes_of_protected_data > size) {
|
||||
av_log(c->fc, AV_LOG_ERROR, "subsample size exceeds the packet size left\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
@@ -6988,10 +6956,9 @@ static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
}
|
||||
}
|
||||
if (atom.type != MKTAG('r','o','o','t') &&
|
||||
atom.type != MKTAG('m','o','o','v'))
|
||||
{
|
||||
if (a.type == MKTAG('t','r','a','k') || a.type == MKTAG('m','d','a','t'))
|
||||
{
|
||||
atom.type != MKTAG('m','o','o','v')) {
|
||||
if (a.type == MKTAG('t','r','a','k') ||
|
||||
a.type == MKTAG('m','d','a','t')) {
|
||||
av_log(c->fc, AV_LOG_ERROR, "Broken file, trak/mdat not at top-level\n");
|
||||
avio_skip(pb, -8);
|
||||
c->atom_depth --;
|
||||
@@ -7131,25 +7098,26 @@ static int mov_probe(const AVProbeData *p)
|
||||
offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset;
|
||||
}
|
||||
}
|
||||
if(score > AVPROBE_SCORE_MAX - 50 && moov_offset != -1) {
|
||||
if (score > AVPROBE_SCORE_MAX - 50 && moov_offset != -1) {
|
||||
/* moov atom in the header - we should make sure that this is not a
|
||||
* MOV-packed MPEG-PS */
|
||||
offset = moov_offset;
|
||||
|
||||
while(offset < (p->buf_size - 16)){ /* Sufficient space */
|
||||
while (offset < (p->buf_size - 16)) { /* Sufficient space */
|
||||
/* We found an actual hdlr atom */
|
||||
if(AV_RL32(p->buf + offset ) == MKTAG('h','d','l','r') &&
|
||||
AV_RL32(p->buf + offset + 8) == MKTAG('m','h','l','r') &&
|
||||
AV_RL32(p->buf + offset + 12) == MKTAG('M','P','E','G')){
|
||||
if (AV_RL32(p->buf + offset ) == MKTAG('h','d','l','r') &&
|
||||
AV_RL32(p->buf + offset + 8) == MKTAG('m','h','l','r') &&
|
||||
AV_RL32(p->buf + offset + 12) == MKTAG('M','P','E','G')) {
|
||||
av_log(NULL, AV_LOG_WARNING, "Found media data tag MPEG indicating this is a MOV-packed MPEG-PS.\n");
|
||||
/* We found a media handler reference atom describing an
|
||||
* MPEG-PS-in-MOV, return a
|
||||
* low score to force expanding the probe window until
|
||||
* mpegps_probe finds what it needs */
|
||||
return 5;
|
||||
}else
|
||||
} else {
|
||||
/* Keep looking */
|
||||
offset+=2;
|
||||
offset += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7186,17 +7154,15 @@ static void mov_read_chapters(AVFormatContext *s)
|
||||
st->disposition |= AV_DISPOSITION_ATTACHED_PIC | AV_DISPOSITION_TIMED_THUMBNAILS;
|
||||
if (st->nb_index_entries) {
|
||||
// Retrieve the first frame, if possible
|
||||
AVPacket pkt;
|
||||
AVIndexEntry *sample = &st->index_entries[0];
|
||||
if (avio_seek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
|
||||
av_log(s, AV_LOG_ERROR, "Failed to retrieve first frame\n");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (av_get_packet(sc->pb, &pkt, sample->size) < 0)
|
||||
if (av_get_packet(sc->pb, &st->attached_pic, sample->size) < 0)
|
||||
goto finish;
|
||||
|
||||
st->attached_pic = pkt;
|
||||
st->attached_pic.stream_index = st->index;
|
||||
st->attached_pic.flags |= AV_PKT_FLAG_KEY;
|
||||
}
|
||||
@@ -7627,7 +7593,8 @@ static int mov_read_header(AVFormatContext *s)
|
||||
AVStream *st = s->streams[i];
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
fix_timescale(mov, sc);
|
||||
if(st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->codec_id == AV_CODEC_ID_AAC) {
|
||||
if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
|
||||
st->codecpar->codec_id == AV_CODEC_ID_AAC) {
|
||||
st->skip_samples = sc->start_pad;
|
||||
}
|
||||
if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && sc->nb_frames_for_fps > 0 && sc->duration_for_fps > 0)
|
||||
@@ -7645,8 +7612,7 @@ static int mov_read_header(AVFormatContext *s)
|
||||
}
|
||||
if (mov->handbrake_version &&
|
||||
mov->handbrake_version <= 1000000*0 + 1000*10 + 2 && // 0.10.2
|
||||
st->codecpar->codec_id == AV_CODEC_ID_MP3
|
||||
) {
|
||||
st->codecpar->codec_id == AV_CODEC_ID_MP3) {
|
||||
av_log(s, AV_LOG_VERBOSE, "Forcing full parsing for mp3 stream\n");
|
||||
st->need_parsing = AVSTREAM_PARSE_FULL;
|
||||
}
|
||||
@@ -7700,9 +7666,8 @@ static int mov_read_header(AVFormatContext *s)
|
||||
switch (st->codecpar->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
err = ff_replaygain_export(st, s->metadata);
|
||||
if (err < 0) {
|
||||
if (err < 0)
|
||||
goto fail;
|
||||
}
|
||||
break;
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
if (sc->display_matrix) {
|
||||
@@ -7856,6 +7821,27 @@ static int mov_change_extradata(MOVStreamContext *sc, AVPacket *pkt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_eia608_packet(AVIOContext *pb, AVPacket *pkt, int size)
|
||||
{
|
||||
int new_size, ret;
|
||||
|
||||
if (size <= 8)
|
||||
return AVERROR_INVALIDDATA;
|
||||
new_size = ((size - 8) / 2) * 3;
|
||||
ret = av_new_packet(pkt, new_size);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
avio_skip(pb, 8);
|
||||
for (int j = 0; j < new_size; j += 3) {
|
||||
pkt->data[j] = 0xFC;
|
||||
pkt->data[j+1] = avio_r8(pb);
|
||||
pkt->data[j+2] = avio_r8(pb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
{
|
||||
MOVContext *mov = s->priv_data;
|
||||
@@ -7895,12 +7881,15 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if( st->discard == AVDISCARD_NONKEY && 0==(sample->flags & AVINDEX_KEYFRAME) ) {
|
||||
if (st->discard == AVDISCARD_NONKEY && !(sample->flags & AVINDEX_KEYFRAME)) {
|
||||
av_log(mov->fc, AV_LOG_DEBUG, "Nonkey frame from stream %d discarded due to AVDISCARD_NONKEY\n", sc->ffindex);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
ret = av_get_packet(sc->pb, pkt, sample->size);
|
||||
if (st->codecpar->codec_id == AV_CODEC_ID_EIA_608 && sample->size > 8)
|
||||
ret = get_eia608_packet(sc->pb, pkt, sample->size);
|
||||
else
|
||||
ret = av_get_packet(sc->pb, pkt, sample->size);
|
||||
if (ret < 0) {
|
||||
if (should_retry(sc->pb, ret)) {
|
||||
mov_current_sample_dec(sc);
|
||||
@@ -8056,17 +8045,17 @@ static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp,
|
||||
|
||||
/* adjust stsd index */
|
||||
if (sc->chunk_count) {
|
||||
time_sample = 0;
|
||||
for (i = 0; i < sc->stsc_count; i++) {
|
||||
int64_t next = time_sample + mov_get_stsc_samples(sc, i);
|
||||
if (next > sc->current_sample) {
|
||||
sc->stsc_index = i;
|
||||
sc->stsc_sample = sc->current_sample - time_sample;
|
||||
break;
|
||||
time_sample = 0;
|
||||
for (i = 0; i < sc->stsc_count; i++) {
|
||||
int64_t next = time_sample + mov_get_stsc_samples(sc, i);
|
||||
if (next > sc->current_sample) {
|
||||
sc->stsc_index = i;
|
||||
sc->stsc_sample = sc->current_sample - time_sample;
|
||||
break;
|
||||
}
|
||||
av_assert0(next == (int)next);
|
||||
time_sample = next;
|
||||
}
|
||||
av_assert0(next == (int)next);
|
||||
time_sample = next;
|
||||
}
|
||||
}
|
||||
|
||||
return sample;
|
||||
|
Reference in New Issue
Block a user