mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-08 10:56:05 +00:00
fix pts handling in ffm
Originally committed as revision 13683 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
c07d64c890
commit
2940b38ef2
@ -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 {
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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
|
|||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user