Commit 2940b38e authored by Baptiste Coudurier's avatar Baptiste Coudurier

fix pts handling in ffm

Originally committed as revision 13683 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent c07d64c8
...@@ -32,10 +32,6 @@ ...@@ -32,10 +32,6 @@
#define FRAME_HEADER_SIZE 8 #define FRAME_HEADER_SIZE 8
#define FLAG_KEY_FRAME 0x01 #define FLAG_KEY_FRAME 0x01
typedef struct FFMStream {
int64_t pts;
} FFMStream;
enum { enum {
READ_HEADER, READ_HEADER,
READ_DATA, READ_DATA,
...@@ -55,6 +51,7 @@ typedef struct FFMContext { ...@@ -55,6 +51,7 @@ typedef struct FFMContext {
int64_t pts; int64_t pts;
uint8_t *packet_ptr, *packet_end; uint8_t *packet_ptr, *packet_end;
uint8_t packet[FFM_PACKET_SIZE]; uint8_t packet[FFM_PACKET_SIZE];
int64_t start_time;
} FFMContext; } FFMContext;
#endif /* FFMPEG_FFM_H */ #endif /* FFMPEG_FFM_H */
...@@ -232,7 +232,6 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -232,7 +232,6 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
{ {
FFMContext *ffm = s->priv_data; FFMContext *ffm = s->priv_data;
AVStream *st; AVStream *st;
FFMStream *fst;
ByteIOContext *pb = s->pb; ByteIOContext *pb = s->pb;
AVCodecContext *codec; AVCodecContext *codec;
int i, nb_streams; int i, nb_streams;
...@@ -263,15 +262,10 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -263,15 +262,10 @@ static int ffm_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;
fst = av_mallocz(sizeof(FFMStream));
if (!fst)
goto fail;
s->streams[i] = st; s->streams[i] = st;
av_set_pts_info(st, 64, 1, 1000000); av_set_pts_info(st, 64, 1, 1000000);
st->priv_data = fst;
codec = st->codec; codec = st->codec;
/* generic info */ /* generic info */
codec->codec_id = get_be32(pb); codec->codec_id = get_be32(pb);
......
...@@ -92,7 +92,6 @@ static int ffm_write_header(AVFormatContext *s) ...@@ -92,7 +92,6 @@ static int ffm_write_header(AVFormatContext *s)
{ {
FFMContext *ffm = s->priv_data; FFMContext *ffm = s->priv_data;
AVStream *st; AVStream *st;
FFMStream *fst;
ByteIOContext *pb = s->pb; ByteIOContext *pb = s->pb;
AVCodecContext *codec; AVCodecContext *codec;
int bit_rate, i; int bit_rate, i;
...@@ -116,11 +115,7 @@ static int ffm_write_header(AVFormatContext *s) ...@@ -116,11 +115,7 @@ static int ffm_write_header(AVFormatContext *s)
/* list of streams */ /* list of streams */
for(i=0;i<s->nb_streams;i++) { for(i=0;i<s->nb_streams;i++) {
st = s->streams[i]; st = s->streams[i];
fst = av_mallocz(sizeof(FFMStream));
if (!fst)
goto fail;
av_set_pts_info(st, 64, 1, 1000000); av_set_pts_info(st, 64, 1, 1000000);
st->priv_data = fst;
codec = st->codec; codec = st->codec;
/* generic info */ /* generic info */
...@@ -176,13 +171,14 @@ static int ffm_write_header(AVFormatContext *s) ...@@ -176,13 +171,14 @@ static int ffm_write_header(AVFormatContext *s)
default: default:
return -1; 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 */ /* flush until end of block reached */
while ((url_ftell(pb) % ffm->packet_size) != 0) while ((url_ftell(pb) % ffm->packet_size) != 0)
put_byte(pb, 0); put_byte(pb, 0);
...@@ -198,22 +194,16 @@ static int ffm_write_header(AVFormatContext *s) ...@@ -198,22 +194,16 @@ static int ffm_write_header(AVFormatContext *s)
ffm->first_packet = 1; ffm->first_packet = 1;
return 0; 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) static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt)
{ {
FFMContext *ffm = s->priv_data;
AVStream *st = s->streams[pkt->stream_index]; AVStream *st = s->streams[pkt->stream_index];
FFMStream *fst = st->priv_data;
int64_t pts; int64_t pts;
uint8_t header[FRAME_HEADER_SIZE]; uint8_t header[FRAME_HEADER_SIZE];
pts = fst->pts; pts = ffm->start_time + pkt->pts;
/* packet size & key_frame */ /* packet size & key_frame */
header[0] = pkt->stream_index; header[0] = pkt->stream_index;
header[1] = 0; header[1] = 0;
...@@ -224,7 +214,6 @@ static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -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, header, FRAME_HEADER_SIZE, pts, 1);
ffm_write_data(s, pkt->data, pkt->size, pts, 0); ffm_write_data(s, pkt->data, pkt->size, pts, 0);
fst->pts += pkt->duration;
return 0; return 0;
} }
......
...@@ -15,7 +15,7 @@ bdb7484c68db722f66ba1630cf79844c *./tests/data/b-libav.mpg ...@@ -15,7 +15,7 @@ bdb7484c68db722f66ba1630cf79844c *./tests/data/b-libav.mpg
d6fdeb9f7083cc827f9510c6c4517dc0 *./tests/data/b-libav.swf d6fdeb9f7083cc827f9510c6c4517dc0 *./tests/data/b-libav.swf
335771 ./tests/data/b-libav.swf 335771 ./tests/data/b-libav.swf
./tests/data/b-libav.swf CRC=0xe14e8847 ./tests/data/b-libav.swf CRC=0xe14e8847
745e811e246f3727dc80a7504a18b129 *./tests/data/b-libav.ffm bf28235fdc3bdd77faf251a239b6bc58 *./tests/data/b-libav.ffm
380928 ./tests/data/b-libav.ffm 380928 ./tests/data/b-libav.ffm
./tests/data/b-libav.ffm CRC=0xca8f6870 ./tests/data/b-libav.ffm CRC=0xca8f6870
f8ad5bd78f4d012a8ce9570aa395ac54 *./tests/data/b-libav.flv f8ad5bd78f4d012a8ce9570aa395ac54 *./tests/data/b-libav.flv
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment