You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
do not write ffm write index by default, detect if file is being written and return EOF
Originally committed as revision 18063 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
2
ffmpeg.c
2
ffmpeg.c
@@ -2121,7 +2121,7 @@ static int av_encode(AVFormatContext **output_files,
|
|||||||
/* read a frame from it and output it in the fifo */
|
/* read a frame from it and output it in the fifo */
|
||||||
is = input_files[file_index];
|
is = input_files[file_index];
|
||||||
ret= av_read_frame(is, &pkt);
|
ret= av_read_frame(is, &pkt);
|
||||||
if(ret == AVERROR(EAGAIN) && strcmp(is->iformat->name, "ffm")){
|
if(ret == AVERROR(EAGAIN)){
|
||||||
no_packet[file_index]=1;
|
no_packet[file_index]=1;
|
||||||
no_packet_count++;
|
no_packet_count++;
|
||||||
continue;
|
continue;
|
||||||
|
@@ -66,19 +66,25 @@ static int ffm_is_avail_data(AVFormatContext *s, int size)
|
|||||||
if (size <= len)
|
if (size <= len)
|
||||||
return 1;
|
return 1;
|
||||||
pos = url_ftell(s->pb);
|
pos = url_ftell(s->pb);
|
||||||
|
if (!ffm->write_index) {
|
||||||
|
if (pos == ffm->file_size);
|
||||||
|
return AVERROR_EOF;
|
||||||
|
avail_size = ffm->file_size - pos;
|
||||||
|
} else {
|
||||||
if (pos == ffm->write_index) {
|
if (pos == ffm->write_index) {
|
||||||
/* exactly at the end of stream */
|
/* exactly at the end of stream */
|
||||||
return 0;
|
return AVERROR(EAGAIN);
|
||||||
} else if (pos < ffm->write_index) {
|
} else if (pos < ffm->write_index) {
|
||||||
avail_size = ffm->write_index - pos;
|
avail_size = ffm->write_index - pos;
|
||||||
} else {
|
} else {
|
||||||
avail_size = (ffm->file_size - pos) + (ffm->write_index - FFM_PACKET_SIZE);
|
avail_size = (ffm->file_size - pos) + (ffm->write_index - FFM_PACKET_SIZE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
avail_size = (avail_size / ffm->packet_size) * (ffm->packet_size - FFM_HEADER_SIZE) + len;
|
avail_size = (avail_size / ffm->packet_size) * (ffm->packet_size - FFM_HEADER_SIZE) + len;
|
||||||
if (size <= avail_size)
|
if (size <= avail_size)
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else
|
||||||
return 0;
|
return AVERROR(EAGAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* first is true if we read the frame header */
|
/* first is true if we read the frame header */
|
||||||
@@ -251,7 +257,8 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
/* get also filesize */
|
/* get also filesize */
|
||||||
if (!url_is_streamed(pb)) {
|
if (!url_is_streamed(pb)) {
|
||||||
ffm->file_size = url_fsize(pb);
|
ffm->file_size = url_fsize(pb);
|
||||||
adjust_write_index(s);
|
if (ffm->write_index)
|
||||||
|
adjust_write_index(s);
|
||||||
} else {
|
} else {
|
||||||
ffm->file_size = (UINT64_C(1) << 63) - 1;
|
ffm->file_size = (UINT64_C(1) << 63) - 1;
|
||||||
}
|
}
|
||||||
@@ -360,24 +367,21 @@ static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
{
|
{
|
||||||
int size;
|
int size;
|
||||||
FFMContext *ffm = s->priv_data;
|
FFMContext *ffm = s->priv_data;
|
||||||
int duration;
|
int duration, ret;
|
||||||
|
|
||||||
if (url_fsize(s->pb) == FFM_PACKET_SIZE)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
switch(ffm->read_state) {
|
switch(ffm->read_state) {
|
||||||
case READ_HEADER:
|
case READ_HEADER:
|
||||||
if (!ffm_is_avail_data(s, FRAME_HEADER_SIZE+4)) {
|
if ((ret = ffm_is_avail_data(s, FRAME_HEADER_SIZE+4)) < 0)
|
||||||
return AVERROR(EAGAIN);
|
return ret;
|
||||||
}
|
|
||||||
dprintf(s, "pos=%08"PRIx64" spos=%"PRIx64", write_index=%"PRIx64" size=%"PRIx64"\n",
|
dprintf(s, "pos=%08"PRIx64" spos=%"PRIx64", write_index=%"PRIx64" size=%"PRIx64"\n",
|
||||||
url_ftell(s->pb), s->pb->pos, ffm->write_index, ffm->file_size);
|
url_ftell(s->pb), s->pb->pos, ffm->write_index, ffm->file_size);
|
||||||
if (ffm_read_data(s, ffm->header, FRAME_HEADER_SIZE, 1) !=
|
if (ffm_read_data(s, ffm->header, FRAME_HEADER_SIZE, 1) !=
|
||||||
FRAME_HEADER_SIZE)
|
FRAME_HEADER_SIZE)
|
||||||
return AVERROR(EAGAIN);
|
return -1;
|
||||||
if (ffm->header[1] & FLAG_DTS)
|
if (ffm->header[1] & FLAG_DTS)
|
||||||
if (ffm_read_data(s, ffm->header+16, 4, 1) != 4)
|
if (ffm_read_data(s, ffm->header+16, 4, 1) != 4)
|
||||||
return AVERROR(EAGAIN);
|
return -1;
|
||||||
#if 0
|
#if 0
|
||||||
av_hexdump_log(s, AV_LOG_DEBUG, ffm->header, FRAME_HEADER_SIZE);
|
av_hexdump_log(s, AV_LOG_DEBUG, ffm->header, FRAME_HEADER_SIZE);
|
||||||
#endif
|
#endif
|
||||||
@@ -385,9 +389,8 @@ static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
/* fall thru */
|
/* fall thru */
|
||||||
case READ_DATA:
|
case READ_DATA:
|
||||||
size = AV_RB24(ffm->header + 2);
|
size = AV_RB24(ffm->header + 2);
|
||||||
if (!ffm_is_avail_data(s, size)) {
|
if ((ret = ffm_is_avail_data(s, size)) < 0)
|
||||||
return AVERROR(EAGAIN);
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
duration = AV_RB24(ffm->header + 5);
|
duration = AV_RB24(ffm->header + 5);
|
||||||
|
|
||||||
@@ -397,7 +400,7 @@ static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
av_log(s, AV_LOG_ERROR, "invalid stream index %d\n", pkt->stream_index);
|
av_log(s, AV_LOG_ERROR, "invalid stream index %d\n", pkt->stream_index);
|
||||||
av_free_packet(pkt);
|
av_free_packet(pkt);
|
||||||
ffm->read_state = READ_HEADER;
|
ffm->read_state = READ_HEADER;
|
||||||
return AVERROR(EAGAIN);
|
return -1;
|
||||||
}
|
}
|
||||||
pkt->pos = url_ftell(s->pb);
|
pkt->pos = url_ftell(s->pb);
|
||||||
if (ffm->header[1] & FLAG_KEY_FRAME)
|
if (ffm->header[1] & FLAG_KEY_FRAME)
|
||||||
@@ -407,7 +410,7 @@ static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
if (ffm_read_data(s, pkt->data, size, 0) != size) {
|
if (ffm_read_data(s, pkt->data, size, 0) != size) {
|
||||||
/* bad case: desynchronized packet. we cancel all the packet loading */
|
/* bad case: desynchronized packet. we cancel all the packet loading */
|
||||||
av_free_packet(pkt);
|
av_free_packet(pkt);
|
||||||
return AVERROR(EAGAIN);
|
return -1;
|
||||||
}
|
}
|
||||||
pkt->pts = AV_RB64(ffm->header+8);
|
pkt->pts = AV_RB64(ffm->header+8);
|
||||||
if (ffm->header[1] & FLAG_DTS)
|
if (ffm->header[1] & FLAG_DTS)
|
||||||
|
@@ -93,8 +93,7 @@ static int ffm_write_header(AVFormatContext *s)
|
|||||||
/* header */
|
/* header */
|
||||||
put_le32(pb, MKTAG('F', 'F', 'M', '1'));
|
put_le32(pb, MKTAG('F', 'F', 'M', '1'));
|
||||||
put_be32(pb, ffm->packet_size);
|
put_be32(pb, ffm->packet_size);
|
||||||
/* XXX: store write position in other file ? */
|
put_be64(pb, 0); /* current write position */
|
||||||
put_be64(pb, ffm->packet_size); /* current write position */
|
|
||||||
|
|
||||||
put_be32(pb, s->nb_streams);
|
put_be32(pb, s->nb_streams);
|
||||||
bit_rate = 0;
|
bit_rate = 0;
|
||||||
@@ -224,15 +223,6 @@ static int ffm_write_trailer(AVFormatContext *s)
|
|||||||
|
|
||||||
put_flush_packet(pb);
|
put_flush_packet(pb);
|
||||||
|
|
||||||
if (!url_is_streamed(pb)) {
|
|
||||||
int64_t size;
|
|
||||||
/* update the write offset */
|
|
||||||
size = url_ftell(pb);
|
|
||||||
url_fseek(pb, 8, SEEK_SET);
|
|
||||||
put_be64(pb, size);
|
|
||||||
put_flush_packet(pb);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,9 +21,9 @@ c0cc2ae4df6a8b3df84986929a393116 *./tests/data/b-libav.ts
|
|||||||
1b28a16652bb8ac528b33f7478ca18b6 *./tests/data/b-libav.swf
|
1b28a16652bb8ac528b33f7478ca18b6 *./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
|
||||||
3dbacdc3fccb551f8ab54c32f648e7a8 *./tests/data/b-libav.ffm
|
49d04c063b7741d3ee8f85c92baa69bf *./tests/data/b-libav.ffm
|
||||||
380928 ./tests/data/b-libav.ffm
|
380928 ./tests/data/b-libav.ffm
|
||||||
./tests/data/b-libav.ffm CRC=0x2b71a386
|
./tests/data/b-libav.ffm CRC=0x00000001
|
||||||
8617c30b4e862199555fd75890473e66 *./tests/data/b-libav.flv
|
8617c30b4e862199555fd75890473e66 *./tests/data/b-libav.flv
|
||||||
335833 ./tests/data/b-libav.flv
|
335833 ./tests/data/b-libav.flv
|
||||||
./tests/data/b-libav.flv CRC=0xe14e8847
|
./tests/data/b-libav.flv CRC=0xe14e8847
|
||||||
|
Reference in New Issue
Block a user