232
232
av_log(s, AV_LOG_WARNING,
233
233
"Codec for stream %d does not use global headers "
234
234
"but container format requires global headers\n", i);
236
if (codec->codec_type != AVMEDIA_TYPE_ATTACHMENT)
237
s->internal->nb_interleaved_streams++;
237
240
if (!s->priv_data && of->priv_data_size > 0) {
435
static int check_packet(AVFormatContext *s, AVPacket *pkt)
440
if (pkt->stream_index < 0 || pkt->stream_index >= s->nb_streams) {
441
av_log(s, AV_LOG_ERROR, "Invalid packet stream index: %d\n",
443
return AVERROR(EINVAL);
446
if (s->streams[pkt->stream_index]->codec->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
447
av_log(s, AV_LOG_ERROR, "Received a packet for an attachment stream.\n");
448
return AVERROR(EINVAL);
432
454
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
458
ret = check_packet(s, pkt);
437
463
if (s->oformat->flags & AVFMT_ALLOW_FLUSH)
438
464
return s->oformat->write_packet(s, pkt);
515
541
ff_interleave_add_packet(s, pkt, interleave_compare_dts);
518
for (i = 0; i < s->nb_streams; i++)
519
stream_count += !!s->streams[i]->last_in_packet_buffer;
521
if (stream_count && (s->nb_streams == stream_count || flush)) {
544
if (s->max_interleave_delta > 0 && s->packet_buffer && !flush) {
545
AVPacket *top_pkt = &s->packet_buffer->pkt;
546
int64_t delta_dts = INT64_MIN;
547
int64_t top_dts = av_rescale_q(top_pkt->dts,
548
s->streams[top_pkt->stream_index]->time_base,
551
for (i = 0; i < s->nb_streams; i++) {
553
const AVPacketList *last = s->streams[i]->last_in_packet_buffer;
558
last_dts = av_rescale_q(last->pkt.dts,
559
s->streams[i]->time_base,
561
delta_dts = FFMAX(delta_dts, last_dts - top_dts);
565
if (delta_dts > s->max_interleave_delta) {
566
av_log(s, AV_LOG_DEBUG,
567
"Delay between the first packet and last packet in the "
568
"muxing queue is %"PRId64" > %"PRId64": forcing output\n",
569
delta_dts, s->max_interleave_delta);
573
for (i = 0; i < s->nb_streams; i++)
574
stream_count += !!s->streams[i]->last_in_packet_buffer;
578
if (stream_count && (s->internal->nb_interleaved_streams == stream_count || flush)) {
522
579
pktl = s->packet_buffer;
523
580
*out = pktl->pkt;
561
618
int ret, flush = 0;
620
ret = check_packet(s, pkt);
564
625
AVStream *st = s->streams[pkt->stream_index];
566
627
//FIXME/XXX/HACK drop zero sized packets
567
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size == 0)
628
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size == 0) {
570
633
av_dlog(s, "av_interleaved_write_frame size:%d dts:%" PRId64 " pts:%" PRId64 "\n",
571
634
pkt->size, pkt->dts, pkt->pts);
572
635
if ((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
575
if (pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
576
return AVERROR(EINVAL);
638
if (pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
639
ret = AVERROR(EINVAL);
578
643
av_dlog(s, "av_interleaved_write_frame FLUSH\n");
584
649
int ret = interleave_packet(s, &opkt, pkt, flush);
651
memset(pkt, 0, sizeof(*pkt));
585
655
if (ret <= 0) //FIXME cleanup needed for ret<0 ?