summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2008-06-07 00:49:03 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2008-06-07 00:49:03 +0000
commit2940b38ef2488f3ad84421cab0f7dc1c13f043fb (patch)
tree5219f9b014e14ef939d57ee0e92c7409ad4e6b3c /libavformat
parentc07d64c8900e845271f81285968d0791613ff6c7 (diff)
fix pts handling in ffm
Originally committed as revision 13683 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/ffm.h5
-rw-r--r--libavformat/ffmdec.c6
-rw-r--r--libavformat/ffmenc.c27
3 files changed, 9 insertions, 29 deletions
diff --git a/libavformat/ffm.h b/libavformat/ffm.h
index 83cfdb600d..ebbf992480 100644
--- a/libavformat/ffm.h
+++ b/libavformat/ffm.h
@@ -32,10 +32,6 @@
#define FRAME_HEADER_SIZE 8
#define FLAG_KEY_FRAME 0x01
-typedef struct FFMStream {
- int64_t pts;
-} FFMStream;
-
enum {
READ_HEADER,
READ_DATA,
@@ -55,6 +51,7 @@ typedef struct FFMContext {
int64_t pts;
uint8_t *packet_ptr, *packet_end;
uint8_t packet[FFM_PACKET_SIZE];
+ int64_t start_time;
} FFMContext;
#endif /* FFMPEG_FFM_H */
diff --git a/libavformat/ffmdec.c b/libavformat/ffmdec.c
index 9e1d57f3d2..9c0ea89eb4 100644
--- a/libavformat/ffmdec.c
+++ b/libavformat/ffmdec.c
@@ -232,7 +232,6 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
{
FFMContext *ffm = s->priv_data;
AVStream *st;
- FFMStream *fst;
ByteIOContext *pb = s->pb;
AVCodecContext *codec;
int i, nb_streams;
@@ -263,15 +262,10 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
st = av_new_stream(s, 0);
if (!st)
goto fail;
- fst = av_mallocz(sizeof(FFMStream));
- if (!fst)
- goto fail;
s->streams[i] = st;
av_set_pts_info(st, 64, 1, 1000000);
- st->priv_data = fst;
-
codec = st->codec;
/* generic info */
codec->codec_id = get_be32(pb);
diff --git a/libavformat/ffmenc.c b/libavformat/ffmenc.c
index e4f7adf540..c07beb989d 100644
--- a/libavformat/ffmenc.c
+++ b/libavformat/ffmenc.c
@@ -92,7 +92,6 @@ static int ffm_write_header(AVFormatContext *s)
{
FFMContext *ffm = s->priv_data;
AVStream *st;
- FFMStream *fst;
ByteIOContext *pb = s->pb;
AVCodecContext *codec;
int bit_rate, i;
@@ -116,11 +115,7 @@ static int ffm_write_header(AVFormatContext *s)
/* list of streams */
for(i=0;i<s->nb_streams;i++) {
st = s->streams[i];
- fst = av_mallocz(sizeof(FFMStream));
- if (!fst)
- goto fail;
av_set_pts_info(st, 64, 1, 1000000);
- st->priv_data = fst;
codec = st->codec;
/* generic info */
@@ -176,13 +171,14 @@ static int ffm_write_header(AVFormatContext *s)
default:
return -1;
}
- /* hack to have real time */
- if (ffm_nopts)
- fst->pts = 0;
- else
- fst->pts = av_gettime();
}
+ /* hack to have real time */
+ if (ffm_nopts)
+ ffm->start_time = 0;
+ else
+ ffm->start_time = av_gettime();
+
/* flush until end of block reached */
while ((url_ftell(pb) % ffm->packet_size) != 0)
put_byte(pb, 0);
@@ -198,22 +194,16 @@ static int ffm_write_header(AVFormatContext *s)
ffm->first_packet = 1;
return 0;
- fail:
- for(i=0;i<s->nb_streams;i++) {
- st = s->streams[i];
- av_freep(&st->priv_data);
- }
- return -1;
}
static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt)
{
+ FFMContext *ffm = s->priv_data;
AVStream *st = s->streams[pkt->stream_index];
- FFMStream *fst = st->priv_data;
int64_t pts;
uint8_t header[FRAME_HEADER_SIZE];
- pts = fst->pts;
+ pts = ffm->start_time + pkt->pts;
/* packet size & key_frame */
header[0] = pkt->stream_index;
header[1] = 0;
@@ -224,7 +214,6 @@ static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt)
ffm_write_data(s, header, FRAME_HEADER_SIZE, pts, 1);
ffm_write_data(s, pkt->data, pkt->size, pts, 0);
- fst->pts += pkt->duration;
return 0;
}