You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-11-23 21:54:53 +02:00
- Added force_pts to av_write_packet() to be able to force PTS, this helps
(and fix) stream copying. By now force_pts it's just honoured by the MPEG muxer. ASF could honour this also, but it should be fixed to use Tickers first. - MPEG audio decoder exports it's frame size in bytes. - Hope this fix the floating point exception found in ffserver. Originally committed as revision 382 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
16
ffmpeg.c
16
ffmpeg.c
@@ -274,7 +274,7 @@ static void do_audio_out(AVFormatContext *s,
|
|||||||
&ost->fifo.rptr) == 0) {
|
&ost->fifo.rptr) == 0) {
|
||||||
ret = avcodec_encode_audio(enc, audio_out, sizeof(audio_out),
|
ret = avcodec_encode_audio(enc, audio_out, sizeof(audio_out),
|
||||||
(short *)audio_buf);
|
(short *)audio_buf);
|
||||||
s->format->write_packet(s, ost->index, audio_out, ret);
|
s->format->write_packet(s, ost->index, audio_out, ret, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* output a pcm frame */
|
/* output a pcm frame */
|
||||||
@@ -291,7 +291,7 @@ static void do_audio_out(AVFormatContext *s,
|
|||||||
}
|
}
|
||||||
ret = avcodec_encode_audio(enc, audio_out, size_out,
|
ret = avcodec_encode_audio(enc, audio_out, size_out,
|
||||||
(short *)buftmp);
|
(short *)buftmp);
|
||||||
s->format->write_packet(s, ost->index, audio_out, ret);
|
s->format->write_packet(s, ost->index, audio_out, ret, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,7 +387,7 @@ static void write_picture(AVFormatContext *s, int index, AVPicture *picture,
|
|||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
s->format->write_packet(s, index, buf, size);
|
s->format->write_packet(s, index, buf, size, 0);
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -484,7 +484,7 @@ static void do_video_out(AVFormatContext *s,
|
|||||||
ret = avcodec_encode_video(enc,
|
ret = avcodec_encode_video(enc,
|
||||||
video_buffer, sizeof(video_buffer),
|
video_buffer, sizeof(video_buffer),
|
||||||
picture);
|
picture);
|
||||||
s->format->write_packet(s, ost->index, video_buffer, ret);
|
s->format->write_packet(s, ost->index, video_buffer, ret, 0);
|
||||||
*frame_size = ret;
|
*frame_size = ret;
|
||||||
} else {
|
} else {
|
||||||
write_picture(s, ost->index, picture, enc->pix_fmt, enc->width, enc->height);
|
write_picture(s, ost->index, picture, enc->pix_fmt, enc->width, enc->height);
|
||||||
@@ -728,6 +728,11 @@ static int av_encode(AVFormatContext **output_files,
|
|||||||
codec->sample_rate == icodec->sample_rate &&
|
codec->sample_rate == icodec->sample_rate &&
|
||||||
codec->channels == icodec->channels) {
|
codec->channels == icodec->channels) {
|
||||||
/* no reencoding */
|
/* no reencoding */
|
||||||
|
/* use the same frame size */
|
||||||
|
codec->frame_size = icodec->frame_size;
|
||||||
|
//codec->frame_size = 8*icodec->sample_rate*icodec->frame_size/
|
||||||
|
// icodec->bit_rate;
|
||||||
|
//fprintf(stderr,"\nFrame size: %d", codec->frame_size);
|
||||||
} else {
|
} else {
|
||||||
if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
|
if (fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -999,7 +1004,8 @@ static int av_encode(AVFormatContext **output_files,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* no reencoding needed : output the packet directly */
|
/* no reencoding needed : output the packet directly */
|
||||||
os->format->write_packet(os, ost->index, data_buf, data_size);
|
/* force the input stream PTS */
|
||||||
|
os->format->write_packet(os, ost->index, data_buf, data_size, pkt.pts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -882,7 +882,7 @@ static int http_prepare_data(HTTPContext *c)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
send_it:
|
send_it:
|
||||||
if (av_write_packet(&c->fmt_ctx, &pkt))
|
if (av_write_packet(&c->fmt_ctx, &pkt, 0))
|
||||||
c->state = HTTPSTATE_SEND_DATA_TRAILER;
|
c->state = HTTPSTATE_SEND_DATA_TRAILER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -524,7 +524,7 @@ static void put_frame(AVFormatContext *s, ASFStream *stream, int timestamp,
|
|||||||
|
|
||||||
|
|
||||||
static int asf_write_packet(AVFormatContext *s, int stream_index,
|
static int asf_write_packet(AVFormatContext *s, int stream_index,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
ASFContext *asf = s->priv_data;
|
ASFContext *asf = s->priv_data;
|
||||||
int timestamp;
|
int timestamp;
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ static int audio_write_header(AVFormatContext *s1)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int audio_write_packet(AVFormatContext *s1, int stream_index,
|
static int audio_write_packet(AVFormatContext *s1, int stream_index,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
AudioData *s = s1->priv_data;
|
AudioData *s = s1->priv_data;
|
||||||
int len, ret;
|
int len, ret;
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ typedef struct AVFormat {
|
|||||||
int (*write_header)(struct AVFormatContext *);
|
int (*write_header)(struct AVFormatContext *);
|
||||||
int (*write_packet)(struct AVFormatContext *,
|
int (*write_packet)(struct AVFormatContext *,
|
||||||
int stream_index,
|
int stream_index,
|
||||||
unsigned char *buf, int size);
|
unsigned char *buf, int size, int force_pts);
|
||||||
int (*write_trailer)(struct AVFormatContext *);
|
int (*write_trailer)(struct AVFormatContext *);
|
||||||
|
|
||||||
/* optional input support */
|
/* optional input support */
|
||||||
@@ -187,7 +187,7 @@ AVFormatContext *av_open_input_file(const char *filename,
|
|||||||
int av_read_packet(AVFormatContext *s, AVPacket *pkt);
|
int av_read_packet(AVFormatContext *s, AVPacket *pkt);
|
||||||
void av_close_input_file(AVFormatContext *s);
|
void av_close_input_file(AVFormatContext *s);
|
||||||
|
|
||||||
int av_write_packet(AVFormatContext *s, AVPacket *pkt);
|
int av_write_packet(AVFormatContext *s, AVPacket *pkt, int force_pts);
|
||||||
|
|
||||||
void dump_format(AVFormatContext *ic,
|
void dump_format(AVFormatContext *ic,
|
||||||
int index,
|
int index,
|
||||||
|
|||||||
@@ -277,7 +277,7 @@ static int avi_write_header(AVFormatContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int avi_write_packet(AVFormatContext *s, int stream_index,
|
static int avi_write_packet(AVFormatContext *s, int stream_index,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
AVIContext *avi = s->priv_data;
|
AVIContext *avi = s->priv_data;
|
||||||
ByteIOContext *pb = &s->pb;
|
ByteIOContext *pb = &s->pb;
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ static int ffm_write_header(AVFormatContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int ffm_write_packet(AVFormatContext *s, int stream_index,
|
static int ffm_write_packet(AVFormatContext *s, int stream_index,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
AVStream *st = s->streams[stream_index];
|
AVStream *st = s->streams[stream_index];
|
||||||
FFMStream *fst = st->priv_data;
|
FFMStream *fst = st->priv_data;
|
||||||
|
|||||||
@@ -515,7 +515,7 @@ static int img_write_header(AVFormatContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int img_write_packet(AVFormatContext *s, int stream_index,
|
static int img_write_packet(AVFormatContext *s, int stream_index,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
VideoData *img = s->priv_data;
|
VideoData *img = s->priv_data;
|
||||||
AVStream *st = s->streams[stream_index];
|
AVStream *st = s->streams[stream_index];
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ static int mpjpeg_write_header(AVFormatContext *s)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mpjpeg_write_packet(AVFormatContext *s,
|
static int mpjpeg_write_packet(AVFormatContext *s, int stream_index,
|
||||||
int stream_index, UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
UINT8 buf1[256];
|
UINT8 buf1[256];
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ static int single_jpeg_write_header(AVFormatContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int single_jpeg_write_packet(AVFormatContext *s, int stream_index,
|
static int single_jpeg_write_packet(AVFormatContext *s, int stream_index,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
put_buffer(&s->pb, buf, size);
|
put_buffer(&s->pb, buf, size);
|
||||||
put_flush_packet(&s->pb);
|
put_flush_packet(&s->pb);
|
||||||
@@ -120,7 +120,7 @@ static int jpeg_write_header(AVFormatContext *s1)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int jpeg_write_packet(AVFormatContext *s1, int stream_index,
|
static int jpeg_write_packet(AVFormatContext *s1, int stream_index,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
JpegContext *s = s1->priv_data;
|
JpegContext *s = s1->priv_data;
|
||||||
char filename[1024];
|
char filename[1024];
|
||||||
|
|||||||
13
libav/mpeg.c
13
libav/mpeg.c
@@ -321,18 +321,21 @@ static void flush_packet(AVFormatContext *ctx, int stream_index)
|
|||||||
stream->start_pts = -1;
|
stream->start_pts = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mpeg_mux_write_packet(AVFormatContext *ctx,
|
static int mpeg_mux_write_packet(AVFormatContext *ctx, int stream_index,
|
||||||
int stream_index, UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
MpegMuxContext *s = ctx->priv_data;
|
MpegMuxContext *s = ctx->priv_data;
|
||||||
AVStream *st = ctx->streams[stream_index];
|
AVStream *st = ctx->streams[stream_index];
|
||||||
StreamInfo *stream = st->priv_data;
|
StreamInfo *stream = st->priv_data;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
while (size > 0) {
|
while (size > 0) {
|
||||||
/* set pts */
|
/* set pts */
|
||||||
if (stream->start_pts == -1)
|
if (stream->start_pts == -1) {
|
||||||
|
if (force_pts)
|
||||||
|
stream->pts = force_pts;
|
||||||
stream->start_pts = stream->pts;
|
stream->start_pts = stream->pts;
|
||||||
|
}
|
||||||
len = s->packet_data_max_size - stream->buffer_ptr;
|
len = s->packet_data_max_size - stream->buffer_ptr;
|
||||||
if (len > size)
|
if (len > size)
|
||||||
len = size;
|
len = size;
|
||||||
@@ -714,6 +717,8 @@ static int mpeg_mux_read_packet(AVFormatContext *s,
|
|||||||
goto redo;
|
goto redo;
|
||||||
found:
|
found:
|
||||||
av_new_packet(pkt, len);
|
av_new_packet(pkt, len);
|
||||||
|
//printf("\nRead Packet ID: %x PTS: %f Size: %d", startcode,
|
||||||
|
// (float)pts/90000, len);
|
||||||
get_buffer(&s->pb, pkt->data, pkt->size);
|
get_buffer(&s->pb, pkt->data, pkt->size);
|
||||||
pkt->pts = pts;
|
pkt->pts = pts;
|
||||||
pkt->stream_index = i;
|
pkt->stream_index = i;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ int raw_write_header(struct AVFormatContext *s)
|
|||||||
|
|
||||||
int raw_write_packet(struct AVFormatContext *s,
|
int raw_write_packet(struct AVFormatContext *s,
|
||||||
int stream_index,
|
int stream_index,
|
||||||
unsigned char *buf, int size)
|
unsigned char *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
put_buffer(&s->pb, buf, size);
|
put_buffer(&s->pb, buf, size);
|
||||||
put_flush_packet(&s->pb);
|
put_flush_packet(&s->pb);
|
||||||
|
|||||||
@@ -389,7 +389,7 @@ static int rm_write_video(AVFormatContext *s, UINT8 *buf, int size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int rm_write_packet(AVFormatContext *s, int stream_index,
|
static int rm_write_packet(AVFormatContext *s, int stream_index,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
if (s->streams[stream_index]->codec.codec_type ==
|
if (s->streams[stream_index]->codec.codec_type ==
|
||||||
CODEC_TYPE_AUDIO)
|
CODEC_TYPE_AUDIO)
|
||||||
|
|||||||
@@ -378,7 +378,7 @@ static int swf_write_audio(AVFormatContext *s, UINT8 *buf, int size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int swf_write_packet(AVFormatContext *s, int stream_index,
|
static int swf_write_packet(AVFormatContext *s, int stream_index,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
AVCodecContext *codec = &s->streams[stream_index]->codec;
|
AVCodecContext *codec = &s->streams[stream_index]->codec;
|
||||||
if (codec->codec_type == CODEC_TYPE_AUDIO)
|
if (codec->codec_type == CODEC_TYPE_AUDIO)
|
||||||
|
|||||||
@@ -375,10 +375,10 @@ void av_close_input_file(AVFormatContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int av_write_packet(AVFormatContext *s, AVPacket *pkt)
|
int av_write_packet(AVFormatContext *s, AVPacket *pkt, int force_pts)
|
||||||
{
|
{
|
||||||
/* XXX: currently, an emulation because internal API must change */
|
/* XXX: currently, an emulation because internal API must change */
|
||||||
return s->format->write_packet(s, pkt->stream_index, pkt->data, pkt->size);
|
return s->format->write_packet(s, pkt->stream_index, pkt->data, pkt->size, force_pts);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* "user interface" functions */
|
/* "user interface" functions */
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ static int wav_write_header(AVFormatContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int wav_write_packet(AVFormatContext *s, int stream_index_ptr,
|
static int wav_write_packet(AVFormatContext *s, int stream_index_ptr,
|
||||||
UINT8 *buf, int size)
|
UINT8 *buf, int size, int force_pts)
|
||||||
{
|
{
|
||||||
ByteIOContext *pb = &s->pb;
|
ByteIOContext *pb = &s->pb;
|
||||||
put_buffer(pb, buf, size);
|
put_buffer(pb, buf, size);
|
||||||
|
|||||||
@@ -1403,6 +1403,7 @@ static int mpeg_decode_slice(AVCodecContext *avctx,
|
|||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
clear_blocks(s->block[0]);
|
clear_blocks(s->block[0]);
|
||||||
|
emms_c();
|
||||||
ret = mpeg_decode_mb(s, s->block);
|
ret = mpeg_decode_mb(s, s->block);
|
||||||
dprintf("ret=%d\n", ret);
|
dprintf("ret=%d\n", ret);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
|||||||
@@ -2314,6 +2314,7 @@ static int decode_frame(AVCodecContext * avctx,
|
|||||||
avctx->sample_rate = s->sample_rate;
|
avctx->sample_rate = s->sample_rate;
|
||||||
avctx->channels = s->nb_channels;
|
avctx->channels = s->nb_channels;
|
||||||
avctx->bit_rate = s->bit_rate;
|
avctx->bit_rate = s->bit_rate;
|
||||||
|
avctx->frame_size = s->frame_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user