X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmpegenc.c;h=a471b38bb9e00d18a3dcbad1c31abbc4263a7a24;hb=cbd3441eec2c2cf02d70c143e1625ccc2dc4c5e9;hp=0a740af69863701836de5c3ed2b4722d42f96c30;hpb=406792e7b0f15627411728829c7a2de86fcbe96b;p=ffmpeg diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c index 0a740af6986..a471b38bb9e 100644 --- a/libavformat/mpegenc.c +++ b/libavformat/mpegenc.c @@ -20,7 +20,7 @@ */ #include "libavutil/fifo.h" -#include "libavcodec/bitstream.h" +#include "libavcodec/put_bits.h" #include "avformat.h" #include "mpeg.h" @@ -40,7 +40,7 @@ typedef struct PacketDesc { } PacketDesc; typedef struct { - AVFifoBuffer fifo; + AVFifoBuffer *fifo; uint8_t id; int max_buffer_size; /* in bytes */ int buffer_index; @@ -89,7 +89,7 @@ static int put_pack_header(AVFormatContext *ctx, init_put_bits(&pb, buf, 128); - put_bits(&pb, 32, PACK_START_CODE); + put_bits32(&pb, PACK_START_CODE); if (s->is_mpeg2) { put_bits(&pb, 2, 0x1); } else { @@ -114,7 +114,7 @@ static int put_pack_header(AVFormatContext *ctx, put_bits(&pb, 3, 0); /* stuffing length */ } flush_put_bits(&pb); - return pbBufPtr(&pb) - pb.buf; + return put_bits_ptr(&pb) - pb.buf; } static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id) @@ -125,7 +125,7 @@ static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_str init_put_bits(&pb, buf, 128); - put_bits(&pb, 32, SYSTEM_HEADER_START_CODE); + put_bits32(&pb, SYSTEM_HEADER_START_CODE); put_bits(&pb, 16, 0); put_bits(&pb, 1, 1); @@ -157,7 +157,7 @@ static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_str put_bits(&pb, 1, 1); /* marker */ - if (s->is_vcd && only_for_stream_id==AUDIO_ID) { + if (s->is_vcd && (only_for_stream_id & 0xe0) == AUDIO_ID) { /* This header applies only to the audio stream (see VCD standard p. IV-7)*/ put_bits(&pb, 5, 0); } else @@ -256,7 +256,7 @@ static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_str } flush_put_bits(&pb); - size = pbBufPtr(&pb) - pb.buf; + size = put_bits_ptr(&pb) - pb.buf; /* patch packet size */ buf[4] = (size - 6) >> 8; buf[5] = (size - 6) & 0xff; @@ -304,9 +304,14 @@ static int mpeg_mux_init(AVFormatContext *ctx) (CONFIG_MPEG2SVCD_MUXER && ctx->oformat == &mpeg2svcd_muxer)); s->is_dvd = (CONFIG_MPEG2DVD_MUXER && ctx->oformat == &mpeg2dvd_muxer); - if(ctx->packet_size) + if(ctx->packet_size) { + if (ctx->packet_size < 20 || ctx->packet_size > (1 << 23) + 10) { + av_log(ctx, AV_LOG_ERROR, "Invalid packet size %d\n", + ctx->packet_size); + goto fail; + } s->packet_size = ctx->packet_size; - else + } else s->packet_size = 2048; s->vcd_padding_bytes_written = 0; @@ -381,7 +386,9 @@ static int mpeg_mux_init(AVFormatContext *ctx) default: return -1; } - av_fifo_init(&stream->fifo, 16); + stream->fifo= av_fifo_alloc(16); + if (!stream->fifo) + goto fail; } bitrate = 0; audio_bitrate = 0; @@ -401,7 +408,7 @@ static int mpeg_mux_init(AVFormatContext *ctx) bitrate += codec_rate; - if (stream->id==AUDIO_ID) + if ((stream->id & 0xe0) == AUDIO_ID) audio_bitrate += codec_rate; else if (stream->id==VIDEO_ID) video_bitrate += codec_rate; @@ -594,7 +601,7 @@ static int get_packet_payload_size(AVFormatContext *ctx, int stream_index, } } - if (s->is_vcd && stream->id == AUDIO_ID) + if (s->is_vcd && (stream->id & 0xe0) == AUDIO_ID) /* The VCD standard demands that 20 zero bytes follow each audio packet (see standard p. IV-8).*/ buf_index+=20; @@ -729,7 +736,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index, packet_size = s->packet_size - size; - if (s->is_vcd && id == AUDIO_ID) + if (s->is_vcd && (id & 0xe0) == AUDIO_ID) /* The VCD standard demands that 20 zero bytes follow each audio pack (see standard p. IV-8).*/ zero_trail_bytes += 20; @@ -786,7 +793,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index, startcode = 0x100 + id; } - stuffing_size = payload_size - av_fifo_size(&stream->fifo); + stuffing_size = payload_size - av_fifo_size(stream->fifo); // first byte does not fit -> reset pts/dts + stuffing if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){ @@ -868,7 +875,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index, put_byte(ctx->pb, 0x10); /* flags */ /* P-STD buffer info */ - if (id == AUDIO_ID) + if ((id & 0xe0) == AUDIO_ID) put_be16(ctx->pb, 0x4000 | stream->max_buffer_size/ 128); else put_be16(ctx->pb, 0x6000 | stream->max_buffer_size/1024); @@ -913,8 +920,8 @@ static int flush_packet(AVFormatContext *ctx, int stream_index, } /* output data */ - assert(payload_size - stuffing_size <= av_fifo_size(&stream->fifo)); - av_fifo_generic_read(&stream->fifo, payload_size - stuffing_size, &put_buffer, ctx->pb); + assert(payload_size - stuffing_size <= av_fifo_size(stream->fifo)); + av_fifo_generic_read(stream->fifo, ctx->pb, payload_size - stuffing_size, &put_buffer); stream->bytes_to_iframe -= payload_size - stuffing_size; }else{ payload_size= @@ -1031,7 +1038,7 @@ retry: for(i=0; inb_streams; i++){ AVStream *st = ctx->streams[i]; StreamInfo *stream = st->priv_data; - const int avail_data= av_fifo_size(&stream->fifo); + const int avail_data= av_fifo_size(stream->fifo); const int space= stream->max_buffer_size - stream->buffer_index; int rel_space= 1024*space / stream->max_buffer_size; PacketDesc *next_pkt= stream->premux_packet; @@ -1091,7 +1098,7 @@ retry: st = ctx->streams[best_i]; stream = st->priv_data; - assert(av_fifo_size(&stream->fifo) > 0); + assert(av_fifo_size(stream->fifo) > 0); assert(avail_space >= s->packet_size || ignore_constraints); @@ -1107,7 +1114,7 @@ retry: //av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f scr:%f stream:%d\n", timestamp_packet->dts/90000.0, timestamp_packet->pts/90000.0, scr/90000.0, best_i); es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size); }else{ - assert(av_fifo_size(&stream->fifo) == trailer_size); + assert(av_fifo_size(stream->fifo) == trailer_size); es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size); } @@ -1170,18 +1177,18 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt) stream->predecode_packet= pkt_desc; stream->next_packet= &pkt_desc->next; - if (av_fifo_realloc2(&stream->fifo, av_fifo_size(&stream->fifo) + size) < 0) + if (av_fifo_realloc2(stream->fifo, av_fifo_size(stream->fifo) + size) < 0) return -1; if (s->is_dvd){ if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder) - stream->bytes_to_iframe = av_fifo_size(&stream->fifo); + stream->bytes_to_iframe = av_fifo_size(stream->fifo); stream->align_iframe = 1; stream->vobu_start_pts = pts; } } - av_fifo_generic_write(&stream->fifo, buf, size, NULL); + av_fifo_generic_write(stream->fifo, buf, size, NULL); for(;;){ int ret= output_packet(ctx, 0); @@ -1213,8 +1220,8 @@ static int mpeg_mux_end(AVFormatContext *ctx) for(i=0;inb_streams;i++) { stream = ctx->streams[i]->priv_data; - assert(av_fifo_size(&stream->fifo) == 0); - av_fifo_free(&stream->fifo); + assert(av_fifo_size(stream->fifo) == 0); + av_fifo_free(stream->fifo); } return 0; }