summaryrefslogtreecommitdiff
path: root/libavformat/mpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavformat/mpeg.c')
-rw-r--r--libavformat/mpeg.c174
1 files changed, 87 insertions, 87 deletions
diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c
index 1e4d2a79f1..4bebdba6fa 100644
--- a/libavformat/mpeg.c
+++ b/libavformat/mpeg.c
@@ -77,7 +77,7 @@ typedef struct {
#define PACKET_START_CODE_MASK ((unsigned int)0xffffff00)
#define PACKET_START_CODE_PREFIX ((unsigned int)0x00000100)
#define ISO_11172_END_CODE ((unsigned int)0x000001b9)
-
+
/* mpeg2 */
#define PROGRAM_STREAM_MAP 0x1bc
#define PRIVATE_STREAM_1 0x1bd
@@ -114,12 +114,12 @@ static AVOutputFormat mpeg2vob_mux;
static AVOutputFormat mpeg2svcd_mux;
static AVOutputFormat mpeg2dvd_mux;
-static int put_pack_header(AVFormatContext *ctx,
+static int put_pack_header(AVFormatContext *ctx,
uint8_t *buf, int64_t timestamp)
{
MpegMuxContext *s = ctx->priv_data;
PutBitContext pb;
-
+
init_put_bits(&pb, buf, 128);
put_bits(&pb, 32, PACK_START_CODE);
@@ -161,7 +161,7 @@ static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_str
put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
put_bits(&pb, 16, 0);
put_bits(&pb, 1, 1);
-
+
put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
put_bits(&pb, 1, 1); /* marker */
if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
@@ -172,13 +172,13 @@ static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_str
if (s->is_vcd) {
/* see VCD standard, p. IV-7*/
- put_bits(&pb, 1, 0);
+ put_bits(&pb, 1, 0);
put_bits(&pb, 1, 1);
} else {
put_bits(&pb, 1, 0); /* variable bitrate*/
put_bits(&pb, 1, 0); /* non constrainted bit stream */
}
-
+
if (s->is_vcd || s->is_dvd) {
/* see VCD standard p IV-7 */
put_bits(&pb, 1, 1); /* audio locked */
@@ -195,24 +195,24 @@ static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_str
put_bits(&pb, 5, 0);
} else
put_bits(&pb, 5, s->video_bound);
-
+
if (s->is_dvd) {
put_bits(&pb, 1, 0); /* packet_rate_restriction_flag */
put_bits(&pb, 7, 0x7f); /* reserved byte */
} else
put_bits(&pb, 8, 0xff); /* reserved byte */
-
+
/* DVD-Video Stream_bound entries
- id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
- id (0xB8) audio, maximum P-STD for any MPEG audio (0xC0 to 0xC7) streams. If there are none set to 4096 (32x128). (P-STD_buffer_bound_scale = 0)
- id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
+ id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
+ id (0xB8) audio, maximum P-STD for any MPEG audio (0xC0 to 0xC7) streams. If there are none set to 4096 (32x128). (P-STD_buffer_bound_scale = 0)
+ id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
id (0xBF) private stream 2, NAV packs, set to 2x1024. */
if (s->is_dvd) {
-
+
int P_STD_max_video = 0;
int P_STD_max_mpeg_audio = 0;
int P_STD_max_mpeg_PS1 = 0;
-
+
for(i=0;i<ctx->nb_streams;i++) {
StreamInfo *stream = ctx->streams[i]->priv_data;
@@ -257,7 +257,7 @@ static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_str
private_stream_coded = 0;
for(i=0;i<ctx->nb_streams;i++) {
StreamInfo *stream = ctx->streams[i]->priv_data;
-
+
/* For VCDs, only include the stream info for the stream
that the pack which contains this system belongs to.
@@ -334,15 +334,15 @@ static int mpeg_mux_init(AVFormatContext *ctx)
s->is_svcd = (ctx->oformat == &mpeg2svcd_mux);
s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux || ctx->oformat == &mpeg2dvd_mux);
s->is_dvd = (ctx->oformat == &mpeg2dvd_mux);
-
+
if(ctx->packet_size)
s->packet_size = ctx->packet_size;
else
s->packet_size = 2048;
-
+
s->vcd_padding_bytes_written = 0;
s->vcd_padding_bitrate=0;
-
+
s->audio_bound = 0;
s->video_bound = 0;
mpa_id = AUDIO_ID;
@@ -386,7 +386,7 @@ static int mpeg_mux_init(AVFormatContext *ctx)
/* This value HAS to be used for VCD (see VCD standard, p. IV-7).
Right now it is also used for everything else.*/
- stream->max_buffer_size = 4 * 1024;
+ stream->max_buffer_size = 4 * 1024;
s->audio_bound++;
break;
case CODEC_TYPE_VIDEO:
@@ -397,11 +397,11 @@ static int mpeg_mux_init(AVFormatContext *ctx)
stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
#if 0
/* see VCD standard, p. IV-7*/
- stream->max_buffer_size = 46 * 1024;
+ stream->max_buffer_size = 46 * 1024;
else
/* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2).
Right now it is also used for everything else.*/
- stream->max_buffer_size = 230 * 1024;
+ stream->max_buffer_size = 230 * 1024;
#endif
s->video_bound++;
break;
@@ -426,10 +426,10 @@ static int mpeg_mux_init(AVFormatContext *ctx)
codec_rate= st->codec->rc_max_rate;
else
codec_rate= st->codec->bit_rate;
-
+
if(!codec_rate)
codec_rate= (1<<21)*8*50/ctx->nb_streams;
-
+
bitrate += codec_rate;
if (stream->id==AUDIO_ID)
@@ -437,7 +437,7 @@ static int mpeg_mux_init(AVFormatContext *ctx)
else if (stream->id==VIDEO_ID)
video_bitrate += codec_rate;
}
-
+
if(ctx->mux_rate){
s->mux_rate= (ctx->mux_rate + (8 * 50) - 1) / (8 * 50);
} else {
@@ -472,11 +472,11 @@ static int mpeg_mux_init(AVFormatContext *ctx)
overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
overhead_rate *= 8;
-
+
/* Add padding so that the full bitrate is 2324*75 bytes/sec */
s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
}
-
+
if (s->is_vcd || s->is_mpeg2)
/* every packet */
s->pack_header_freq = 1;
@@ -487,7 +487,7 @@ static int mpeg_mux_init(AVFormatContext *ctx)
/* the above seems to make pack_header_freq zero sometimes */
if (s->pack_header_freq == 0)
s->pack_header_freq = 1;
-
+
if (s->is_mpeg2)
/* every 200 packets. Need to look at the spec. */
s->system_header_freq = s->pack_header_freq * 40;
@@ -498,7 +498,7 @@ static int mpeg_mux_init(AVFormatContext *ctx)
s->system_header_freq = 0x7fffffff;
else
s->system_header_freq = s->pack_header_freq * 5;
-
+
for(i=0;i<ctx->nb_streams;i++) {
stream = ctx->streams[i]->priv_data;
stream->packet_number = 0;
@@ -515,9 +515,9 @@ static int mpeg_mux_init(AVFormatContext *ctx)
static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp)
{
- put_byte(pb,
- (id << 4) |
- (((timestamp >> 30) & 0x07) << 1) |
+ put_byte(pb,
+ (id << 4) |
+ (((timestamp >> 30) & 0x07) << 1) |
1);
put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
@@ -534,7 +534,7 @@ static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
{
int64_t full_pad_bytes;
-
+
full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);
@@ -564,22 +564,22 @@ static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
buf_index = 0;
if (((s->packet_number % s->pack_header_freq) == 0)) {
/* pack header size */
- if (s->is_mpeg2)
+ if (s->is_mpeg2)
buf_index += 14;
else
buf_index += 12;
-
+
if (s->is_vcd) {
/* there is exactly one system header for each stream in a VCD MPEG,
One in the very first video packet and one in the very first
audio packet (see VCD standard p. IV-7 and IV-8).*/
-
+
if (stream->packet_number==0)
/* The system headers refer only to the stream they occur in,
so they have a constant size.*/
buf_index += 15;
- } else {
+ } else {
if ((s->packet_number % s->system_header_freq) == 0)
buf_index += s->system_header_size;
}
@@ -588,7 +588,7 @@ static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
if ((s->is_vcd && stream->packet_number==0)
|| (s->is_svcd && s->packet_number==0))
/* the first pack of each stream contains only the pack header,
- the system header and some padding (see VCD standard p. IV-6)
+ the system header and some padding (see VCD standard p. IV-6)
Add the padding size, so that the actual payload becomes 0.*/
buf_index += s->packet_size - buf_index;
else {
@@ -610,7 +610,7 @@ static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
if (!s->is_mpeg2)
buf_index++;
}
-
+
if (stream->id < 0xc0) {
/* AC3/LPCM private data header */
buf_index += 4;
@@ -630,7 +630,7 @@ static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
each audio packet (see standard p. IV-8).*/
buf_index+=20;
}
- return s->packet_size - buf_index;
+ return s->packet_size - buf_index;
}
#endif
@@ -639,7 +639,7 @@ static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packe
{
MpegMuxContext *s = ctx->priv_data;
int i;
-
+
put_be32(pb, PADDING_STREAM);
put_be16(pb, packet_bytes - 6);
if (!s->is_mpeg2) {
@@ -656,7 +656,7 @@ static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
int nb_frames=0;
PacketDesc *pkt_desc= stream->premux_packet;
- while(len>0){
+ while(len>0){
if(pkt_desc->size == pkt_desc->unwritten_size)
nb_frames++;
len -= pkt_desc->unwritten_size;
@@ -667,7 +667,7 @@ static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
}
/* flush the packet on stream stream_index */
-static int flush_packet(AVFormatContext *ctx, int stream_index,
+static int flush_packet(AVFormatContext *ctx, int stream_index,
int64_t pts, int64_t dts, int64_t scr, int trailer_size)
{
MpegMuxContext *s = ctx->priv_data;
@@ -681,11 +681,11 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
int pes_flags;
int general_pack = 0; /*"general" pack without data specific to one stream?*/
int nb_frames;
-
+
id = stream->id;
-
+
#if 0
- printf("packet ID=%2x PTS=%0.3f\n",
+ printf("packet ID=%2x PTS=%0.3f\n",
id, pts / 90000.0);
#endif
@@ -701,7 +701,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
/* there is exactly one system header for each stream in a VCD MPEG,
One in the very first video packet and one in the very first
audio packet (see VCD standard p. IV-7 and IV-8).*/
-
+
if (stream->packet_number==0) {
size = put_system_header(ctx, buf_ptr, id);
buf_ptr += size;
@@ -771,7 +771,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
/* The VCD standard demands that 20 zero bytes follow
each audio pack (see standard p. IV-8).*/
zero_trail_bytes += 20;
-
+
if ((s->is_vcd && stream->packet_number==0)
|| (s->is_svcd && s->packet_number==0)) {
/* for VCD the first pack of each stream contains only the pack header,
@@ -791,7 +791,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
/* packet header size */
packet_size -= 6;
-
+
/* packet header */
if (s->is_mpeg2) {
header_len = 3;
@@ -829,7 +829,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
// first byte doesnt fit -> reset pts/dts + stuffing
if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
int timestamp_len=0;
- if(dts != pts)
+ if(dts != pts)
timestamp_len += 5;
if(pts != AV_NOPTS_VALUE)
timestamp_len += s->is_mpeg2 ? 5 : 4;
@@ -865,13 +865,13 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
payload_size -= stuffing_size;
stuffing_size = 0;
}
-
+
nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
put_be32(&ctx->pb, startcode);
put_be16(&ctx->pb, packet_size);
-
+
if (!s->is_mpeg2)
for(i=0;i<stuffing_size;i++)
put_byte(&ctx->pb, 0xff);
@@ -901,11 +901,11 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
put_timestamp(&ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
if (pes_flags & 0x40) /*write dts*/
put_timestamp(&ctx->pb, 0x01, dts);
-
+
if (pes_flags & 0x01) { /*write pes extension*/
put_byte(&ctx->pb, 0x10); /* flags */
- /* P-STD buffer info */
+ /* P-STD buffer info */
if (id == AUDIO_ID)
put_be16(&ctx->pb, 0x4000 | stream->max_buffer_size/128);
else
@@ -959,13 +959,13 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
}
if (pad_packet_bytes > 0)
- put_padding_packet(ctx,&ctx->pb, pad_packet_bytes);
+ put_padding_packet(ctx,&ctx->pb, pad_packet_bytes);
for(i=0;i<zero_trail_bytes;i++)
put_byte(&ctx->pb, 0x00);
-
+
put_flush_packet(&ctx->pb);
-
+
s->packet_number++;
/* only increase the stream packet number if this pack actually contains
@@ -973,7 +973,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
or some data.*/
if (!general_pack)
stream->packet_number++;
-
+
return payload_size - stuffing_size;
}
@@ -992,9 +992,9 @@ static void put_vcd_padding_sector(AVFormatContext *ctx)
put_byte(&ctx->pb, 0);
s->vcd_padding_bytes_written += s->packet_size;
-
+
put_flush_packet(&ctx->pb);
-
+
/* increasing the packet number is correct. The SCR of the following packs
is calculated from the packet_number and it has to include the padding
sector (it represents the sector index, not the MPEG pack index)
@@ -1021,7 +1021,7 @@ static int64_t get_vcd_scr(AVFormatContext *ctx,int stream_index,int64_t pts)
scr = 36000 + s->packet_number * 1200;
return scr;
-}
+}
#endif
static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
@@ -1032,9 +1032,9 @@ static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
AVStream *st = ctx->streams[i];
StreamInfo *stream = st->priv_data;
PacketDesc *pkt_desc= stream->predecode_packet;
-
+
while(pkt_desc && scr > pkt_desc->dts){ //FIXME > vs >=
- if(stream->buffer_index < pkt_desc->size ||
+ if(stream->buffer_index < pkt_desc->size ||
stream->predecode_packet == stream->premux_packet){
av_log(ctx, AV_LOG_ERROR, "buffer underflow\n");
break;
@@ -1045,7 +1045,7 @@ static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
av_freep(&pkt_desc);
}
}
-
+
return 0;
}
@@ -1081,17 +1081,17 @@ retry:
if(space < s->packet_size && !ignore_constraints)
continue;
-
+
if(next_pkt && next_pkt->dts - scr > max_delay)
continue;
-
+
if(rel_space > best_score){
best_score= rel_space;
best_i = i;
avail_space= space;
}
}
-
+
if(best_i < 0){
int64_t best_dts= INT64_MAX;
@@ -1104,7 +1104,7 @@ retry:
}
#if 0
- av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n",
+ av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n",
scr/90000.0, best_dts/90000.0);
#endif
if(best_dts == INT64_MAX)
@@ -1121,14 +1121,14 @@ retry:
}
assert(best_i >= 0);
-
+
st = ctx->streams[best_i];
stream = st->priv_data;
-
+
assert(fifo_size(&stream->fifo, stream->fifo.rptr) > 0);
assert(avail_space >= s->packet_size || ignore_constraints);
-
+
timestamp_packet= stream->premux_packet;
if(timestamp_packet->unwritten_size == timestamp_packet->size){
trailer_size= 0;
@@ -1155,17 +1155,17 @@ retry:
s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
}
}
-
+
stream->buffer_index += es_size;
s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
-
+
while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
es_size -= stream->premux_packet->unwritten_size;
stream->premux_packet= stream->premux_packet->next;
}
if(es_size)
stream->premux_packet->unwritten_size -= es_size;
-
+
if(remove_decoded_packets(ctx, s->last_scr) < 0)
return -1;
@@ -1184,7 +1184,7 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
PacketDesc *pkt_desc;
const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
const int is_iframe = st->codec->codec_type == CODEC_TYPE_VIDEO && (pkt->flags & PKT_FLAG_KEY);
-
+
pts= pkt->pts;
dts= pkt->dts;
@@ -1220,7 +1220,7 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
for(;;){
int ret= output_packet(ctx, 0);
- if(ret<=0)
+ if(ret<=0)
return ret;
}
}
@@ -1230,10 +1230,10 @@ static int mpeg_mux_end(AVFormatContext *ctx)
// MpegMuxContext *s = ctx->priv_data;
StreamInfo *stream;
int i;
-
+
for(;;){
int ret= output_packet(ctx, 1);
- if(ret<0)
+ if(ret<0)
return ret;
else if(ret==0)
break;
@@ -1323,7 +1323,7 @@ static int64_t get_pts(ByteIOContext *pb, int c)
return pts;
}
-static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
+static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
uint32_t *header_state)
{
unsigned int state, v;
@@ -1388,7 +1388,7 @@ static int find_prev_start_code(ByteIOContext *pb, int *size_ptr)
/**
* Extracts stream types from a program stream map
* According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
- *
+ *
* @return number of bytes occupied by PSM in the bitstream
*/
static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb)
@@ -1419,11 +1419,11 @@ static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb)
return 2 + psm_length;
}
-/* read the next PES header. Return its position in ppos
+/* read the next PES header. Return its position in ppos
(if not NULL), and its start code, pts and dts.
*/
static int mpegps_read_pes_header(AVFormatContext *s,
- int64_t *ppos, int *pstart_code,
+ int64_t *ppos, int *pstart_code,
int64_t *ppts, int64_t *pdts)
{
MpegDemuxContext *m = s->priv_data;
@@ -1454,7 +1454,7 @@ static int mpegps_read_pes_header(AVFormatContext *s,
mpegps_psm_parse(m, &s->pb);
goto redo;
}
-
+
/* find matching stream */
if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
(startcode >= 0x1e0 && startcode <= 0x1ef) ||
@@ -1473,7 +1473,7 @@ static int mpegps_read_pes_header(AVFormatContext *s,
c = get_byte(&s->pb);
len--;
/* XXX: for mpeg1, should test only bit 7 */
- if (c != 0xff)
+ if (c != 0xff)
break;
}
if ((c & 0xc0) == 0x40) {
@@ -1552,7 +1552,7 @@ static int mpegps_read_pes_header(AVFormatContext *s,
}
}
}
-
+
*pstart_code = startcode;
*ppts = pts;
*pdts = dts;
@@ -1571,7 +1571,7 @@ static int mpegps_read_packet(AVFormatContext *s,
len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
if (len < 0)
return len;
-
+
/* now find stream */
for(i=0;i<s->nb_streams;i++) {
st = s->streams[i];
@@ -1632,7 +1632,7 @@ static int mpegps_read_packet(AVFormatContext *s,
}
/* no stream found: add a new stream */
st = av_new_stream(s, startcode);
- if (!st)
+ if (!st)
goto skip;
st->codec->codec_type = type;
st->codec->codec_id = codec_id;
@@ -1675,7 +1675,7 @@ static int mpegps_read_close(AVFormatContext *s)
return 0;
}
-static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
+static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
int64_t *ppos, int64_t pos_limit)
{
int len, startcode;
@@ -1694,7 +1694,7 @@ static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
#endif
return AV_NOPTS_VALUE;
}
- if (startcode == s->streams[stream_index]->id &&
+ if (startcode == s->streams[stream_index]->id &&
dts != AV_NOPTS_VALUE) {
break;
}