move time_base (pts_num/pts_den) from AVFormatContext -> AVStream

Originally committed as revision 3148 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Michael Niedermayer 21 years ago
parent e8733cc4d9
commit 9ee91c2f53
  1. 30
      ffmpeg.c
  2. 8
      libavformat/4xm.c
  3. 4
      libavformat/asf-enc.c
  4. 3
      libavformat/asf.c
  5. 2
      libavformat/audio.c
  6. 22
      libavformat/avformat.h
  7. 4
      libavformat/avidec.c
  8. 6
      libavformat/dv.c
  9. 4
      libavformat/flic.c
  10. 4
      libavformat/flvdec.c
  11. 3
      libavformat/flvenc.c
  12. 3
      libavformat/grab.c
  13. 6
      libavformat/idcin.c
  14. 7
      libavformat/idroq.c
  15. 2
      libavformat/img.c
  16. 6
      libavformat/ipmovie.c
  17. 3
      libavformat/matroska.c
  18. 5
      libavformat/mpegts.c
  19. 7
      libavformat/nut.c
  20. 6
      libavformat/ogg.c
  21. 6
      libavformat/psxstr.c
  22. 7
      libavformat/segafilm.c
  23. 6
      libavformat/sierravmd.c
  24. 5
      libavformat/swf.c
  25. 78
      libavformat/utils.c
  26. 6
      libavformat/wc3movie.c
  27. 11
      libavformat/westwood.c

@ -595,10 +595,10 @@ static void do_video_out(AVFormatContext *s,
double adelta, vdelta, av_delay; double adelta, vdelta, av_delay;
adelta = audio_sync->sync_ipts - ((double)audio_sync->sync_opts * adelta = audio_sync->sync_ipts - ((double)audio_sync->sync_opts *
s->pts_num / s->pts_den); ost->st->time_base.num / ost->st->time_base.den);
vdelta = ost->sync_ipts - ((double)ost->sync_opts * vdelta = ost->sync_ipts - ((double)ost->sync_opts *
s->pts_num / s->pts_den); ost->st->time_base.num / ost->st->time_base.den);
av_delay = adelta - vdelta; av_delay = adelta - vdelta;
if (av_delay < -AV_DELAY_MAX) if (av_delay < -AV_DELAY_MAX)
@ -609,7 +609,7 @@ static void do_video_out(AVFormatContext *s,
} else { } else {
double vdelta; double vdelta;
vdelta = (double)(ost->st->pts.val) * s->pts_num / s->pts_den - (ost->sync_ipts - ost->sync_ipts_offset); vdelta = (double)(ost->st->pts.val) * ost->st->time_base.num / ost->st->time_base.den - (ost->sync_ipts - ost->sync_ipts_offset);
if (vdelta < 100 && vdelta > -100 && ost->sync_ipts_offset) { if (vdelta < 100 && vdelta > -100 && ost->sync_ipts_offset) {
if (vdelta < -AV_DELAY_MAX) if (vdelta < -AV_DELAY_MAX)
nb_frames = 2; nb_frames = 2;
@ -630,10 +630,10 @@ static void do_video_out(AVFormatContext *s,
if (audio_sync && verbose >=0) { if (audio_sync && verbose >=0) {
fprintf(stderr, "Input APTS %12.6f, output APTS %12.6f, ", fprintf(stderr, "Input APTS %12.6f, output APTS %12.6f, ",
(double) audio_sync->sync_ipts, (double) audio_sync->sync_ipts,
(double) audio_sync->st->pts.val * s->pts_num / s->pts_den); (double) audio_sync->st->pts.val * st->time_base.num / st->time_base.den);
fprintf(stderr, "Input VPTS %12.6f, output VPTS %12.6f: %s\n", fprintf(stderr, "Input VPTS %12.6f, output VPTS %12.6f: %s\n",
(double) ost->sync_ipts, (double) ost->sync_ipts,
(double) ost->st->pts.val * s->pts_num / s->pts_den, (double) ost->st->pts.val * st->time_base.num / st->time_base.den,
action[nb_frames]); action[nb_frames]);
} }
} }
@ -872,7 +872,7 @@ static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
fprintf(fvstats,"f_size= %6d ", frame_size); fprintf(fvstats,"f_size= %6d ", frame_size);
/* compute pts value */ /* compute pts value */
ti1 = (double)ost->st->pts.val * os->pts_num / os->pts_den; ti1 = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
if (ti1 < 0.01) if (ti1 < 0.01)
ti1 = 0.01; ti1 = 0.01;
@ -956,7 +956,7 @@ static void print_report(AVFormatContext **output_files,
vid = 1; vid = 1;
} }
/* compute min output value */ /* compute min output value */
pts = (double)ost->st->pts.val * os->pts_num / os->pts_den; pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
if ((pts < ti1) && (pts > 0)) if ((pts < ti1) && (pts > 0))
ti1 = pts; ti1 = pts;
} }
@ -1118,7 +1118,7 @@ static int output_packet(AVInputStream *ist, int ist_index,
printf("%d: got pts=%0.3f %0.3f\n", i, printf("%d: got pts=%0.3f %0.3f\n", i,
(double)pkt->pts / AV_TIME_BASE, (double)pkt->pts / AV_TIME_BASE,
((double)ist->pts / AV_TIME_BASE) - ((double)ist->pts / AV_TIME_BASE) -
((double)ost->st->pts.val * os->pts_num / os->pts_den)); ((double)ost->st->pts.val * ost->time_base.num / ost->time_base.den));
#endif #endif
/* set the input output pts pairs */ /* set the input output pts pairs */
ost->sync_ipts = (double)ist->pts / AV_TIME_BASE; ost->sync_ipts = (double)ist->pts / AV_TIME_BASE;
@ -1165,7 +1165,7 @@ static int output_packet(AVInputStream *ist, int ist_index,
avcodec_get_frame_defaults(&avframe); avcodec_get_frame_defaults(&avframe);
ost->st->codec.coded_frame= &avframe; ost->st->codec.coded_frame= &avframe;
avframe.key_frame = pkt->flags & PKT_FLAG_KEY; avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
ost->st->pts.val= av_rescale(ist->pts, os->pts_den, os->pts_num*AV_TIME_BASE); ost->st->pts.val= av_rescale(ist->pts, ost->st->time_base.den, ost->st->time_base.num*AV_TIME_BASE);
if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO) if(ost->st->codec.codec_type == CODEC_TYPE_AUDIO)
audio_size += data_size; audio_size += data_size;
@ -1637,7 +1637,7 @@ static int av_encode(AVFormatContext **output_files,
ost = ost_table[i]; ost = ost_table[i];
os = output_files[ost->file_index]; os = output_files[ost->file_index];
ist = ist_table[ost->source_index]; ist = ist_table[ost->source_index];
pts = (double)ost->st->pts.val * os->pts_num / os->pts_den; pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den;
if (!file_table[ist->file_index].eof_reached && if (!file_table[ist->file_index].eof_reached &&
pts < pts_min) { pts < pts_min) {
pts_min = pts; pts_min = pts;
@ -2729,12 +2729,11 @@ static void opt_output_file(const char *filename)
if (use_video) { if (use_video) {
AVCodecContext *video_enc; AVCodecContext *video_enc;
st = av_mallocz(sizeof(AVStream)); st = av_new_stream(oc, nb_streams++);
if (!st) { if (!st) {
fprintf(stderr, "Could not alloc stream\n"); fprintf(stderr, "Could not alloc stream\n");
exit(1); exit(1);
} }
avcodec_get_context_defaults(&st->codec);
#if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS) #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
if(thread_count>1) if(thread_count>1)
avcodec_thread_init(&st->codec, thread_count); avcodec_thread_init(&st->codec, thread_count);
@ -2960,19 +2959,16 @@ static void opt_output_file(const char *filename)
} }
} }
} }
oc->streams[nb_streams] = st;
nb_streams++;
} }
if (use_audio) { if (use_audio) {
AVCodecContext *audio_enc; AVCodecContext *audio_enc;
st = av_mallocz(sizeof(AVStream)); st = av_new_stream(oc, nb_streams++);
if (!st) { if (!st) {
fprintf(stderr, "Could not alloc stream\n"); fprintf(stderr, "Could not alloc stream\n");
exit(1); exit(1);
} }
avcodec_get_context_defaults(&st->codec);
#if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS) #if defined(HAVE_PTHREADS) || defined(HAVE_W32THREADS)
if(thread_count>1) if(thread_count>1)
avcodec_thread_init(&st->codec, thread_count); avcodec_thread_init(&st->codec, thread_count);
@ -3002,8 +2998,6 @@ static void opt_output_file(const char *filename)
} else } else
audio_enc->channels = audio_channels; audio_enc->channels = audio_channels;
} }
oc->streams[nb_streams] = st;
nb_streams++;
} }
oc->nb_streams = nb_streams; oc->nb_streams = nb_streams;

@ -164,6 +164,7 @@ static int fourxm_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
fourxm->video_stream_index = st->index; fourxm->video_stream_index = st->index;
@ -202,6 +203,9 @@ static int fourxm_read_header(AVFormatContext *s,
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
/* set the pts reference (1 pts = 1/90000) */
av_set_pts_info(st, 33, 1, 90000);
fourxm->tracks[current_track].stream_index = st->index; fourxm->tracks[current_track].stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_AUDIO; st->codec.codec_type = CODEC_TYPE_AUDIO;
@ -232,10 +236,6 @@ static int fourxm_read_header(AVFormatContext *s,
fourxm->video_pts = -fourxm->video_pts_inc; /* first frame will push to 0 */ fourxm->video_pts = -fourxm->video_pts_inc; /* first frame will push to 0 */
fourxm->audio_pts = 0; fourxm->audio_pts = 0;
/* set the pts reference (1 pts = 1/90000) */
s->pts_num = 1;
s->pts_den = 90000;
return 0; return 0;
} }

@ -285,6 +285,8 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, int64_t data
for(n=0;n<s->nb_streams;n++) { for(n=0;n<s->nb_streams;n++) {
enc = &s->streams[n]->codec; enc = &s->streams[n]->codec;
av_set_pts_info(s->streams[n], 32, 1, 1000); /* 32 bit pts in ms */
bit_rate += enc->bit_rate; bit_rate += enc->bit_rate;
} }
@ -469,8 +471,6 @@ static int asf_write_header(AVFormatContext *s)
{ {
ASFContext *asf = s->priv_data; ASFContext *asf = s->priv_data;
av_set_pts_info(s, 32, 1, 1000); /* 32 bit pts in ms */
asf->packet_size = PACKET_SIZE; asf->packet_size = PACKET_SIZE;
asf->nb_packets = 0; asf->nb_packets = 0;

@ -148,8 +148,6 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
int size, i; int size, i;
int64_t gsize; int64_t gsize;
av_set_pts_info(s, 32, 1, 1000); /* 32 bit pts in ms */
get_guid(pb, &g); get_guid(pb, &g);
if (memcmp(&g, &asf_header, sizeof(GUID))) if (memcmp(&g, &asf_header, sizeof(GUID)))
goto fail; goto fail;
@ -193,6 +191,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
goto fail; goto fail;
av_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */
asf_st = av_mallocz(sizeof(ASFStream)); asf_st = av_mallocz(sizeof(ASFStream));
if (!asf_st) if (!asf_st)
goto fail; goto fail;

@ -230,7 +230,7 @@ static int audio_read_header(AVFormatContext *s1, AVFormatParameters *ap)
st->codec.sample_rate = s->sample_rate; st->codec.sample_rate = s->sample_rate;
st->codec.channels = s->channels; st->codec.channels = s->channels;
av_set_pts_info(s1, 48, 1, 1000000); /* 48 bits pts in us */ av_set_pts_info(st, 48, 1, 1000000); /* 48 bits pts in us */
return 0; return 0;
} }

@ -214,6 +214,8 @@ typedef struct AVStream {
int codec_info_nb_frames; int codec_info_nb_frames;
/* encoding: PTS generation when outputing stream */ /* encoding: PTS generation when outputing stream */
AVFrac pts; AVFrac pts;
AVRational time_base;
int pts_wrap_bits; /* number of bits in pts (used for wrapping control) */
/* ffmpeg.c private use */ /* ffmpeg.c private use */
int stream_copy; /* if TRUE, just copy stream */ int stream_copy; /* if TRUE, just copy stream */
/* quality, as it has been removed from AVCodecContext and put in AVVideoFrame /* quality, as it has been removed from AVCodecContext and put in AVVideoFrame
@ -226,6 +228,14 @@ typedef struct AVStream {
seconds. */ seconds. */
int64_t duration; int64_t duration;
/* the following are used for pts/dts unit conversion */
int64_t last_pkt_stream_pts;
int64_t last_pkt_stream_dts;
int64_t last_pkt_pts;
int64_t last_pkt_dts;
int last_pkt_pts_frac;
int last_pkt_dts_frac;
/* av_read_frame() support */ /* av_read_frame() support */
int need_parsing; int need_parsing;
struct AVCodecParserContext *parser; struct AVCodecParserContext *parser;
@ -268,8 +278,6 @@ typedef struct AVFormatContext {
int ctx_flags; /* format specific flags, see AVFMTCTX_xx */ int ctx_flags; /* format specific flags, see AVFMTCTX_xx */
/* private data for pts handling (do not modify directly) */ /* private data for pts handling (do not modify directly) */
int pts_wrap_bits; /* number of bits in pts (used for wrapping control) */
int pts_num, pts_den; /* value to convert to seconds */
/* This buffer is only needed when packets were already buffered but /* This buffer is only needed when packets were already buffered but
not decoded, for example to get the codec parameters in mpeg not decoded, for example to get the codec parameters in mpeg
streams */ streams */
@ -296,14 +304,6 @@ typedef struct AVFormatContext {
int cur_len; int cur_len;
AVPacket cur_pkt; AVPacket cur_pkt;
/* the following are used for pts/dts unit conversion */
int64_t last_pkt_stream_pts;
int64_t last_pkt_stream_dts;
int64_t last_pkt_pts;
int64_t last_pkt_dts;
int last_pkt_pts_frac;
int last_pkt_dts_frac;
/* av_seek_frame() support */ /* av_seek_frame() support */
int64_t data_offset; /* offset of the first packet */ int64_t data_offset; /* offset of the first packet */
int index_built; int index_built;
@ -553,7 +553,7 @@ int av_read_play(AVFormatContext *s);
int av_read_pause(AVFormatContext *s); int av_read_pause(AVFormatContext *s);
void av_close_input_file(AVFormatContext *s); void av_close_input_file(AVFormatContext *s);
AVStream *av_new_stream(AVFormatContext *s, int id); AVStream *av_new_stream(AVFormatContext *s, int id);
void av_set_pts_info(AVFormatContext *s, int pts_wrap_bits, void av_set_pts_info(AVStream *s, int pts_wrap_bits,
int pts_num, int pts_den); int pts_num, int pts_den);
int av_find_default_stream_index(AVFormatContext *s); int av_find_default_stream_index(AVFormatContext *s);

@ -93,8 +93,6 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
AVIStream *ast; AVIStream *ast;
int xan_video = 0; /* hack to support Xan A/V */ int xan_video = 0; /* hack to support Xan A/V */
av_set_pts_info(s, 64, 1, AV_TIME_BASE);
if (get_riff(avi, pb) < 0) if (get_riff(avi, pb) < 0)
return -1; return -1;
@ -139,6 +137,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
st = av_new_stream(s, i); st = av_new_stream(s, i);
if (!st) if (!st)
goto fail; goto fail;
av_set_pts_info(st, 64, 1, AV_TIME_BASE);
ast = av_mallocz(sizeof(AVIStream)); ast = av_mallocz(sizeof(AVIStream));
if (!ast) if (!ast)
goto fail; goto fail;

@ -550,6 +550,7 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
if (c->ach == 2 && !c->ast[1]) { if (c->ach == 2 && !c->ast[1]) {
c->ast[1] = av_new_stream(c->fctx, 0); c->ast[1] = av_new_stream(c->fctx, 0);
if (c->ast[1]) { if (c->ast[1]) {
av_set_pts_info(c->ast[1], 64, 1, 30000);
c->ast[1]->codec.codec_type = CODEC_TYPE_AUDIO; c->ast[1]->codec.codec_type = CODEC_TYPE_AUDIO;
c->ast[1]->codec.codec_id = CODEC_ID_PCM_S16LE; c->ast[1]->codec.codec_id = CODEC_ID_PCM_S16LE;
} else } else
@ -721,6 +722,9 @@ DVDemuxContext* dv_init_demux(AVFormatContext *s)
c->ast[0] = av_new_stream(s, 0); c->ast[0] = av_new_stream(s, 0);
if (!c->vst || !c->ast[0]) if (!c->vst || !c->ast[0])
goto fail; goto fail;
av_set_pts_info(c->vst, 64, 1, 30000);
av_set_pts_info(c->ast[0], 64, 1, 30000);
c->fctx = s; c->fctx = s;
c->ast[1] = NULL; c->ast[1] = NULL;
c->ach = 0; c->ach = 0;
@ -738,8 +742,6 @@ DVDemuxContext* dv_init_demux(AVFormatContext *s)
s->ctx_flags |= AVFMTCTX_NOHEADER; s->ctx_flags |= AVFMTCTX_NOHEADER;
av_set_pts_info(s, 64, 1, 30000);
return c; return c;
fail: fail:

@ -100,9 +100,7 @@ static int flic_read_header(AVFormatContext *s,
st->codec.extradata = av_malloc(FLIC_HEADER_SIZE); st->codec.extradata = av_malloc(FLIC_HEADER_SIZE);
memcpy(st->codec.extradata, header, FLIC_HEADER_SIZE); memcpy(st->codec.extradata, header, FLIC_HEADER_SIZE);
/* set the pts reference (1 pts = 1/90000) */ av_set_pts_info(st, 33, 1, 90000);
s->pts_num = 1;
s->pts_den = 90000;
/* Time to figure out the framerate: If there is a FLIC chunk magic /* Time to figure out the framerate: If there is a FLIC chunk magic
* number at offset 0x10, assume this is from the Bullfrog game, * number at offset 0x10, assume this is from the Bullfrog game,

@ -48,8 +48,6 @@ static int flv_read_header(AVFormatContext *s,
s->ctx_flags |= AVFMTCTX_NOHEADER; //ok we have a header but theres no fps, codec type, sample_rate, ... s->ctx_flags |= AVFMTCTX_NOHEADER; //ok we have a header but theres no fps, codec type, sample_rate, ...
av_set_pts_info(s, 24, 1, 1000); /* 24 bit pts in ms */
url_fskip(&s->pb, 4); url_fskip(&s->pb, 4);
flags = get_byte(&s->pb); flags = get_byte(&s->pb);
@ -103,6 +101,8 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
st = av_new_stream(s, is_audio); st = av_new_stream(s, is_audio);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 24, 1, 1000); /* 24 bit pts in ms */
st->codec.frame_rate_base= 0; st->codec.frame_rate_base= 0;
} }
break; break;

@ -134,8 +134,6 @@ static int flv_write_header(AVFormatContext *s)
FLVContext *flv = s->priv_data; FLVContext *flv = s->priv_data;
int i; int i;
av_set_pts_info(s, 24, 1, 1000); /* 24 bit pts in ms */
flv->hasAudio = 0; flv->hasAudio = 0;
flv->hasVideo = 0; flv->hasVideo = 0;
@ -151,6 +149,7 @@ static int flv_write_header(AVFormatContext *s)
for(i=0; i<s->nb_streams; i++){ for(i=0; i<s->nb_streams; i++){
AVCodecContext *enc = &s->streams[i]->codec; AVCodecContext *enc = &s->streams[i]->codec;
av_set_pts_info(s->streams[i], 24, 1, 1000); /* 24 bit pts in ms */
if(enc->codec_tag == 5){ if(enc->codec_tag == 5){
put_byte(pb,8); // message type put_byte(pb,8); // message type
put_be24(pb,0); // include flags put_be24(pb,0); // include flags

@ -79,6 +79,7 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
st = av_new_stream(s1, 0); st = av_new_stream(s1, 0);
if (!st) if (!st)
return -ENOMEM; return -ENOMEM;
av_set_pts_info(st, 48, 1, 1000000); /* 48 bits pts in us */
s->width = width; s->width = width;
s->height = height; s->height = height;
@ -263,8 +264,6 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
st->codec.height = height; st->codec.height = height;
st->codec.frame_rate = frame_rate; st->codec.frame_rate = frame_rate;
st->codec.frame_rate_base = frame_rate_base; st->codec.frame_rate_base = frame_rate_base;
av_set_pts_info(s1, 48, 1, 1000000); /* 48 bits pts in us */
return 0; return 0;
fail: fail:

@ -154,6 +154,7 @@ static int idcin_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
idcin->video_stream_index = st->index; idcin->video_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_VIDEO; st->codec.codec_type = CODEC_TYPE_VIDEO;
st->codec.codec_id = CODEC_ID_IDCIN; st->codec.codec_id = CODEC_ID_IDCIN;
@ -176,6 +177,7 @@ static int idcin_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
idcin->audio_stream_index = st->index; idcin->audio_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_AUDIO; st->codec.codec_type = CODEC_TYPE_AUDIO;
st->codec.codec_tag = 1; st->codec.codec_tag = 1;
@ -205,10 +207,6 @@ static int idcin_read_header(AVFormatContext *s,
idcin->next_chunk_is_video = 1; idcin->next_chunk_is_video = 1;
idcin->pts = 0; idcin->pts = 0;
/* set the pts reference (1 pts = 1/90000) */
s->pts_num = 1;
s->pts_den = 90000;
return 0; return 0;
} }

@ -84,10 +84,6 @@ static int roq_read_header(AVFormatContext *s,
roq->framerate = LE_16(&preamble[6]); roq->framerate = LE_16(&preamble[6]);
roq->frame_pts_inc = 90000 / roq->framerate; roq->frame_pts_inc = 90000 / roq->framerate;
/* set the pts reference (1 pts = 1/90000) */
s->pts_num = 1;
s->pts_den = 90000;
/* init private context parameters */ /* init private context parameters */
roq->width = roq->height = roq->audio_channels = roq->video_pts = roq->width = roq->height = roq->audio_channels = roq->video_pts =
roq->audio_frame_count = 0; roq->audio_frame_count = 0;
@ -146,6 +142,8 @@ static int roq_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
/* set the pts reference (1 pts = 1/90000) */
av_set_pts_info(st, 33, 1, 90000);
roq->video_stream_index = st->index; roq->video_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_VIDEO; st->codec.codec_type = CODEC_TYPE_VIDEO;
st->codec.codec_id = CODEC_ID_ROQ; st->codec.codec_id = CODEC_ID_ROQ;
@ -157,6 +155,7 @@ static int roq_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
roq->audio_stream_index = st->index; roq->audio_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_AUDIO; st->codec.codec_type = CODEC_TYPE_AUDIO;
st->codec.codec_id = CODEC_ID_ROQ_DPCM; st->codec.codec_id = CODEC_ID_ROQ_DPCM;

@ -236,7 +236,7 @@ static int img_read_packet(AVFormatContext *s1, AVPacket *pkt)
} else { } else {
/* XXX: computing this pts is not necessary as it is done in /* XXX: computing this pts is not necessary as it is done in
the generic code too */ the generic code too */
pkt->pts = av_rescale((int64_t)s->img_count * s1->streams[0]->codec.frame_rate_base, s1->pts_den, s1->streams[0]->codec.frame_rate) / s1->pts_num; pkt->pts = av_rescale((int64_t)s->img_count * s1->streams[0]->codec.frame_rate_base, s1->streams[0]->time_base.den, s1->streams[0]->codec.frame_rate) / s1->streams[0]->time_base.num;
s->img_count++; s->img_count++;
s->img_number++; s->img_number++;
return 0; return 0;

@ -552,14 +552,11 @@ static int ipmovie_read_header(AVFormatContext *s,
else if (process_ipmovie_chunk(ipmovie, pb, &pkt) != CHUNK_INIT_AUDIO) else if (process_ipmovie_chunk(ipmovie, pb, &pkt) != CHUNK_INIT_AUDIO)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
/* set the pts reference (1 pts = 1/90000) */
s->pts_num = 1;
s->pts_den = 90000;
/* initialize the stream decoders */ /* initialize the stream decoders */
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
ipmovie->video_stream_index = st->index; ipmovie->video_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_VIDEO; st->codec.codec_type = CODEC_TYPE_VIDEO;
st->codec.codec_id = CODEC_ID_INTERPLAY_VIDEO; st->codec.codec_id = CODEC_ID_INTERPLAY_VIDEO;
@ -574,6 +571,7 @@ static int ipmovie_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
ipmovie->audio_stream_index = st->index; ipmovie->audio_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_AUDIO; st->codec.codec_type = CODEC_TYPE_AUDIO;
st->codec.codec_id = ipmovie->audio_type; st->codec.codec_id = ipmovie->audio_type;

@ -2152,8 +2152,6 @@ matroska_read_header (AVFormatContext *s,
MatroskaTrack *track; MatroskaTrack *track;
AVStream *st; AVStream *st;
av_set_pts_info(s, 24, 1, 1000); /* 24 bit pts in ms */
for (i = 0; i < matroska->num_tracks; i++) { for (i = 0; i < matroska->num_tracks; i++) {
track = matroska->tracks[i]; track = matroska->tracks[i];
@ -2257,6 +2255,7 @@ matroska_read_header (AVFormatContext *s,
st = av_new_stream(s, track->stream_index); st = av_new_stream(s, track->stream_index);
if (st == NULL) if (st == NULL)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 24, 1, 1000); /* 24 bit pts in ms */
st->codec.codec_id = codec_id; st->codec.codec_id = codec_id;

@ -768,6 +768,7 @@ static void mpegts_push_data(void *opaque,
} }
st = av_new_stream(pes->stream, pes->pid); st = av_new_stream(pes->stream, pes->pid);
if (st) { if (st) {
av_set_pts_info(st, 60, 1, 27000000);
st->priv_data = pes; st->priv_data = pes;
st->codec.codec_type = codec_type; st->codec.codec_type = codec_type;
st->codec.codec_id = codec_id; st->codec.codec_id = codec_id;
@ -1165,14 +1166,12 @@ static int mpegts_read_header(AVFormatContext *s,
uint8_t packet[TS_PACKET_SIZE]; uint8_t packet[TS_PACKET_SIZE];
/* only read packets */ /* only read packets */
s->pts_num = 1;
s->pts_den = 27000000;
do_pcr: do_pcr:
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
goto fail; goto fail;
av_set_pts_info(st, 60, 1, 27000000);
st->codec.codec_type = CODEC_TYPE_DATA; st->codec.codec_type = CODEC_TYPE_DATA;
st->codec.codec_id = CODEC_ID_MPEG2TS; st->codec.codec_id = CODEC_ID_MPEG2TS;

@ -511,8 +511,6 @@ static int nut_write_header(AVFormatContext *s)
nut->stream = nut->stream =
av_mallocz(sizeof(StreamContext)*s->nb_streams); av_mallocz(sizeof(StreamContext)*s->nb_streams);
av_set_pts_info(s, 60, 1, AV_TIME_BASE);
/* main header */ /* main header */
put_be64(bc, MAIN_STARTCODE); put_be64(bc, MAIN_STARTCODE);
put_packetheader(nut, bc, 120+5*256, 1); put_packetheader(nut, bc, 120+5*256, 1);
@ -572,6 +570,7 @@ static int nut_write_header(AVFormatContext *s)
int nom, denom, gcd; int nom, denom, gcd;
codec = &s->streams[i]->codec; codec = &s->streams[i]->codec;
av_set_pts_info(s->streams[i], 60, 1, AV_TIME_BASE);
put_be64(bc, STREAM_STARTCODE); put_be64(bc, STREAM_STARTCODE);
put_packetheader(nut, bc, 120 + codec->extradata_size, 1); put_packetheader(nut, bc, 120 + codec->extradata_size, 1);
@ -945,6 +944,8 @@ static int decode_stream_header(NUTContext *nut){
st = av_new_stream(s, stream_id); st = av_new_stream(s, stream_id);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 60, 1, AV_TIME_BASE);
class = get_v(bc); class = get_v(bc);
tmp = get_vb(bc); tmp = get_vb(bc);
st->codec.codec_tag= tmp; st->codec.codec_tag= tmp;
@ -1069,8 +1070,6 @@ static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
nut->avf= s; nut->avf= s;
av_set_pts_info(s, 60, 1, AV_TIME_BASE);
/* main header */ /* main header */
pos=0; pos=0;
for(;;){ for(;;){

@ -36,14 +36,14 @@ static int ogg_write_header(AVFormatContext *avfcontext)
ogg_packet *op= &context->op; ogg_packet *op= &context->op;
int n, i; int n, i;
av_set_pts_info(avfcontext, 60, 1, AV_TIME_BASE);
ogg_stream_init(&context->os, 31415); ogg_stream_init(&context->os, 31415);
for(n = 0 ; n < avfcontext->nb_streams ; n++) { for(n = 0 ; n < avfcontext->nb_streams ; n++) {
AVCodecContext *codec = &avfcontext->streams[n]->codec; AVCodecContext *codec = &avfcontext->streams[n]->codec;
uint8_t *p= codec->extradata; uint8_t *p= codec->extradata;
av_set_pts_info(avfcontext->streams[n], 60, 1, AV_TIME_BASE);
for(i=0; i < codec->extradata_size; i+= op->bytes){ for(i=0; i < codec->extradata_size; i+= op->bytes){
op->bytes = p[i++]<<8; op->bytes = p[i++]<<8;
op->bytes+= p[i++]; op->bytes+= p[i++];
@ -172,7 +172,6 @@ static int ogg_read_header(AVFormatContext *avfcontext, AVFormatParameters *ap)
int i; int i;
avfcontext->ctx_flags |= AVFMTCTX_NOHEADER; avfcontext->ctx_flags |= AVFMTCTX_NOHEADER;
av_set_pts_info(avfcontext, 60, 1, AV_TIME_BASE);
ogg_sync_init(&context->oy) ; ogg_sync_init(&context->oy) ;
buf = ogg_sync_buffer(&context->oy, DECODER_BUFFER_SIZE) ; buf = ogg_sync_buffer(&context->oy, DECODER_BUFFER_SIZE) ;
@ -190,6 +189,7 @@ static int ogg_read_header(AVFormatContext *avfcontext, AVFormatParameters *ap)
ast = av_new_stream(avfcontext, 0) ; ast = av_new_stream(avfcontext, 0) ;
if(!ast) if(!ast)
return AVERROR_NOMEM ; return AVERROR_NOMEM ;
av_set_pts_info(ast, 60, 1, AV_TIME_BASE);
codec= &ast->codec; codec= &ast->codec;
codec->codec_type = CODEC_TYPE_AUDIO; codec->codec_type = CODEC_TYPE_AUDIO;

@ -135,9 +135,6 @@ static int str_read_header(AVFormatContext *s,
str->video_channel = -1; str->video_channel = -1;
str->video_chunk = NULL; str->video_chunk = NULL;
/* set the pts reference (1 pts = 1/90000) */
s->pts_num = 1;
s->pts_den = 90000;
/* skip over any RIFF header */ /* skip over any RIFF header */
if (get_buffer(pb, sector, RIFF_HEADER_SIZE) != RIFF_HEADER_SIZE) if (get_buffer(pb, sector, RIFF_HEADER_SIZE) != RIFF_HEADER_SIZE)
@ -178,6 +175,8 @@ static int str_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
/* set the pts reference (1 pts = 1/90000) */
av_set_pts_info(st, 33, 1, 90000);
str->channels[channel].video_stream_index = st->index; str->channels[channel].video_stream_index = st->index;
@ -206,6 +205,7 @@ static int str_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
str->channels[channel].audio_stream_index = st->index; str->channels[channel].audio_stream_index = st->index;

@ -173,6 +173,9 @@ static int film_read_header(AVFormatContext *s,
film->sample_count = BE_32(&scratch[12]); film->sample_count = BE_32(&scratch[12]);
film->sample_table = av_malloc(film->sample_count * sizeof(film_sample_t)); film->sample_table = av_malloc(film->sample_count * sizeof(film_sample_t));
for(i=0; i<s->nb_streams; i++)
av_set_pts_info(s->streams[i], 33, 1, film->base_clock);
audio_frame_counter = 0; audio_frame_counter = 0;
for (i = 0; i < film->sample_count; i++) { for (i = 0; i < film->sample_count; i++) {
/* load the next sample record and transfer it to an internal struct */ /* load the next sample record and transfer it to an internal struct */
@ -200,10 +203,6 @@ static int film_read_header(AVFormatContext *s,
film->current_sample = 0; film->current_sample = 0;
/* set the pts reference to match the tick rate of the file */
s->pts_num = 1;
s->pts_den = film->base_clock;
return 0; return 0;
} }

@ -129,6 +129,7 @@ static int vmd_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
vmd->video_stream_index = st->index; vmd->video_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_VIDEO; st->codec.codec_type = CODEC_TYPE_VIDEO;
st->codec.codec_id = CODEC_ID_VMDVIDEO; st->codec.codec_id = CODEC_ID_VMDVIDEO;
@ -145,6 +146,7 @@ static int vmd_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
vmd->audio_stream_index = st->index; vmd->audio_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_AUDIO; st->codec.codec_type = CODEC_TYPE_AUDIO;
st->codec.codec_id = CODEC_ID_VMDAUDIO; st->codec.codec_id = CODEC_ID_VMDAUDIO;
@ -243,10 +245,6 @@ static int vmd_read_header(AVFormatContext *s,
av_free(raw_frame_table); av_free(raw_frame_table);
/* set the pts reference at 1 pts = 1/90000 sec */
s->pts_num = 1;
s->pts_den = 90000;
vmd->current_frame = 0; vmd->current_frame = 0;
return 0; return 0;

@ -805,8 +805,6 @@ static int swf_read_header(AVFormatContext *s, AVFormatParameters *ap)
frame_rate = get_le16(pb); frame_rate = get_le16(pb);
get_le16(pb); /* frame count */ get_le16(pb); /* frame count */
av_set_pts_info(s, 24, 1, 1000); /* 24 bit pts in ms */
/* The Flash Player converts 8.8 frame rates /* The Flash Player converts 8.8 frame rates
to milliseconds internally. Do the same to get to milliseconds internally. Do the same to get
a correct framerate */ a correct framerate */
@ -837,6 +835,8 @@ static int swf_read_header(AVFormatContext *s, AVFormatParameters *ap)
/* Check for FLV1 */ /* Check for FLV1 */
if ( get_byte(pb) == SWF_VIDEO_CODEC_FLV1 ) { if ( get_byte(pb) == SWF_VIDEO_CODEC_FLV1 ) {
vst = av_new_stream(s, 0); vst = av_new_stream(s, 0);
av_set_pts_info(vst, 24, 1, 1000); /* 24 bit pts in ms */
vst->codec.codec_type = CODEC_TYPE_VIDEO; vst->codec.codec_type = CODEC_TYPE_VIDEO;
vst->codec.codec_id = CODEC_ID_FLV1; vst->codec.codec_id = CODEC_ID_FLV1;
if ( swf->samples_per_frame ) { if ( swf->samples_per_frame ) {
@ -857,6 +857,7 @@ static int swf_read_header(AVFormatContext *s, AVFormatParameters *ap)
get_le16(pb); get_le16(pb);
} }
ast = av_new_stream(s, 1); ast = av_new_stream(s, 1);
av_set_pts_info(ast, 24, 1, 1000); /* 24 bit pts in ms */
if (!ast) if (!ast)
return -ENOMEM; return -ENOMEM;

@ -355,13 +355,6 @@ int av_open_input_stream(AVFormatContext **ic_ptr,
ic->priv_data = NULL; ic->priv_data = NULL;
} }
/* default pts settings is MPEG like */
av_set_pts_info(ic, 33, 1, 90000);
ic->last_pkt_pts = AV_NOPTS_VALUE;
ic->last_pkt_dts = AV_NOPTS_VALUE;
ic->last_pkt_stream_pts = AV_NOPTS_VALUE;
ic->last_pkt_stream_dts = AV_NOPTS_VALUE;
err = ic->iformat->read_header(ic, ap); err = ic->iformat->read_header(ic, ap);
if (err < 0) if (err < 0)
goto fail; goto fail;
@ -499,7 +492,7 @@ int av_read_packet(AVFormatContext *s, AVPacket *pkt)
wrapping is handled by considering the next PTS/DTS as a delta to wrapping is handled by considering the next PTS/DTS as a delta to
the previous value. We handle the delta as a fraction to avoid any the previous value. We handle the delta as a fraction to avoid any
rounding errors. */ rounding errors. */
static inline int64_t convert_timestamp_units(AVFormatContext *s, static inline int64_t convert_timestamp_units(AVStream *s,
int64_t *plast_pkt_pts, int64_t *plast_pkt_pts,
int *plast_pkt_pts_frac, int *plast_pkt_pts_frac,
int64_t *plast_pkt_stream_pts, int64_t *plast_pkt_stream_pts,
@ -515,17 +508,18 @@ static inline int64_t convert_timestamp_units(AVFormatContext *s,
shift = 64 - s->pts_wrap_bits; shift = 64 - s->pts_wrap_bits;
delta_pts = ((stream_pts - *plast_pkt_stream_pts) << shift) >> shift; delta_pts = ((stream_pts - *plast_pkt_stream_pts) << shift) >> shift;
/* XXX: overflow possible but very unlikely as it is a delta */ /* XXX: overflow possible but very unlikely as it is a delta */
delta_pts = delta_pts * AV_TIME_BASE * s->pts_num; delta_pts = delta_pts * AV_TIME_BASE * s->time_base.num;
pts = *plast_pkt_pts + (delta_pts / s->pts_den); pts = *plast_pkt_pts + (delta_pts / s->time_base.den);
pts_frac = *plast_pkt_pts_frac + (delta_pts % s->pts_den); pts_frac = *plast_pkt_pts_frac + (delta_pts % s->time_base.den);
if (pts_frac >= s->pts_den) { if (pts_frac >= s->time_base.den) {
pts_frac -= s->pts_den; pts_frac -= s->time_base.den;
pts++; pts++;
} }
} else { } else {
/* no previous pts, so no wrapping possible */ /* no previous pts, so no wrapping possible */
pts = (int64_t)(((double)stream_pts * AV_TIME_BASE * s->pts_num) / // pts = av_rescale(stream_pts, (int64_t)AV_TIME_BASE * s->time_base.num, s->time_base.den);
(double)s->pts_den); pts = (int64_t)(((double)stream_pts * AV_TIME_BASE * s->time_base.num) /
(double)s->time_base.den);
pts_frac = 0; pts_frac = 0;
} }
*plast_pkt_stream_pts = stream_pts; *plast_pkt_stream_pts = stream_pts;
@ -752,15 +746,17 @@ static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
/* no more packets: really terminates parsing */ /* no more packets: really terminates parsing */
return ret; return ret;
} }
st = s->streams[s->cur_pkt.stream_index];
/* convert the packet time stamp units and handle wrapping */ /* convert the packet time stamp units and handle wrapping */
s->cur_pkt.pts = convert_timestamp_units(s, s->cur_pkt.pts = convert_timestamp_units(st,
&s->last_pkt_pts, &s->last_pkt_pts_frac, &st->last_pkt_pts, &st->last_pkt_pts_frac,
&s->last_pkt_stream_pts, &st->last_pkt_stream_pts,
s->cur_pkt.pts); s->cur_pkt.pts);
s->cur_pkt.dts = convert_timestamp_units(s, s->cur_pkt.dts = convert_timestamp_units(st,
&s->last_pkt_dts, &s->last_pkt_dts_frac, &st->last_pkt_dts, &st->last_pkt_dts_frac,
&s->last_pkt_stream_dts, &st->last_pkt_stream_dts,
s->cur_pkt.dts); s->cur_pkt.dts);
#if 0 #if 0
if (s->cur_pkt.stream_index == 0) { if (s->cur_pkt.stream_index == 0) {
@ -772,14 +768,10 @@ static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
(double)s->cur_pkt.dts / AV_TIME_BASE); (double)s->cur_pkt.dts / AV_TIME_BASE);
} }
#endif #endif
/* duration field */ /* duration field */
if (s->cur_pkt.duration != 0) { s->cur_pkt.duration = av_rescale(s->cur_pkt.duration, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
s->cur_pkt.duration = ((int64_t)s->cur_pkt.duration * AV_TIME_BASE * s->pts_num) /
s->pts_den;
}
st = s->streams[s->cur_pkt.stream_index];
s->cur_st = st; s->cur_st = st;
s->cur_ptr = s->cur_pkt.data; s->cur_ptr = s->cur_pkt.data;
s->cur_len = s->cur_pkt.size; s->cur_len = s->cur_pkt.size;
@ -1355,7 +1347,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic)
st = ic->streams[pkt->stream_index]; st = ic->streams[pkt->stream_index];
if (pkt->pts != AV_NOPTS_VALUE) { if (pkt->pts != AV_NOPTS_VALUE) {
if (st->start_time == AV_NOPTS_VALUE) if (st->start_time == AV_NOPTS_VALUE)
st->start_time = (int64_t)((double)pkt->pts * ic->pts_num * (double)AV_TIME_BASE / ic->pts_den); st->start_time = av_rescale(pkt->pts, st->time_base.num * (int64_t)AV_TIME_BASE, st->time_base.den);
} }
av_free_packet(pkt); av_free_packet(pkt);
} }
@ -1398,7 +1390,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic)
read_size += pkt->size; read_size += pkt->size;
st = ic->streams[pkt->stream_index]; st = ic->streams[pkt->stream_index];
if (pkt->pts != AV_NOPTS_VALUE) { if (pkt->pts != AV_NOPTS_VALUE) {
end_time = (int64_t)((double)pkt->pts * ic->pts_num * (double)AV_TIME_BASE / ic->pts_den); end_time = av_rescale(pkt->pts, st->time_base.num * (int64_t)AV_TIME_BASE, st->time_base.den);
duration = end_time - st->start_time; duration = end_time - st->start_time;
if (duration > 0) { if (duration > 0) {
if (st->duration == AV_NOPTS_VALUE || if (st->duration == AV_NOPTS_VALUE ||
@ -1776,6 +1768,14 @@ AVStream *av_new_stream(AVFormatContext *s, int id)
st->id = id; st->id = id;
st->start_time = AV_NOPTS_VALUE; st->start_time = AV_NOPTS_VALUE;
st->duration = AV_NOPTS_VALUE; st->duration = AV_NOPTS_VALUE;
/* default pts settings is MPEG like */
av_set_pts_info(st, 33, 1, 90000);
st->last_pkt_pts = AV_NOPTS_VALUE;
st->last_pkt_dts = AV_NOPTS_VALUE;
st->last_pkt_stream_pts = AV_NOPTS_VALUE;
st->last_pkt_stream_dts = AV_NOPTS_VALUE;
s->streams[s->nb_streams++] = st; s->streams[s->nb_streams++] = st;
return st; return st;
} }
@ -1814,8 +1814,6 @@ int av_write_header(AVFormatContext *s)
int ret, i; int ret, i;
AVStream *st; AVStream *st;
/* default pts settings is MPEG like */
av_set_pts_info(s, 33, 1, 90000);
ret = s->oformat->write_header(s); ret = s->oformat->write_header(s);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -1827,11 +1825,11 @@ int av_write_header(AVFormatContext *s)
switch (st->codec.codec_type) { switch (st->codec.codec_type) {
case CODEC_TYPE_AUDIO: case CODEC_TYPE_AUDIO:
av_frac_init(&st->pts, 0, 0, av_frac_init(&st->pts, 0, 0,
(int64_t)s->pts_num * st->codec.sample_rate); (int64_t)st->time_base.num * st->codec.sample_rate);
break; break;
case CODEC_TYPE_VIDEO: case CODEC_TYPE_VIDEO:
av_frac_init(&st->pts, 0, 0, av_frac_init(&st->pts, 0, 0,
(int64_t)s->pts_num * st->codec.frame_rate); (int64_t)st->time_base.num * st->codec.frame_rate);
break; break;
default: default:
break; break;
@ -1858,7 +1856,7 @@ int av_write_frame(AVFormatContext *s, int stream_index, const uint8_t *buf,
int ret, frame_size; int ret, frame_size;
st = s->streams[stream_index]; st = s->streams[stream_index];
pts_mask = (1LL << s->pts_wrap_bits) - 1; pts_mask = (1LL << st->pts_wrap_bits) - 1;
/* HACK/FIXME we skip all zero size audio packets so a encoder can pass pts by outputing zero size packets */ /* HACK/FIXME we skip all zero size audio packets so a encoder can pass pts by outputing zero size packets */
if(st->codec.codec_type==CODEC_TYPE_AUDIO && size==0) if(st->codec.codec_type==CODEC_TYPE_AUDIO && size==0)
@ -1878,13 +1876,11 @@ int av_write_frame(AVFormatContext *s, int stream_index, const uint8_t *buf,
/* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay, /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay,
but it would be better if we had the real timestamps from the encoder */ but it would be better if we had the real timestamps from the encoder */
if (frame_size >= 0 && (size || st->pts.num!=st->pts.den>>1 || st->pts.val)) { if (frame_size >= 0 && (size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
av_frac_add(&st->pts, av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
(int64_t)s->pts_den * frame_size);
} }
break; break;
case CODEC_TYPE_VIDEO: case CODEC_TYPE_VIDEO:
av_frac_add(&st->pts, av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec.frame_rate_base);
(int64_t)s->pts_den * st->codec.frame_rate_base);
break; break;
default: default:
break; break;
@ -2375,12 +2371,12 @@ void url_split(char *proto, int proto_size,
* @param pts_num numerator to convert to seconds (MPEG: 1) * @param pts_num numerator to convert to seconds (MPEG: 1)
* @param pts_den denominator to convert to seconds (MPEG: 90000) * @param pts_den denominator to convert to seconds (MPEG: 90000)
*/ */
void av_set_pts_info(AVFormatContext *s, int pts_wrap_bits, void av_set_pts_info(AVStream *s, int pts_wrap_bits,
int pts_num, int pts_den) int pts_num, int pts_den)
{ {
s->pts_wrap_bits = pts_wrap_bits; s->pts_wrap_bits = pts_wrap_bits;
s->pts_num = pts_num; s->time_base.num = pts_num;
s->pts_den = pts_den; s->time_base.den = pts_den;
} }
/* fraction handling */ /* fraction handling */

@ -233,6 +233,7 @@ static int wc3_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
wc3->video_stream_index = st->index; wc3->video_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_VIDEO; st->codec.codec_type = CODEC_TYPE_VIDEO;
st->codec.codec_id = CODEC_ID_XAN_WC3; st->codec.codec_id = CODEC_ID_XAN_WC3;
@ -246,6 +247,7 @@ static int wc3_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
wc3->audio_stream_index = st->index; wc3->audio_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_AUDIO; st->codec.codec_type = CODEC_TYPE_AUDIO;
st->codec.codec_id = CODEC_ID_PCM_S16LE; st->codec.codec_id = CODEC_ID_PCM_S16LE;
@ -257,10 +259,6 @@ static int wc3_read_header(AVFormatContext *s,
st->codec.bits_per_sample; st->codec.bits_per_sample;
st->codec.block_align = WC3_AUDIO_BITS * WC3_AUDIO_CHANNELS; st->codec.block_align = WC3_AUDIO_BITS * WC3_AUDIO_CHANNELS;
/* set the pts reference (1 pts = 1/90000) */
s->pts_num = 1;
s->pts_den = 90000;
return 0; return 0;
} }

@ -131,14 +131,11 @@ static int wsaud_read_header(AVFormatContext *s,
/* flag 1 indicates 16 bit audio */ /* flag 1 indicates 16 bit audio */
wsaud->audio_bits = (((header[10] & 0x2) >> 1) + 1) * 8; wsaud->audio_bits = (((header[10] & 0x2) >> 1) + 1) * 8;
/* set the pts reference the same as the sample rate */
s->pts_num = 1;
s->pts_den = wsaud->audio_samplerate;
/* initialize the audio decoder stream */ /* initialize the audio decoder stream */
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, wsaud->audio_samplerate);
st->codec.codec_type = CODEC_TYPE_AUDIO; st->codec.codec_type = CODEC_TYPE_AUDIO;
st->codec.codec_id = wsaud->audio_type; st->codec.codec_id = wsaud->audio_type;
st->codec.codec_tag = 0; /* no tag */ st->codec.codec_tag = 0; /* no tag */
@ -222,14 +219,11 @@ static int wsvqa_read_header(AVFormatContext *s,
unsigned int chunk_tag; unsigned int chunk_tag;
unsigned int chunk_size; unsigned int chunk_size;
/* set the pts reference (1 pts = 1/90000) */
s->pts_num = 1;
s->pts_den = 90000;
/* initialize the video decoder stream */ /* initialize the video decoder stream */
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
wsvqa->video_stream_index = st->index; wsvqa->video_stream_index = st->index;
st->codec.codec_type = CODEC_TYPE_VIDEO; st->codec.codec_type = CODEC_TYPE_VIDEO;
st->codec.codec_id = CODEC_ID_WS_VQA; st->codec.codec_id = CODEC_ID_WS_VQA;
@ -255,6 +249,7 @@ static int wsvqa_read_header(AVFormatContext *s,
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
av_set_pts_info(st, 33, 1, 90000);
st->codec.codec_type = CODEC_TYPE_AUDIO; st->codec.codec_type = CODEC_TYPE_AUDIO;
st->codec.codec_id = CODEC_ID_ADPCM_IMA_WS; st->codec.codec_id = CODEC_ID_ADPCM_IMA_WS;
st->codec.codec_tag = 0; /* no tag */ st->codec.codec_tag = 0; /* no tag */

Loading…
Cancel
Save