/*
- * MPEG1/2 muxer
+ * MPEG-1/2 muxer
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
*
* This file is part of Libav.
int64_t dts;
int size;
int unwritten_size;
- int flags;
struct PacketDesc *next;
} PacketDesc;
-typedef struct {
+typedef struct StreamInfo {
AVFifoBuffer *fifo;
uint8_t id;
int max_buffer_size; /* in bytes */
int64_t vobu_start_pts;
} StreamInfo;
-typedef struct {
+typedef struct MpegMuxContext {
const AVClass *class;
int packet_size; /* required packet size */
int packet_number;
put_bits(&pb, 1, 1);
} else {
put_bits(&pb, 1, 0); /* variable bitrate */
- put_bits(&pb, 1, 0); /* non constrainted bit stream */
+ put_bits(&pb, 1, 0); /* nonconstrained bitstream */
}
if (s->is_vcd || s->is_dvd) {
lpcm_id = LPCM_ID;
for (i = 0; i < ctx->nb_streams; i++) {
+ AVCPBProperties *props;
+
st = ctx->streams[i];
stream = av_mallocz(sizeof(StreamInfo));
if (!stream)
avpriv_set_pts_info(st, 64, 1, 90000);
- switch (st->codec->codec_type) {
+ switch (st->codecpar->codec_type) {
case AVMEDIA_TYPE_AUDIO:
- if (st->codec->codec_id == AV_CODEC_ID_AC3) {
+ if (st->codecpar->codec_id == AV_CODEC_ID_AC3) {
stream->id = ac3_id++;
- } else if (st->codec->codec_id == AV_CODEC_ID_DTS) {
+ } else if (st->codecpar->codec_id == AV_CODEC_ID_DTS) {
stream->id = dts_id++;
- } else if (st->codec->codec_id == AV_CODEC_ID_PCM_S16BE) {
+ } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE) {
stream->id = lpcm_id++;
for (j = 0; j < 4; j++) {
- if (lpcm_freq_tab[j] == st->codec->sample_rate)
+ if (lpcm_freq_tab[j] == st->codecpar->sample_rate)
break;
}
if (j == 4)
goto fail;
- if (st->codec->channels > 8)
+ if (st->codecpar->channels > 8)
return -1;
stream->lpcm_header[0] = 0x0c;
- stream->lpcm_header[1] = (st->codec->channels - 1) | (j << 4);
+ stream->lpcm_header[1] = (st->codecpar->channels - 1) | (j << 4);
stream->lpcm_header[2] = 0x80;
- stream->lpcm_align = st->codec->channels * 2;
+ stream->lpcm_align = st->codecpar->channels * 2;
} else {
stream->id = mpa_id++;
}
s->audio_bound++;
break;
case AVMEDIA_TYPE_VIDEO:
- if (st->codec->codec_id == AV_CODEC_ID_H264)
+ if (st->codecpar->codec_id == AV_CODEC_ID_H264)
stream->id = h264_id++;
else
stream->id = mpv_id++;
- if (st->codec->rc_buffer_size)
- stream->max_buffer_size = 6 * 1024 + st->codec->rc_buffer_size / 8;
+
+ props = (AVCPBProperties*)av_stream_get_side_data(st, AV_PKT_DATA_CPB_PROPERTIES, NULL);
+ if (props && props->buffer_size)
+ stream->max_buffer_size = 6 * 1024 + props->buffer_size / 8;
else {
av_log(ctx, AV_LOG_WARNING,
"VBV buffer size not set, muxing may fail\n");
audio_bitrate = 0;
video_bitrate = 0;
for (i = 0; i < ctx->nb_streams; i++) {
+ AVCPBProperties *props;
int codec_rate;
st = ctx->streams[i];
stream = (StreamInfo *)st->priv_data;
- if (st->codec->rc_max_rate ||
- st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
- codec_rate = st->codec->rc_max_rate;
+ props = (AVCPBProperties*)av_stream_get_side_data(st, AV_PKT_DATA_CPB_PROPERTIES, NULL);
+ if (props)
+ codec_rate = props->max_bitrate;
else
- codec_rate = st->codec->bit_rate;
+ codec_rate = st->codecpar->bit_rate;
if (!codec_rate)
codec_rate = (1 << 21) * 8 * 50 / ctx->nb_streams;
if ((stream->id & 0xe0) == AUDIO_ID)
audio_bitrate += codec_rate;
- else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
+ else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
video_bitrate += codec_rate;
}
id = stream->id;
- av_dlog(ctx, "packet ID=%2x PTS=%0.3f\n", id, pts / 90000.0);
+ av_log(ctx, AV_LOG_TRACE, "packet ID=%2x PTS=%0.3f\n", id, pts / 90000.0);
buf_ptr = buffer;
/* for subtitle, a single PES packet must be generated,
* so we flush after every single subtitle packet */
if (s->packet_size > avail_data && !flush
- && st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE)
+ && st->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)
return 0;
if (avail_data == 0)
continue;
best_dts = pkt_desc->dts;
}
- av_dlog(ctx, "bumping scr, scr:%f, dts:%f\n",
+ av_log(ctx, AV_LOG_TRACE, "bumping scr, scr:%f, dts:%f\n",
scr / 90000.0, best_dts / 90000.0);
if (best_dts == INT64_MAX)
return 0;
}
if (timestamp_packet) {
- av_dlog(ctx, "dts:%f pts:%f scr:%f stream:%d\n",
+ av_log(ctx, AV_LOG_TRACE, "dts:%f pts:%f scr:%f stream:%d\n",
timestamp_packet->dts / 90000.0,
timestamp_packet->pts / 90000.0,
scr / 90000.0, best_i);
int64_t pts, dts;
PacketDesc *pkt_desc;
int preload;
- const int is_iframe = st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
+ const int is_iframe = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
(pkt->flags & AV_PKT_FLAG_KEY);
preload = av_rescale(s->preload, 90000, AV_TIME_BASE);
dts += 2 * preload;
}
- av_dlog(ctx, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n",
+ av_log(ctx, AV_LOG_TRACE, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n",
dts / 90000.0, pts / 90000.0, pkt->flags,
pkt->stream_index, pts != AV_NOPTS_VALUE);
if (!stream->premux_packet)
break;
}
- /* End header according to MPEG1 systems standard. We do not write
+ /* End header according to MPEG-1 systems standard. We do not write
* it as it is usually not needed by decoders and because it
* complicates MPEG stream concatenation. */
// avio_wb32(ctx->pb, ISO_11172_END_CODE);