* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <stdarg.h>
#include <stdint.h>
#include "config.h"
#include "libavutil/mathematics.h"
#include "libavutil/opt.h"
#include "libavutil/parseutils.h"
-#include "libavutil/pixdesc.h"
+#include "libavutil/pixfmt.h"
#include "libavutil/thread.h"
#include "libavutil/time.h"
-#include "libavutil/time_internal.h"
#include "libavutil/timestamp.h"
#include "libavcodec/bytestream.h"
#include "libavcodec/internal.h"
+#include "libavcodec/packet_internal.h"
#include "libavcodec/raw.h"
-#include "audiointerleave.h"
#include "avformat.h"
#include "avio_internal.h"
#include "id3v2.h"
#include "internal.h"
-#include "metadata.h"
#if CONFIG_NETWORK
#include "network.h"
#endif
-#include "riff.h"
#include "url.h"
#include "libavutil/ffversion.h"
const char *avformat_license(void)
{
#define LICENSE_PREFIX "libavformat license: "
- return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+ return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
}
int ff_lock_avformat(void)
*/
static int64_t wrap_timestamp(const AVStream *st, int64_t timestamp)
{
- if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
- st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
- if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
- timestamp < st->pts_wrap_reference)
+ if (st->internal->pts_wrap_behavior != AV_PTS_WRAP_IGNORE && st->pts_wrap_bits < 64 &&
+ st->internal->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
+ if (st->internal->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
+ timestamp < st->internal->pts_wrap_reference)
return timestamp + (1ULL << st->pts_wrap_bits);
- else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
- timestamp >= st->pts_wrap_reference)
+ else if (st->internal->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
+ timestamp >= st->internal->pts_wrap_reference)
return timestamp - (1ULL << st->pts_wrap_bits);
}
return timestamp;
s->internal->inject_global_side_data = 1;
for (i = 0; i < s->nb_streams; i++) {
AVStream *st = s->streams[i];
- st->inject_global_side_data = 1;
+ st->internal->inject_global_side_data = 1;
}
}
if (codec->capabilities & AV_CODEC_CAP_AVOID_PROBING) {
const AVCodec *probe_codec = NULL;
- while (probe_codec = av_codec_next(probe_codec)) {
- if (probe_codec->id == codec_id &&
+ void *iter = NULL;
+ while ((probe_codec = av_codec_iterate(&iter))) {
+ if (probe_codec->id == codec->id &&
av_codec_is_decoder(probe_codec) &&
!(probe_codec->capabilities & (AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_EXPERIMENTAL))) {
return probe_codec;
int ffio_limit(AVIOContext *s, int size)
{
if (s->maxsize>= 0) {
- int64_t remaining= s->maxsize - avio_tell(s);
+ int64_t pos = avio_tell(s);
+ int64_t remaining= s->maxsize - pos;
if (remaining < size) {
int64_t newsize = avio_size(s);
if (!s->maxsize || s->maxsize<newsize)
s->maxsize = newsize - !newsize;
- remaining= s->maxsize - avio_tell(s);
- remaining= FFMAX(remaining, 0);
+ if (pos > s->maxsize && s->maxsize >= 0)
+ s->maxsize = AVERROR(EIO);
+ if (s->maxsize >= 0)
+ remaining = s->maxsize - pos;
}
- if (s->maxsize>= 0 && remaining+1 < size) {
- av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
- size = remaining+1;
+ if (s->maxsize >= 0 && remaining < size && size > 1) {
+ av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG,
+ "Truncating packet of size %d to %"PRId64"\n",
+ size, remaining + !remaining);
+ size = remaining + !remaining;
}
}
return size;
* Return the number of bytes read or an error. */
static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
{
- int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
int orig_size = pkt->size;
int ret;
if (size > 0)
pkt->flags |= AV_PKT_FLAG_CORRUPT;
- pkt->pos = orig_pos;
if (!pkt->size)
av_packet_unref(pkt);
return pkt->size > orig_size ? pkt->size - orig_size : ret;
int i;
av_log(s, AV_LOG_DEBUG,
"Probe with size=%d, packets=%d detected %s with score=%d\n",
- pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
+ pd->buf_size, s->max_probe_packets - st->probe_packets,
fmt->name, score);
for (i = 0; fmt_id_type[i].name; i++) {
if (!strcmp(fmt->name, fmt_id_type[i].name)) {
if (fmt_id_type[i].type != AVMEDIA_TYPE_AUDIO &&
st->codecpar->sample_rate)
continue;
- if (st->request_probe > score &&
+ if (st->internal->request_probe > score &&
st->codecpar->codec_id != fmt_id_type[i].id)
continue;
st->codecpar->codec_id = fmt_id_type[i].id;
/************************************************************/
/* input media file */
+#if FF_API_DEMUXER_OPEN
int av_demuxer_open(AVFormatContext *ic) {
int err;
return 0;
}
-
+#endif
/* Open input file and probe the format if necessary. */
static int init_input(AVFormatContext *s, const char *filename,
AVDictionary **options)
s, 0, s->format_probesize);
}
-int ff_packet_list_put(AVPacketList **packet_buffer,
- AVPacketList **plast_pktl,
- AVPacket *pkt, int flags)
-{
- AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
- int ret;
-
- if (!pktl)
- return AVERROR(ENOMEM);
-
- if (flags & FF_PACKETLIST_FLAG_REF_PACKET) {
- if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
- av_free(pktl);
- return ret;
- }
- } else {
- ret = av_packet_make_refcounted(pkt);
- if (ret < 0) {
- av_free(pktl);
- return ret;
- }
- av_packet_move_ref(&pktl->pkt, pkt);
- }
-
- if (*packet_buffer)
- (*plast_pktl)->next = pktl;
- else
- *packet_buffer = pktl;
-
- /* Add the packet in the buffered packet list. */
- *plast_pktl = pktl;
- return 0;
-}
-
int avformat_queue_attached_pictures(AVFormatContext *s)
{
int i, ret;
continue;
}
- ret = ff_packet_list_put(&s->internal->raw_packet_buffer,
+ ret = avpriv_packet_list_put(&s->internal->raw_packet_buffer,
&s->internal->raw_packet_buffer_end,
&s->streams[i]->attached_pic,
- FF_PACKETLIST_FLAG_REF_PACKET);
+ av_packet_ref, 0);
if (ret < 0)
return ret;
}
if (s->pb)
ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
-
+#if FF_API_DEMUXER_OPEN
if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
+#else
+ if (s->iformat->read_header)
+#endif
if ((ret = s->iformat->read_header(s)) < 0)
goto fail;
s->metadata = s->internal->id3v2_meta;
s->internal->id3v2_meta = NULL;
} else if (s->internal->id3v2_meta) {
- int level = AV_LOG_WARNING;
- if (s->error_recognition & AV_EF_COMPLIANT)
- level = AV_LOG_ERROR;
- av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n");
+ av_log(s, AV_LOG_WARNING, "Discarding ID3 tags because more suitable tags were found.\n");
av_dict_free(&s->internal->id3v2_meta);
- if (s->error_recognition & AV_EF_EXPLODE)
- return AVERROR_INVALIDDATA;
}
if (id3v2_extra_meta) {
if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
!strcmp(s->iformat->name, "tta") || !strcmp(s->iformat->name, "wav")) {
- if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
- goto fail;
- if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
- goto fail;
- if ((ret = ff_id3v2_parse_priv(s, &id3v2_extra_meta)) < 0)
- goto fail;
+ if ((ret = ff_id3v2_parse_apic(s, id3v2_extra_meta)) < 0)
+ goto close;
+ if ((ret = ff_id3v2_parse_chapters(s, id3v2_extra_meta)) < 0)
+ goto close;
+ if ((ret = ff_id3v2_parse_priv(s, id3v2_extra_meta)) < 0)
+ goto close;
} else
av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
}
ff_id3v2_free_extra_meta(&id3v2_extra_meta);
if ((ret = avformat_queue_attached_pictures(s)) < 0)
- goto fail;
+ goto close;
+#if FF_API_DEMUXER_OPEN
if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
+#else
+ if (s->pb && !s->internal->data_offset)
+#endif
s->internal->data_offset = avio_tell(s->pb);
s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
*ps = s;
return 0;
+close:
+ if (s->iformat->read_close)
+ s->iformat->read_close(s);
fail:
ff_id3v2_free_extra_meta(&id3v2_extra_meta);
av_dict_free(&tmp);
static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
{
- if (st->request_probe>0) {
- AVProbeData *pd = &st->probe_data;
+ if (st->internal->request_probe>0) {
+ AVProbeData *pd = &st->internal->probe_data;
int end;
av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
--st->probe_packets;
|| end) {
pd->buf_size = 0;
av_freep(&pd->buf);
- st->request_probe = -1;
+ st->internal->request_probe = -1;
if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
} else
if (ref == AV_NOPTS_VALUE)
ref = pkt->pts;
- if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
+ if (st->internal->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
return 0;
ref &= (1LL << st->pts_wrap_bits)-1;
if (!first_program) {
int default_stream_index = av_find_default_stream_index(s);
- if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
+ if (s->streams[default_stream_index]->internal->pts_wrap_reference == AV_NOPTS_VALUE) {
for (i = 0; i < s->nb_streams; i++) {
if (av_find_program_from_stream(s, NULL, i))
continue;
- s->streams[i]->pts_wrap_reference = pts_wrap_reference;
- s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
+ s->streams[i]->internal->pts_wrap_reference = pts_wrap_reference;
+ s->streams[i]->internal->pts_wrap_behavior = pts_wrap_behavior;
}
}
else {
- st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
- st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
+ st->internal->pts_wrap_reference = s->streams[default_stream_index]->internal->pts_wrap_reference;
+ st->internal->pts_wrap_behavior = s->streams[default_stream_index]->internal->pts_wrap_behavior;
}
}
else {
while (program) {
if (program->pts_wrap_reference != pts_wrap_reference) {
for (i = 0; i<program->nb_stream_indexes; i++) {
- s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
- s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
+ s->streams[program->stream_index[i]]->internal->pts_wrap_reference = pts_wrap_reference;
+ s->streams[program->stream_index[i]]->internal->pts_wrap_behavior = pts_wrap_behavior;
}
program->pts_wrap_reference = pts_wrap_reference;
if (s->internal->raw_packet_buffer_remaining_size <= 0)
if ((err = probe_codec(s, st, NULL)) < 0)
return err;
- if (st->request_probe <= 0) {
- ff_packet_list_get(&s->internal->raw_packet_buffer,
+ if (st->internal->request_probe <= 0) {
+ avpriv_packet_list_get(&s->internal->raw_packet_buffer,
&s->internal->raw_packet_buffer_end, pkt);
s->internal->raw_packet_buffer_remaining_size += pkt->size;
return 0;
return ret;
for (i = 0; i < s->nb_streams; i++) {
st = s->streams[i];
- if (st->probe_packets || st->request_probe > 0)
+ if (st->probe_packets || st->internal->request_probe > 0)
if ((err = probe_codec(s, st, NULL)) < 0)
return err;
- av_assert0(st->request_probe <= 0);
+ av_assert0(st->internal->request_probe <= 0);
}
continue;
}
return err;
}
- if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
- (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
+ if (pkt->flags & AV_PKT_FLAG_CORRUPT) {
av_log(s, AV_LOG_WARNING,
- "Dropped corrupted packet (stream = %d)\n",
- pkt->stream_index);
- av_packet_unref(pkt);
- continue;
+ "Packet corrupt (stream = %d, dts = %s)",
+ pkt->stream_index, av_ts2str(pkt->dts));
+ if (s->flags & AVFMT_FLAG_DISCARD_CORRUPT) {
+ av_log(s, AV_LOG_WARNING, ", dropping it.\n");
+ av_packet_unref(pkt);
+ continue;
+ }
+ av_log(s, AV_LOG_WARNING, ".\n");
}
av_assert0(pkt->stream_index < (unsigned)s->nb_streams &&
st = s->streams[pkt->stream_index];
- if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
+ if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->internal->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
// correct first time stamps to negative values
if (!is_relative(st->first_dts))
st->first_dts = wrap_timestamp(st, st->first_dts);
if (s->use_wallclock_as_timestamps)
pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
- if (!pktl && st->request_probe <= 0)
+ if (!pktl && st->internal->request_probe <= 0)
return ret;
- err = ff_packet_list_put(&s->internal->raw_packet_buffer,
+ err = avpriv_packet_list_put(&s->internal->raw_packet_buffer,
&s->internal->raw_packet_buffer_end,
- pkt, 0);
+ pkt, NULL, 0);
if (err < 0) {
av_packet_unref(pkt);
return err;
}
}
-static int is_intra_only(enum AVCodecID id)
+int ff_is_intra_only(enum AVCodecID id)
{
const AVCodecDescriptor *d = avcodec_descriptor_get(id);
if (!d)
return 0;
- if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
+ if ((d->type == AVMEDIA_TYPE_VIDEO || d->type == AVMEDIA_TYPE_AUDIO) &&
+ !(d->props & AV_CODEC_PROP_INTRA_ONLY))
return 0;
return 1;
}
static int has_decode_delay_been_guessed(AVStream *st)
{
if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
- if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
+ if (!st->internal->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
return 1;
#if CONFIG_H264_DECODER
if (st->internal->avctx->has_b_frames &&
return 1;
#endif
if (st->internal->avctx->has_b_frames<3)
- return st->nb_decoded_frames >= 7;
+ return st->internal->nb_decoded_frames >= 7;
else if (st->internal->avctx->has_b_frames<4)
- return st->nb_decoded_frames >= 18;
+ return st->internal->nb_decoded_frames >= 18;
else
- return st->nb_decoded_frames >= 20;
+ return st->internal->nb_decoded_frames >= 20;
}
static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
if (dts == AV_NOPTS_VALUE) {
int64_t best_score = INT64_MAX;
for (i = 0; i<delay; i++) {
- if (st->pts_reorder_error_count[i]) {
- int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
+ if (st->internal->pts_reorder_error_count[i]) {
+ int64_t score = st->internal->pts_reorder_error[i] / st->internal->pts_reorder_error_count[i];
if (score < best_score) {
best_score = score;
dts = pts_buffer[i];
for (i = 0; i<delay; i++) {
if (pts_buffer[i] != AV_NOPTS_VALUE) {
int64_t diff = FFABS(pts_buffer[i] - dts)
- + (uint64_t)st->pts_reorder_error[i];
- diff = FFMAX(diff, st->pts_reorder_error[i]);
- st->pts_reorder_error[i] = diff;
- st->pts_reorder_error_count[i]++;
- if (st->pts_reorder_error_count[i] > 250) {
- st->pts_reorder_error[i] >>= 1;
- st->pts_reorder_error_count[i] >>= 1;
+ + (uint64_t)st->internal->pts_reorder_error[i];
+ diff = FFMAX(diff, st->internal->pts_reorder_error[i]);
+ st->internal->pts_reorder_error[i] = diff;
+ st->internal->pts_reorder_error_count[i]++;
+ if (st->internal->pts_reorder_error_count[i] > 250) {
+ st->internal->pts_reorder_error[i] >>= 1;
+ st->internal->pts_reorder_error_count[i] >>= 1;
}
}
}
dts == AV_NOPTS_VALUE ||
st->cur_dts == AV_NOPTS_VALUE ||
st->cur_dts < INT_MIN + RELATIVE_TS_BASE ||
+ dts < INT_MIN + (st->cur_dts - RELATIVE_TS_BASE) ||
is_relative(dts))
return;
if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
st->start_time = pktl_it->pkt.pts;
if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
- st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
+ st->start_time = av_sat_add64(st->start_time, av_rescale_q(st->internal->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base));
}
}
st->start_time = pts;
}
if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
- st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
+ st->start_time = av_sat_add64(st->start_time, av_rescale_q(st->internal->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base));
}
}
static void update_initial_durations(AVFormatContext *s, AVStream *st,
- int stream_index, int duration)
+ int stream_index, int64_t duration)
{
AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
int64_t cur_dts = RELATIVE_TS_BASE;
if (st->first_dts != AV_NOPTS_VALUE) {
- if (st->update_initial_durations_done)
+ if (st->internal->update_initial_durations_done)
return;
- st->update_initial_durations_done = 1;
+ st->internal->update_initial_durations_done = 1;
cur_dts = st->first_dts;
for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
if (pktl->pkt.stream_index == stream_index) {
pktl->pkt.dts = cur_dts;
if (!st->internal->avctx->has_b_frames)
pktl->pkt.pts = cur_dts;
-// if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
- pktl->pkt.duration = duration;
+ pktl->pkt.duration = duration;
} else
break;
cur_dts = pktl->pkt.dts + pktl->pkt.duration;
return;
if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
- if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
- if (st->last_dts_for_order_check <= pkt->dts) {
- st->dts_ordered++;
+ if (pkt->dts == pkt->pts && st->internal->last_dts_for_order_check != AV_NOPTS_VALUE) {
+ if (st->internal->last_dts_for_order_check <= pkt->dts) {
+ st->internal->dts_ordered++;
} else {
- av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
+ av_log(s, st->internal->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
"DTS %"PRIi64" < %"PRIi64" out of order\n",
pkt->dts,
- st->last_dts_for_order_check);
- st->dts_misordered++;
+ st->internal->last_dts_for_order_check);
+ st->internal->dts_misordered++;
}
- if (st->dts_ordered + st->dts_misordered > 250) {
- st->dts_ordered >>= 1;
- st->dts_misordered >>= 1;
+ if (st->internal->dts_ordered + st->internal->dts_misordered > 250) {
+ st->internal->dts_ordered >>= 1;
+ st->internal->dts_misordered >>= 1;
}
}
- st->last_dts_for_order_check = pkt->dts;
- if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
+ st->internal->last_dts_for_order_check = pkt->dts;
+ if (st->internal->dts_ordered < 8*st->internal->dts_misordered && pkt->dts == pkt->pts)
pkt->dts = AV_NOPTS_VALUE;
}
presentation_delayed = 1;
if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
- st->pts_wrap_bits < 63 &&
+ st->pts_wrap_bits < 63 && pkt->dts > INT64_MIN + (1LL << (st->pts_wrap_bits - 1)) &&
pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
pkt->dts -= 1LL << st->pts_wrap_bits;
if (st->last_IP_duration == 0 && (uint64_t)pkt->duration <= INT32_MAX)
st->last_IP_duration = pkt->duration;
if (pkt->dts != AV_NOPTS_VALUE)
- st->cur_dts = pkt->dts + st->last_IP_duration;
+ st->cur_dts = av_sat_add64(pkt->dts, st->last_IP_duration);
if (pkt->dts != AV_NOPTS_VALUE &&
pkt->pts == AV_NOPTS_VALUE &&
st->last_IP_duration > 0 &&
}
if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
- st->pts_buffer[0] = pkt->pts;
- for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
- FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
+ st->internal->pts_buffer[0] = pkt->pts;
+ for (i = 0; i<delay && st->internal->pts_buffer[i] > st->internal->pts_buffer[i + 1]; i++)
+ FFSWAP(int64_t, st->internal->pts_buffer[i], st->internal->pts_buffer[i + 1]);
if(has_decode_delay_been_guessed(st))
- pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
+ pkt->dts = select_from_pts_buffer(st, st->internal->pts_buffer, pkt->dts);
}
// We skipped it above so we try here.
if (!onein_oneout)
presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), st->index, st->id);
/* update flags */
- if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || is_intra_only(st->codecpar->codec_id))
+ if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || ff_is_intra_only(st->codecpar->codec_id))
pkt->flags |= AV_PKT_FLAG_KEY;
#if FF_API_CONVERGENCE_DURATION
FF_DISABLE_DEPRECATION_WARNINGS
#endif
}
-void ff_packet_list_free(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
-{
- AVPacketList *tmp = *pkt_buf;
-
- while (tmp) {
- AVPacketList *pktl = tmp;
- tmp = pktl->next;
- av_packet_unref(&pktl->pkt);
- av_freep(&pktl);
- }
- *pkt_buf = NULL;
- *pkt_buf_end = NULL;
-}
-
/**
* Parse a packet, add all split parts to parse_queue.
*
pkt->pts = pkt->dts = AV_NOPTS_VALUE;
pkt->pos = -1;
/* increment read pointer */
- data += len;
+ av_assert1(data || !len);
+ data = len ? data + len : data;
size -= len;
got_output = !!out_pkt.size;
compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
- ret = ff_packet_list_put(&s->internal->parse_queue,
+ ret = avpriv_packet_list_put(&s->internal->parse_queue,
&s->internal->parse_queue_end,
- &out_pkt, 0);
+ &out_pkt, NULL, 0);
if (ret < 0) {
av_packet_unref(&out_pkt);
goto fail;
return ret;
}
-int ff_packet_list_get(AVPacketList **pkt_buffer,
- AVPacketList **pkt_buffer_end,
- AVPacket *pkt)
-{
- AVPacketList *pktl;
- av_assert0(*pkt_buffer);
- pktl = *pkt_buffer;
- *pkt = pktl->pkt;
- *pkt_buffer = pktl->next;
- if (!pktl->next)
- *pkt_buffer_end = NULL;
- av_freep(&pktl);
- return 0;
-}
-
static int64_t ts_to_samples(AVStream *st, int64_t ts)
{
return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den);
ret = 0;
st = s->streams[pkt->stream_index];
+ st->event_flags |= AVSTREAM_EVENT_FLAG_NEW_PACKETS;
+
/* update context if required */
if (st->internal->need_context_update) {
if (avcodec_is_open(st->internal->avctx)) {
av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
avcodec_close(st->internal->avctx);
- st->info->found_decoder = 0;
+ st->internal->info->found_decoder = 0;
}
/* close parser, because it depends on the codec */
av_packet_unref(pkt);
}
if (pkt->flags & AV_PKT_FLAG_KEY)
- st->skip_to_keyframe = 0;
- if (st->skip_to_keyframe) {
+ st->internal->skip_to_keyframe = 0;
+ if (st->internal->skip_to_keyframe) {
av_packet_unref(pkt);
got_packet = 0;
}
}
if (!got_packet && s->internal->parse_queue)
- ret = ff_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
+ ret = avpriv_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
if (ret >= 0) {
AVStream *st = s->streams[pkt->stream_index];
int discard_padding = 0;
- if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
+ if (st->internal->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
int64_t sample = ts_to_samples(st, pts);
int duration = ts_to_samples(st, pkt->duration);
int64_t end_sample = sample + duration;
- if (duration > 0 && end_sample >= st->first_discard_sample &&
- sample < st->last_discard_sample)
- discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
+ if (duration > 0 && end_sample >= st->internal->first_discard_sample &&
+ sample < st->internal->last_discard_sample)
+ discard_padding = FFMIN(end_sample - st->internal->first_discard_sample, duration);
}
- if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
- st->skip_samples = st->start_skip_samples;
- if (st->skip_samples || discard_padding) {
+ if (st->internal->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
+ st->internal->skip_samples = st->internal->start_skip_samples;
+ if (st->internal->skip_samples || discard_padding) {
uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
if (p) {
- AV_WL32(p, st->skip_samples);
+ AV_WL32(p, st->internal->skip_samples);
AV_WL32(p + 4, discard_padding);
- av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
+ av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->internal->skip_samples, discard_padding);
}
- st->skip_samples = 0;
+ st->internal->skip_samples = 0;
}
- if (st->inject_global_side_data) {
+ if (st->internal->inject_global_side_data) {
for (i = 0; i < st->nb_side_data; i++) {
AVPacketSideData *src_sd = &st->side_data[i];
uint8_t *dst_data;
memcpy(dst_data, src_sd->data, src_sd->size);
}
- st->inject_global_side_data = 0;
+ st->internal->inject_global_side_data = 0;
}
}
if (!genpts) {
ret = s->internal->packet_buffer
- ? ff_packet_list_get(&s->internal->packet_buffer,
+ ? avpriv_packet_list_get(&s->internal->packet_buffer,
&s->internal->packet_buffer_end, pkt)
: read_frame_internal(s, pkt);
if (ret < 0)
st = s->streams[next_pkt->stream_index];
if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
- ret = ff_packet_list_get(&s->internal->packet_buffer,
+ ret = avpriv_packet_list_get(&s->internal->packet_buffer,
&s->internal->packet_buffer_end, pkt);
goto return_packet;
}
return ret;
}
- ret = ff_packet_list_put(&s->internal->packet_buffer,
+ ret = avpriv_packet_list_put(&s->internal->packet_buffer,
&s->internal->packet_buffer_end,
- pkt, 0);
+ pkt, NULL, 0);
if (ret < 0) {
av_packet_unref(pkt);
return ret;
{
if (!s->internal)
return;
- ff_packet_list_free(&s->internal->parse_queue, &s->internal->parse_queue_end);
- ff_packet_list_free(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
- ff_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
+ avpriv_packet_list_free(&s->internal->parse_queue, &s->internal->parse_queue_end);
+ avpriv_packet_list_free(&s->internal->packet_buffer, &s->internal->packet_buffer_end);
+ avpriv_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
}
st->parser = NULL;
}
st->last_IP_pts = AV_NOPTS_VALUE;
- st->last_dts_for_order_check = AV_NOPTS_VALUE;
+ st->internal->last_dts_for_order_check = AV_NOPTS_VALUE;
if (st->first_dts == AV_NOPTS_VALUE)
st->cur_dts = RELATIVE_TS_BASE;
else
/* We set the current DTS to an unspecified origin. */
st->cur_dts = AV_NOPTS_VALUE;
- st->probe_packets = MAX_PROBE_PACKETS;
+ st->probe_packets = s->max_probe_packets;
for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
- st->pts_buffer[j] = AV_NOPTS_VALUE;
+ st->internal->pts_buffer[j] = AV_NOPTS_VALUE;
if (s->internal->inject_global_side_data)
- st->inject_global_side_data = 1;
+ st->internal->inject_global_side_data = 1;
- st->skip_samples = 0;
+ st->internal->skip_samples = 0;
}
}
AVStream *st = s->streams[stream_index];
unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
- if ((unsigned) st->nb_index_entries >= max_entries) {
+ if ((unsigned) st->internal->nb_index_entries >= max_entries) {
int i;
- for (i = 0; 2 * i < st->nb_index_entries; i++)
- st->index_entries[i] = st->index_entries[2 * i];
- st->nb_index_entries = i;
+ for (i = 0; 2 * i < st->internal->nb_index_entries; i++)
+ st->internal->index_entries[i] = st->internal->index_entries[2 * i];
+ st->internal->nb_index_entries = i;
}
}
int size, int distance, int flags)
{
timestamp = wrap_timestamp(st, timestamp);
- return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
- &st->index_entries_allocated_size, pos,
+ return ff_add_index_entry(&st->internal->index_entries, &st->internal->nb_index_entries,
+ &st->internal->index_entries_allocated_size, pos,
timestamp, size, distance, flags);
}
//We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
const char *proto = avio_find_protocol_name(s->url);
+ av_assert0(time_tolerance >= 0);
+
if (!proto) {
av_log(s, AV_LOG_INFO,
"Protocol name not provided, cannot determine if input is local or "
if (ist1 == ist2)
continue;
- for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
- AVIndexEntry *e1 = &st1->index_entries[i1];
+ for (i1 = i2 = 0; i1 < st1->internal->nb_index_entries; i1++) {
+ AVIndexEntry *e1 = &st1->internal->index_entries[i1];
int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
skip = FFMAX(skip, e1->size);
- for (; i2 < st2->nb_index_entries; i2++) {
- AVIndexEntry *e2 = &st2->index_entries[i2];
+ for (; i2 < st2->internal->nb_index_entries; i2++) {
+ AVIndexEntry *e2 = &st2->internal->index_entries[i2];
int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
- if (e2_pts - e1_pts < time_tolerance)
+ if (e2_pts < e1_pts || e2_pts - (uint64_t)e1_pts < time_tolerance)
continue;
pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
break;
int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
{
- return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
+ return ff_index_search_timestamp(st->internal->index_entries, st->internal->nb_index_entries,
wanted_timestamp, flags);
}
pos_limit = -1; // GCC falsely says it may be uninitialized.
st = s->streams[stream_index];
- if (st->index_entries) {
+ if (st->internal->index_entries) {
AVIndexEntry *e;
/* FIXME: Whole function must be checked for non-keyframe entries in
index = av_index_search_timestamp(st, target_ts,
flags | AVSEEK_FLAG_BACKWARD);
index = FFMAX(index, 0);
- e = &st->index_entries[index];
+ e = &st->internal->index_entries[index];
if (e->timestamp <= target_ts || e->pos == e->min_distance) {
pos_min = e->pos;
index = av_index_search_timestamp(st, target_ts,
flags & ~AVSEEK_FLAG_BACKWARD);
- av_assert0(index < st->nb_index_entries);
+ av_assert0(index < st->internal->nb_index_entries);
if (index >= 0) {
- e = &st->index_entries[index];
+ e = &st->internal->index_entries[index];
av_assert1(e->timestamp >= target_ts);
pos_max = e->pos;
ts_max = e->timestamp;
index = av_index_search_timestamp(st, timestamp, flags);
- if (index < 0 && st->nb_index_entries &&
- timestamp < st->index_entries[0].timestamp)
+ if (index < 0 && st->internal->nb_index_entries &&
+ timestamp < st->internal->index_entries[0].timestamp)
return -1;
- if (index < 0 || index == st->nb_index_entries - 1) {
+ if (index < 0 || index == st->internal->nb_index_entries - 1) {
AVPacket pkt;
int nonkey = 0;
- if (st->nb_index_entries) {
- av_assert0(st->index_entries);
- ie = &st->index_entries[st->nb_index_entries - 1];
+ if (st->internal->nb_index_entries) {
+ av_assert0(st->internal->index_entries);
+ ie = &st->internal->index_entries[st->internal->nb_index_entries - 1];
if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
return ret;
ff_update_cur_dts(s, st, ie->timestamp);
if (s->iformat->read_seek)
if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
return 0;
- ie = &st->index_entries[index];
+ ie = &st->internal->index_entries[index];
if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
return ret;
ff_update_cur_dts(s, st, ie->timestamp);
st = ic->streams[i];
if ( st->time_base.num <= INT64_MAX / ic->bit_rate
&& st->duration == AV_NOPTS_VALUE) {
- duration = av_rescale(8 * filesize, st->time_base.den,
+ duration = av_rescale(filesize, 8LL * st->time_base.den,
ic->bit_rate *
(int64_t) st->time_base.num);
st->duration = duration;
else
duration -= st->first_dts;
if (duration > 0) {
- if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
- (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
+ if (st->duration == AV_NOPTS_VALUE || st->internal->info->last_duration<= 0 ||
+ (st->duration < duration && FFABS(duration - st->internal->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
st->duration = duration;
- st->info->last_duration = duration;
+ st->internal->info->last_duration = duration;
}
}
av_packet_unref(pkt);
st = ic->streams[i];
st->cur_dts = st->first_dts;
st->last_IP_pts = AV_NOPTS_VALUE;
- st->last_dts_for_order_check = AV_NOPTS_VALUE;
+ st->internal->last_dts_for_order_check = AV_NOPTS_VALUE;
for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
- st->pts_buffer[j] = AV_NOPTS_VALUE;
+ st->internal->pts_buffer[j] = AV_NOPTS_VALUE;
}
}
+/* 1:1 map to AVDurationEstimationMethod */
+static const char *const duration_name[] = {
+ [AVFMT_DURATION_FROM_PTS] = "pts",
+ [AVFMT_DURATION_FROM_STREAM] = "stream",
+ [AVFMT_DURATION_FROM_BITRATE] = "bit rate",
+};
+
+static const char *duration_estimate_name(enum AVDurationEstimationMethod method)
+{
+ return duration_name[method];
+}
+
static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
{
int64_t file_size;
/* at least one component has timings - we use them for all
* the components */
fill_all_stream_timings(ic);
- ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
+ /* nut demuxer estimate the duration from PTS */
+ if(!strcmp(ic->iformat->name, "nut"))
+ ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
+ else
+ ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
} else {
/* less precise: use bitrate info */
estimate_timings_from_bit_rate(ic);
for (i = 0; i < ic->nb_streams; i++) {
st = ic->streams[i];
if (st->time_base.den)
- av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
- (double) st->start_time * av_q2d(st->time_base),
- (double) st->duration * av_q2d(st->time_base));
+ av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %s duration: %s\n", i,
+ av_ts2timestr(st->start_time, &st->time_base),
+ av_ts2timestr(st->duration, &st->time_base));
}
av_log(ic, AV_LOG_TRACE,
- "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
- (double) ic->start_time / AV_TIME_BASE,
- (double) ic->duration / AV_TIME_BASE,
- (int64_t)ic->bit_rate / 1000);
+ "format: start_time: %s duration: %s (estimate from %s) bitrate=%"PRId64" kb/s\n",
+ av_ts2timestr(ic->start_time, &AV_TIME_BASE_Q),
+ av_ts2timestr(ic->duration, &AV_TIME_BASE_Q),
+ duration_estimate_name(ic->duration_estimation_method),
+ (int64_t)ic->bit_rate / 1000);
}
}
case AVMEDIA_TYPE_AUDIO:
if (!avctx->frame_size && determinable_frame_size(avctx))
FAIL("unspecified frame size");
- if (st->info->found_decoder >= 0 &&
+ if (st->internal->info->found_decoder >= 0 &&
avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
FAIL("unspecified sample format");
if (!avctx->sample_rate)
FAIL("unspecified sample rate");
if (!avctx->channels)
FAIL("unspecified number of channels");
- if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
+ if (st->internal->info->found_decoder >= 0 && !st->internal->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
FAIL("no decodable DTS frames");
break;
case AVMEDIA_TYPE_VIDEO:
if (!avctx->width)
FAIL("unspecified size");
- if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
+ if (st->internal->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
FAIL("unspecified pixel format");
if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
return AVERROR(ENOMEM);
if (!avcodec_is_open(avctx) &&
- st->info->found_decoder <= 0 &&
- (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
+ st->internal->info->found_decoder <= 0 &&
+ (st->codecpar->codec_id != -st->internal->info->found_decoder || !st->codecpar->codec_id)) {
AVDictionary *thread_opt = NULL;
codec = find_probe_decoder(s, st, st->codecpar->codec_id);
if (!codec) {
- st->info->found_decoder = -st->codecpar->codec_id;
+ st->internal->info->found_decoder = -st->codecpar->codec_id;
ret = -1;
goto fail;
}
/* Force thread count to 1 since the H.264 decoder will not extract
* SPS and PPS to extradata during multi-threaded decoding. */
av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
+ /* Force lowres to 0. The decoder might reduce the video size by the
+ * lowres factor, and we don't want that propagated to the stream's
+ * codecpar */
+ av_dict_set(options ? options : &thread_opt, "lowres", "0", 0);
if (s->codec_whitelist)
av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
if (!options)
av_dict_free(&thread_opt);
if (ret < 0) {
- st->info->found_decoder = -avctx->codec_id;
+ st->internal->info->found_decoder = -avctx->codec_id;
goto fail;
}
- st->info->found_decoder = 1;
- } else if (!st->info->found_decoder)
- st->info->found_decoder = 1;
+ st->internal->info->found_decoder = 1;
+ } else if (!st->internal->info->found_decoder)
+ st->internal->info->found_decoder = 1;
- if (st->info->found_decoder < 0) {
+ if (st->internal->info->found_decoder < 0) {
ret = -1;
goto fail;
}
} else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
ret = avcodec_decode_subtitle2(avctx, &subtitle,
&got_picture, &pkt);
+ if (got_picture)
+ avsubtitle_free(&subtitle);
if (ret >= 0)
pkt.size = 0;
}
if (ret >= 0) {
if (got_picture)
- st->nb_decoded_frames++;
+ st->internal->nb_decoded_frames++;
ret = got_picture;
}
}
return AV_CODEC_ID_NONE;
}
-static void compute_chapters_end(AVFormatContext *s)
+static int chapter_start_cmp(const void *p1, const void *p2)
+{
+ AVChapter *ch1 = *(AVChapter**)p1;
+ AVChapter *ch2 = *(AVChapter**)p2;
+ int delta = av_compare_ts(ch1->start, ch1->time_base, ch2->start, ch2->time_base);
+ if (delta)
+ return delta;
+ return (ch1 > ch2) - (ch1 < ch2);
+}
+
+static int compute_chapters_end(AVFormatContext *s)
{
- unsigned int i, j;
+ unsigned int i;
int64_t max_time = 0;
+ AVChapter **timetable = av_malloc(s->nb_chapters * sizeof(*timetable));
+
+ if (!timetable)
+ return AVERROR(ENOMEM);
if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
max_time = s->duration +
((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
for (i = 0; i < s->nb_chapters; i++)
- if (s->chapters[i]->end == AV_NOPTS_VALUE) {
- AVChapter *ch = s->chapters[i];
+ timetable[i] = s->chapters[i];
+ qsort(timetable, s->nb_chapters, sizeof(*timetable), chapter_start_cmp);
+
+ for (i = 0; i < s->nb_chapters; i++)
+ if (timetable[i]->end == AV_NOPTS_VALUE) {
+ AVChapter *ch = timetable[i];
int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
- ch->time_base)
- : INT64_MAX;
+ ch->time_base)
+ : INT64_MAX;
- for (j = 0; j < s->nb_chapters; j++) {
- AVChapter *ch1 = s->chapters[j];
+ if (i + 1 < s->nb_chapters) {
+ AVChapter *ch1 = timetable[i + 1];
int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
- ch->time_base);
- if (j != i && next_start > ch->start && next_start < end)
+ ch->time_base);
+ if (next_start > ch->start && next_start < end)
end = next_start;
}
ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end;
}
+ av_free(timetable);
+ return 0;
}
static int get_std_framerate(int i)
int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
{
int i, j;
- int64_t last = st->info->last_dts;
+ int64_t last = st->internal->info->last_dts;
if ( ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
&& ts - (uint64_t)last < INT64_MAX) {
double dts = (is_relative(ts) ? ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
int64_t duration = ts - last;
- if (!st->info->duration_error)
- st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
- if (!st->info->duration_error)
+ if (!st->internal->info->duration_error)
+ st->internal->info->duration_error = av_mallocz(sizeof(st->internal->info->duration_error[0])*2);
+ if (!st->internal->info->duration_error)
return AVERROR(ENOMEM);
// if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
// av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
for (i = 0; i<MAX_STD_TIMEBASES; i++) {
- if (st->info->duration_error[0][1][i] < 1e10) {
+ if (st->internal->info->duration_error[0][1][i] < 1e10) {
int framerate = get_std_framerate(i);
double sdts = dts*framerate/(1001*12);
for (j= 0; j<2; j++) {
int64_t ticks = llrint(sdts+j*0.5);
double error= sdts - ticks + j*0.5;
- st->info->duration_error[j][0][i] += error;
- st->info->duration_error[j][1][i] += error*error;
+ st->internal->info->duration_error[j][0][i] += error;
+ st->internal->info->duration_error[j][1][i] += error*error;
}
}
}
- if (st->info->rfps_duration_sum <= INT64_MAX - duration) {
- st->info->duration_count++;
- st->info->rfps_duration_sum += duration;
+ if (st->internal->info->rfps_duration_sum <= INT64_MAX - duration) {
+ st->internal->info->duration_count++;
+ st->internal->info->rfps_duration_sum += duration;
}
- if (st->info->duration_count % 10 == 0) {
- int n = st->info->duration_count;
+ if (st->internal->info->duration_count % 10 == 0) {
+ int n = st->internal->info->duration_count;
for (i = 0; i<MAX_STD_TIMEBASES; i++) {
- if (st->info->duration_error[0][1][i] < 1e10) {
- double a0 = st->info->duration_error[0][0][i] / n;
- double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
- double a1 = st->info->duration_error[1][0][i] / n;
- double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
+ if (st->internal->info->duration_error[0][1][i] < 1e10) {
+ double a0 = st->internal->info->duration_error[0][0][i] / n;
+ double error0 = st->internal->info->duration_error[0][1][i] / n - a0*a0;
+ double a1 = st->internal->info->duration_error[1][0][i] / n;
+ double error1 = st->internal->info->duration_error[1][1][i] / n - a1*a1;
if (error0 > 0.04 && error1 > 0.04) {
- st->info->duration_error[0][1][i] = 2e10;
- st->info->duration_error[1][1][i] = 2e10;
+ st->internal->info->duration_error[0][1][i] = 2e10;
+ st->internal->info->duration_error[1][1][i] = 2e10;
}
}
}
}
// ignore the first 4 values, they might have some random jitter
- if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
- st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
+ if (st->internal->info->duration_count > 3 && is_relative(ts) == is_relative(last))
+ st->internal->info->duration_gcd = av_gcd(st->internal->info->duration_gcd, duration);
}
if (ts != AV_NOPTS_VALUE)
- st->info->last_dts = ts;
+ st->internal->info->last_dts = ts;
return 0;
}
// the check for tb_unreliable() is not completely correct, since this is not about handling
// an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
// ipmovie.c produces.
- if (tb_unreliable(st->internal->avctx) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
- av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
- if (st->info->duration_count>1 && !st->r_frame_rate.num
+ if (tb_unreliable(st->internal->avctx) && st->internal->info->duration_count > 15 && st->internal->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
+ av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->internal->info->duration_gcd, INT_MAX);
+ if (st->internal->info->duration_count>1 && !st->r_frame_rate.num
&& tb_unreliable(st->internal->avctx)) {
int num = 0;
double best_error= 0.01;
for (j= 0; j<MAX_STD_TIMEBASES; j++) {
int k;
- if (st->info->codec_info_duration &&
- st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
+ if (st->internal->info->codec_info_duration &&
+ st->internal->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
continue;
- if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
+ if (!st->internal->info->codec_info_duration && get_std_framerate(j) < 1001*12)
continue;
- if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
+ if (av_q2d(st->time_base) * st->internal->info->rfps_duration_sum / st->internal->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
continue;
for (k= 0; k<2; k++) {
- int n = st->info->duration_count;
- double a= st->info->duration_error[k][0][j] / n;
- double error= st->info->duration_error[k][1][j]/n - a*a;
+ int n = st->internal->info->duration_count;
+ double a= st->internal->info->duration_error[k][0][j] / n;
+ double error= st->internal->info->duration_error[k][1][j]/n - a*a;
if (error < best_error && best_error> 0.000000001) {
best_error= error;
av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
}
if ( !st->avg_frame_rate.num
- && st->r_frame_rate.num && st->info->rfps_duration_sum
- && st->info->codec_info_duration <= 0
- && st->info->duration_count > 2
- && fabs(1.0 / (av_q2d(st->r_frame_rate) * av_q2d(st->time_base)) - st->info->rfps_duration_sum / (double)st->info->duration_count) <= 1.0
+ && st->r_frame_rate.num && st->internal->info->rfps_duration_sum
+ && st->internal->info->codec_info_duration <= 0
+ && st->internal->info->duration_count > 2
+ && fabs(1.0 / (av_q2d(st->r_frame_rate) * av_q2d(st->time_base)) - st->internal->info->rfps_duration_sum / (double)st->internal->info->duration_count) <= 1.0
) {
av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
st->avg_frame_rate = st->r_frame_rate;
}
- av_freep(&st->info->duration_error);
- st->info->last_dts = AV_NOPTS_VALUE;
- st->info->duration_count = 0;
- st->info->rfps_duration_sum = 0;
+ av_freep(&st->internal->info->duration_error);
+ st->internal->info->last_dts = AV_NOPTS_VALUE;
+ st->internal->info->duration_count = 0;
+ st->internal->info->rfps_duration_sum = 0;
}
}
}
while (ret >= 0 && !sti->avctx->extradata) {
- int extradata_size;
- uint8_t *extradata;
-
ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref);
if (ret < 0) {
if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
continue;
}
- extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
- &extradata_size);
-
- if (extradata) {
- av_assert0(!sti->avctx->extradata);
- if ((unsigned)extradata_size < FF_MAX_EXTRADATA_SIZE)
- sti->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!sti->avctx->extradata) {
- av_packet_unref(pkt_ref);
- return AVERROR(ENOMEM);
+ for (int i = 0; i < pkt_ref->side_data_elems; i++) {
+ AVPacketSideData *side_data = &pkt_ref->side_data[i];
+ if (side_data->type == AV_PKT_DATA_NEW_EXTRADATA) {
+ sti->avctx->extradata = side_data->data;
+ sti->avctx->extradata_size = side_data->size;
+ side_data->data = NULL;
+ side_data->size = 0;
+ break;
}
- memcpy(sti->avctx->extradata, extradata, extradata_size);
- sti->avctx->extradata_size = extradata_size;
}
av_packet_unref(pkt_ref);
}
return 0;
}
+static int add_coded_side_data(AVStream *st, AVCodecContext *avctx)
+{
+ int i;
+
+ for (i = 0; i < avctx->nb_coded_side_data; i++) {
+ const AVPacketSideData *sd_src = &avctx->coded_side_data[i];
+ uint8_t *dst_data;
+ dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size);
+ if (!dst_data)
+ return AVERROR(ENOMEM);
+ memcpy(dst_data, sd_src->data, sd_src->size);
+ }
+ return 0;
+}
+
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
{
int i, count = 0, ret = 0, j;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
// only for the split stuff
- if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
+ if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->internal->request_probe <= 0) {
st->parser = av_parser_init(st->codecpar->codec_id);
if (st->parser) {
if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
ret = avcodec_parameters_to_context(avctx, st->codecpar);
if (ret < 0)
goto find_stream_info_err;
- if (st->request_probe <= 0)
+ if (st->internal->request_probe <= 0)
st->internal->avctx_inited = 1;
codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
/* Force thread count to 1 since the H.264 decoder will not extract
* SPS and PPS to extradata during multi-threaded decoding. */
av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
+ /* Force lowres to 0. The decoder might reduce the video size by the
+ * lowres factor, and we don't want that propagated to the stream's
+ * codecpar */
+ av_dict_set(options ? &options[i] : &thread_opt, "lowres", "0", 0);
if (ic->codec_whitelist)
av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
}
// Try to just open decoders, in case this is enough to get parameters.
- if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
+ if (!has_codec_parameters(st, NULL) && st->internal->request_probe <= 0) {
if (codec && !avctx->codec)
if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
av_log(ic, AV_LOG_WARNING,
for (i = 0; i < ic->nb_streams; i++) {
#if FF_API_R_FRAME_RATE
- ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
+ ic->streams[i]->internal->info->last_dts = AV_NOPTS_VALUE;
#endif
- ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
- ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
+ ic->streams[i]->internal->info->fps_first_dts = AV_NOPTS_VALUE;
+ ic->streams[i]->internal->info->fps_last_dts = AV_NOPTS_VALUE;
}
read_size = 0;
fps_analyze_framecount = 0;
/* variable fps and no guess at the real fps */
count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
- st->info->codec_info_duration_fields/2 :
- st->info->duration_count;
+ st->internal->info->codec_info_duration_fields/2 :
+ st->internal->info->duration_count;
if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
if (count < fps_analyze_framecount)
}
// Look at the first 3 frames if there is evidence of frame delay
// but the decoder delay is not set.
- if (st->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
+ if (st->internal->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
break;
if (!st->internal->avctx->extradata &&
(!st->internal->extract_extradata.inited ||
}
analyzed_all_streams = 0;
if (!missing_streams || !*missing_streams)
- if (i == ic->nb_streams) {
- analyzed_all_streams = 1;
- /* NOTE: If the format has no header, then we need to read some
- * packets to get most of the streams, so we cannot stop here. */
- if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
- /* If we found the info for all the codecs, we can stop. */
- ret = count;
- av_log(ic, AV_LOG_DEBUG, "All info found\n");
- flush_codecs = 0;
- break;
+ if (i == ic->nb_streams) {
+ analyzed_all_streams = 1;
+ /* NOTE: If the format has no header, then we need to read some
+ * packets to get most of the streams, so we cannot stop here. */
+ if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
+ /* If we found the info for all the codecs, we can stop. */
+ ret = count;
+ av_log(ic, AV_LOG_DEBUG, "All info found\n");
+ flush_codecs = 0;
+ break;
+ }
}
- }
/* We did not get all the codec info, but we read too much data. */
if (read_size >= probesize) {
ret = count;
"Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
for (i = 0; i < ic->nb_streams; i++)
if (!ic->streams[i]->r_frame_rate.num &&
- ic->streams[i]->info->duration_count <= 1 &&
+ ic->streams[i]->internal->info->duration_count <= 1 &&
ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
strcmp(ic->iformat->name, "image2"))
av_log(ic, AV_LOG_WARNING,
}
if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
- ret = ff_packet_list_put(&ic->internal->packet_buffer,
+ ret = avpriv_packet_list_put(&ic->internal->packet_buffer,
&ic->internal->packet_buffer_end,
- &pkt1, 0);
+ &pkt1, NULL, 0);
if (ret < 0)
goto unref_then_goto_end;
if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
/* check for non-increasing dts */
- if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
- st->info->fps_last_dts >= pkt->dts) {
+ if (st->internal->info->fps_last_dts != AV_NOPTS_VALUE &&
+ st->internal->info->fps_last_dts >= pkt->dts) {
av_log(ic, AV_LOG_DEBUG,
"Non-increasing DTS in stream %d: packet %d with DTS "
"%"PRId64", packet %d with DTS %"PRId64"\n",
- st->index, st->info->fps_last_dts_idx,
- st->info->fps_last_dts, st->codec_info_nb_frames,
+ st->index, st->internal->info->fps_last_dts_idx,
+ st->internal->info->fps_last_dts, st->codec_info_nb_frames,
pkt->dts);
- st->info->fps_first_dts =
- st->info->fps_last_dts = AV_NOPTS_VALUE;
+ st->internal->info->fps_first_dts =
+ st->internal->info->fps_last_dts = AV_NOPTS_VALUE;
}
/* Check for a discontinuity in dts. If the difference in dts
* is more than 1000 times the average packet duration in the
* sequence, we treat it as a discontinuity. */
- if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
- st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
- (pkt->dts - (uint64_t)st->info->fps_last_dts) / 1000 >
- (st->info->fps_last_dts - (uint64_t)st->info->fps_first_dts) /
- (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
+ if (st->internal->info->fps_last_dts != AV_NOPTS_VALUE &&
+ st->internal->info->fps_last_dts_idx > st->internal->info->fps_first_dts_idx &&
+ (pkt->dts - (uint64_t)st->internal->info->fps_last_dts) / 1000 >
+ (st->internal->info->fps_last_dts - (uint64_t)st->internal->info->fps_first_dts) /
+ (st->internal->info->fps_last_dts_idx - st->internal->info->fps_first_dts_idx)) {
av_log(ic, AV_LOG_WARNING,
"DTS discontinuity in stream %d: packet %d with DTS "
"%"PRId64", packet %d with DTS %"PRId64"\n",
- st->index, st->info->fps_last_dts_idx,
- st->info->fps_last_dts, st->codec_info_nb_frames,
+ st->index, st->internal->info->fps_last_dts_idx,
+ st->internal->info->fps_last_dts, st->codec_info_nb_frames,
pkt->dts);
- st->info->fps_first_dts =
- st->info->fps_last_dts = AV_NOPTS_VALUE;
+ st->internal->info->fps_first_dts =
+ st->internal->info->fps_last_dts = AV_NOPTS_VALUE;
}
/* update stored dts values */
- if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
- st->info->fps_first_dts = pkt->dts;
- st->info->fps_first_dts_idx = st->codec_info_nb_frames;
+ if (st->internal->info->fps_first_dts == AV_NOPTS_VALUE) {
+ st->internal->info->fps_first_dts = pkt->dts;
+ st->internal->info->fps_first_dts_idx = st->codec_info_nb_frames;
}
- st->info->fps_last_dts = pkt->dts;
- st->info->fps_last_dts_idx = st->codec_info_nb_frames;
+ st->internal->info->fps_last_dts = pkt->dts;
+ st->internal->info->fps_last_dts_idx = st->codec_info_nb_frames;
}
if (st->codec_info_nb_frames>1) {
int64_t t = 0;
int64_t limit;
if (st->time_base.den > 0)
- t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
+ t = av_rescale_q(st->internal->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
if (st->avg_frame_rate.num > 0)
t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
if ( t == 0
&& st->codec_info_nb_frames>30
- && st->info->fps_first_dts != AV_NOPTS_VALUE
- && st->info->fps_last_dts != AV_NOPTS_VALUE)
- t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
+ && st->internal->info->fps_first_dts != AV_NOPTS_VALUE
+ && st->internal->info->fps_last_dts != AV_NOPTS_VALUE) {
+ int64_t dur = av_sat_sub64(st->internal->info->fps_last_dts, st->internal->info->fps_first_dts);
+ t = FFMAX(t, av_rescale_q(dur, st->time_base, AV_TIME_BASE_Q));
+ }
if (analyzed_all_streams) limit = max_analyze_duration;
else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
}
if (pkt->duration) {
if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && st->start_time != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
- st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
+ st->internal->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->internal->info->codec_info_duration + pkt->duration);
} else
- st->info->codec_info_duration += pkt->duration;
- st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
+ st->internal->info->codec_info_duration += pkt->duration;
+ st->internal->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
}
}
if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
ff_rfps_add_frame(ic, st, pkt->dts);
#endif
if (pkt->dts != pkt->pts && pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
- st->info->frame_delay_evidence = 1;
+ st->internal->info->frame_delay_evidence = 1;
}
if (!st->internal->avctx->extradata) {
ret = extract_extradata(st, pkt);
st = ic->streams[i];
/* flush the decoders */
- if (st->info->found_decoder == 1) {
+ if (st->internal->info->found_decoder == 1) {
do {
err = try_decode_frame(ic, st, &empty_pkt,
(options && i < orig_nb_streams)
}
/* estimate average framerate if not set by demuxer */
- if (st->info->codec_info_duration_fields &&
+ if (st->internal->info->codec_info_duration_fields &&
!st->avg_frame_rate.num &&
- st->info->codec_info_duration) {
+ st->internal->info->codec_info_duration) {
int best_fps = 0;
double best_error = 0.01;
AVRational codec_frame_rate = avctx->framerate;
- if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
- st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
- st->info->codec_info_duration < 0)
+ if (st->internal->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
+ st->internal->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
+ st->internal->info->codec_info_duration < 0)
continue;
av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
- st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
- st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
+ st->internal->info->codec_info_duration_fields * (int64_t) st->time_base.den,
+ st->internal->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
/* Round guessed framerate to a "standard" framerate if it's
* within 1% of the original estimate. */
if (!st->r_frame_rate.num) {
if ( avctx->time_base.den * (int64_t) st->time_base.num
- <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
+ <= avctx->time_base.num * avctx->ticks_per_frame * (uint64_t) st->time_base.den) {
av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
} else {
st->r_frame_rate.den = st->time_base.num;
}
}
- if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
+ if (st->internal->display_aspect_ratio.num && st->internal->display_aspect_ratio.den) {
AVRational hw_ratio = { avctx->height, avctx->width };
- st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
+ st->sample_aspect_ratio = av_mul_q(st->internal->display_aspect_ratio,
hw_ratio);
}
} else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
av_log(ic, AV_LOG_WARNING,
"Could not find codec parameters for stream %d (%s): %s\n"
- "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
- i, buf, errmsg);
+ "Consider increasing the value for the 'analyzeduration' (%"PRId64") and 'probesize' (%"PRId64") options\n",
+ i, buf, errmsg, ic->max_analyze_duration, ic->probesize);
} else {
ret = 0;
}
}
- compute_chapters_end(ic);
+ ret = compute_chapters_end(ic);
+ if (ret < 0)
+ goto find_stream_info_err;
/* update the stream parameters from the internal codec contexts */
for (i = 0; i < ic->nb_streams; i++) {
st = ic->streams[i];
if (st->internal->avctx_inited) {
- int orig_w = st->codecpar->width;
- int orig_h = st->codecpar->height;
ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
if (ret < 0)
goto find_stream_info_err;
-#if FF_API_LOWRES
- // The decoder might reduce the video size by the lowres factor.
- if (st->internal->avctx->lowres && orig_w) {
- st->codecpar->width = orig_w;
- st->codecpar->height = orig_h;
- }
-#endif
+ ret = add_coded_side_data(st, st->internal->avctx);
+ if (ret < 0)
+ goto find_stream_info_err;
}
#if FF_API_LAVF_AVCTX
if (ret < 0)
goto find_stream_info_err;
-#if FF_API_LOWRES
// The old API (AVStream.codec) "requires" the resolution to be adjusted
// by the lowres factor.
if (st->internal->avctx->lowres && st->internal->avctx->width) {
st->codec->width = st->internal->avctx->width;
st->codec->height = st->internal->avctx->height;
}
-#endif
if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
st->codec->time_base = st->internal->avctx->time_base;
find_stream_info_err:
for (i = 0; i < ic->nb_streams; i++) {
st = ic->streams[i];
- if (st->info)
- av_freep(&st->info->duration_error);
+ if (st->internal->info)
+ av_freep(&st->internal->info->duration_error);
avcodec_close(ic->streams[i]->internal->avctx);
- av_freep(&ic->streams[i]->info);
+ av_freep(&ic->streams[i]->internal->info);
av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
}
if (st->internal) {
avcodec_free_context(&st->internal->avctx);
- for (i = 0; i < st->internal->nb_bsfcs; i++) {
- av_bsf_free(&st->internal->bsfcs[i]);
- av_freep(&st->internal->bsfcs);
- }
+ av_bsf_free(&st->internal->bsfc);
av_freep(&st->internal->priv_pts);
+ av_freep(&st->internal->index_entries);
+ av_freep(&st->internal->probe_data.buf);
+
av_bsf_free(&st->internal->extract_extradata.bsf);
av_packet_free(&st->internal->extract_extradata.pkt);
+
+ if (st->internal->info)
+ av_freep(&st->internal->info->duration_error);
+ av_freep(&st->internal->info);
}
av_freep(&st->internal);
av_dict_free(&st->metadata);
avcodec_parameters_free(&st->codecpar);
- av_freep(&st->probe_data.buf);
- av_freep(&st->index_entries);
#if FF_API_LAVF_AVCTX
FF_DISABLE_DEPRECATION_WARNINGS
avcodec_free_context(&st->codec);
FF_ENABLE_DEPRECATION_WARNINGS
#endif
av_freep(&st->priv_data);
- if (st->info)
- av_freep(&st->info->duration_error);
- av_freep(&st->info);
#if FF_API_LAVF_FFSERVER
FF_DISABLE_DEPRECATION_WARNINGS
av_freep(&st->recommended_encoder_configuration);
if (!s)
return;
+ if (s->oformat && s->oformat->deinit && s->internal->initialized)
+ s->oformat->deinit(s);
+
av_opt_free(s);
if (s->iformat && s->iformat->priv_class && s->priv_data)
av_opt_free(s->priv_data);
if (s->oformat && s->oformat->priv_class && s->priv_data)
av_opt_free(s->priv_data);
- for (i = s->nb_streams - 1; i >= 0; i--)
- ff_free_stream(s, s->streams[i]);
-
+ for (i = 0; i < s->nb_streams; i++)
+ free_stream(&s->streams[i]);
+ s->nb_streams = 0;
- for (i = s->nb_programs - 1; i >= 0; i--) {
+ for (i = 0; i < s->nb_programs; i++) {
av_dict_free(&s->programs[i]->metadata);
av_freep(&s->programs[i]->stream_index);
av_freep(&s->programs[i]);
}
+ s->nb_programs = 0;
+
av_freep(&s->programs);
av_freep(&s->priv_data);
while (s->nb_chapters--) {
st = av_mallocz(sizeof(AVStream));
if (!st)
return NULL;
- if (!(st->info = av_mallocz(sizeof(*st->info)))) {
- av_free(st);
- return NULL;
- }
- st->info->last_dts = AV_NOPTS_VALUE;
#if FF_API_LAVF_AVCTX
FF_DISABLE_DEPRECATION_WARNINGS
st->codec = avcodec_alloc_context3(c);
if (!st->codec) {
- av_free(st->info);
av_free(st);
return NULL;
}
if (!st->internal)
goto fail;
+ st->internal->info = av_mallocz(sizeof(*st->internal->info));
+ if (!st->internal->info)
+ goto fail;
+ st->internal->info->last_dts = AV_NOPTS_VALUE;
+
st->codecpar = avcodec_parameters_alloc();
if (!st->codecpar)
goto fail;
st->start_time = AV_NOPTS_VALUE;
st->duration = AV_NOPTS_VALUE;
st->first_dts = AV_NOPTS_VALUE;
- st->probe_packets = MAX_PROBE_PACKETS;
- st->pts_wrap_reference = AV_NOPTS_VALUE;
- st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
+ st->probe_packets = s->max_probe_packets;
+ st->internal->pts_wrap_reference = AV_NOPTS_VALUE;
+ st->internal->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
st->last_IP_pts = AV_NOPTS_VALUE;
- st->last_dts_for_order_check = AV_NOPTS_VALUE;
+ st->internal->last_dts_for_order_check = AV_NOPTS_VALUE;
for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
- st->pts_buffer[i] = AV_NOPTS_VALUE;
+ st->internal->pts_buffer[i] = AV_NOPTS_VALUE;
st->sample_aspect_ratio = (AVRational) { 0, 1 };
#if FF_API_R_FRAME_RATE
- st->info->last_dts = AV_NOPTS_VALUE;
+ st->internal->info->last_dts = AV_NOPTS_VALUE;
#endif
- st->info->fps_first_dts = AV_NOPTS_VALUE;
- st->info->fps_last_dts = AV_NOPTS_VALUE;
+ st->internal->info->fps_first_dts = AV_NOPTS_VALUE;
+ st->internal->info->fps_last_dts = AV_NOPTS_VALUE;
- st->inject_global_side_data = s->internal->inject_global_side_data;
+ st->internal->inject_global_side_data = s->internal->inject_global_side_data;
st->internal->need_context_update = 1;
dynarray_add(&ac->programs, &ac->nb_programs, program);
program->discard = AVDISCARD_NONE;
program->pmt_version = -1;
+ program->id = id;
+ program->pts_wrap_reference = AV_NOPTS_VALUE;
+ program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
+ program->start_time =
+ program->end_time = AV_NOPTS_VALUE;
}
- program->id = id;
- program->pts_wrap_reference = AV_NOPTS_VALUE;
- program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
-
- program->start_time =
- program->end_time = AV_NOPTS_VALUE;
-
return program;
}
return NULL;
}
- for (i = 0; i < s->nb_chapters; i++)
- if (s->chapters[i]->id == id)
- chapter = s->chapters[i];
+ if (!s->nb_chapters) {
+ s->internal->chapter_ids_monotonic = 1;
+ } else if (!s->internal->chapter_ids_monotonic || s->chapters[s->nb_chapters-1]->id >= id) {
+ s->internal->chapter_ids_monotonic = 0;
+ for (i = 0; i < s->nb_chapters; i++)
+ if (s->chapters[i]->id == id)
+ chapter = s->chapters[i];
+ }
if (!chapter) {
chapter = av_mallocz(sizeof(AVChapter));
if (c == '%') {
do {
nd = 0;
- while (av_isdigit(*p))
+ while (av_isdigit(*p)) {
+ if (nd >= INT_MAX / 10 - 255)
+ goto fail;
nd = nd * 10 + *p++ - '0';
+ }
c = *p++;
} while (av_isdigit(c));
char *hostname, int hostname_size,
int *port_ptr, char *path, int path_size, const char *url)
{
- const char *p, *ls, *ls2, *at, *at2, *col, *brk;
+ const char *p, *ls, *at, *at2, *col, *brk;
if (port_ptr)
*port_ptr = -1;
}
/* separate path from hostname */
- ls = strchr(p, '/');
- ls2 = strchr(p, '?');
- if (!ls)
- ls = ls2;
- else if (ls && ls2)
- ls = FFMIN(ls, ls2);
- if (ls)
- av_strlcpy(path, ls, path_size);
- else
- ls = &p[strlen(p)]; // XXX
+ ls = p + strcspn(p, "/?#");
+ av_strlcpy(path, ls, path_size);
/* the rest is hostname, use that to parse auth/port */
if (ls != p) {
};
const uint8_t *data = NULL;
- int size = 0;
+ int ret, size = 0;
if (st->codecpar->width == 1920) {
if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
if (!size)
return 0;
- av_freep(&st->codecpar->extradata);
- if (ff_alloc_extradata(st->codecpar, size))
- return AVERROR(ENOMEM);
+ if ((ret = ff_alloc_extradata(st->codecpar, size)) < 0)
+ return ret;
memcpy(st->codecpar->extradata, data, size);
return 0;
}
uint8_t *av_stream_get_side_data(const AVStream *st,
- enum AVPacketSideDataType type, int *size)
+ enum AVPacketSideDataType type, buffer_size_t *size)
{
int i;
return st->side_data[i].data;
}
}
+ if (size)
+ *size = 0;
return NULL;
}
}
uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
- int size)
+ buffer_size_t size)
{
int ret;
uint8_t *data = av_malloc(size);
int ret;
const AVBitStreamFilter *bsf;
AVBSFContext *bsfc;
- AVCodecParameters *in_par;
+
+ av_assert0(!st->internal->bsfc);
if (!(bsf = av_bsf_get_by_name(name))) {
av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
return ret;
- if (st->internal->nb_bsfcs) {
- in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
- bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
- } else {
- in_par = st->codecpar;
- bsfc->time_base_in = st->time_base;
- }
-
- if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
+ bsfc->time_base_in = st->time_base;
+ if ((ret = avcodec_parameters_copy(bsfc->par_in, st->codecpar)) < 0) {
av_bsf_free(&bsfc);
return ret;
}
return ret;
}
- if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
- av_bsf_free(&bsfc);
- return ret;
- }
+ st->internal->bsfc = bsfc;
av_log(NULL, AV_LOG_VERBOSE,
"Automatically inserted bitstream filter '%s'; args='%s'\n",
int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
{
uint8_t *side_data;
- int size;
+ buffer_size_t size;
side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
if (side_data) {
enum AVTimebaseSource copy_tb)
{
//TODO: use [io]st->internal->avctx
- const AVCodecContext *dec_ctx = ist->codec;
- AVCodecContext *enc_ctx = ost->codec;
+ const AVCodecContext *dec_ctx;
+ AVCodecContext *enc_ctx;
+
+#if FF_API_LAVF_AVCTX
+FF_DISABLE_DEPRECATION_WARNINGS
+ dec_ctx = ist->codec;
+ enc_ctx = ost->codec;
+FF_ENABLE_DEPRECATION_WARNINGS
+#else
+ dec_ctx = ist->internal->avctx;
+ enc_ctx = ost->internal->avctx;
+#endif
enc_ctx->time_base = ist->time_base;
/*