From: Michal Sojka Date: Wed, 5 May 2010 23:14:29 +0000 (+0200) Subject: Started implementation of "correct" O_DIRECT handling X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/ffmpeg.git/commitdiff_plain/5483685f884879c32edbf988ce11a7fb6f6bfb41 Started implementation of "correct" O_DIRECT handling We still need to implement fseek(). --- diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index f270139a9..491e7c76d 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -24,6 +24,8 @@ #include "avformat.h" #include "avio.h" #include +#include +#include #define IO_BUFFER_SIZE 32768 @@ -77,22 +79,36 @@ ByteIOContext *av_alloc_put_byte( return s; } +#define BLOCK_SIZE 512 + static void flush_buffer(ByteIOContext *s) { + size_t data_len = s->buf_ptr - s->buffer; + size_t to_write = (data_len + BLOCK_SIZE - 1) & ~(BLOCK_SIZE - 1); + int64_t res = AVERROR(EPIPE); + av_log(NULL, AV_LOG_ERROR, "YYY dl=%u, tw=%u\n", data_len, to_write); if (s->buf_ptr > s->buffer) { if (s->write_packet && !s->error){ - int ret= s->write_packet(s->opaque, s->buffer, s->buf_ptr - s->buffer); + int ret= s->write_packet(s->opaque, s->buffer, to_write); if(ret < 0){ s->error = ret; } } if(s->update_checksum){ + av_log(NULL, AV_LOG_ERROR, "Checksumming not implemented in O_DIRECT patch\n"); s->checksum= s->update_checksum(s->checksum, s->checksum_ptr, s->buf_ptr - s->checksum_ptr); s->checksum_ptr= s->buffer; } - s->pos += s->buf_ptr - s->buffer; + s->pos += to_write - BLOCK_SIZE; + memcpy(s->buffer, &s->buffer[to_write], data_len - to_write + BLOCK_SIZE); + s->buf_ptr -= to_write - BLOCK_SIZE; + + if (s->seek) + res = s->seek(s->opaque, s->pos, SEEK_SET); + if (res < 0) + av_log(NULL, AV_LOG_ERROR, "seek error inside flush_buffer: %lld\n", res); + av_log(NULL, AV_LOG_ERROR, "ZZZ tw=%u, pos=%d\n", to_write, s->pos); } - s->buf_ptr = s->buffer; } void put_byte(ByteIOContext *s, int b) @@ -146,6 +162,8 @@ int64_t url_fseek(ByteIOContext *s, int64_t offset, int whence) return offset1; offset += offset1; } + av_log(NULL, AV_LOG_ERROR, "SEEK to %llu\n", offset); + offset1 = offset - pos; if (!s->must_flush && offset1 >= 0 && offset1 <= (s->buf_end - s->buffer)) { @@ -167,6 +185,7 @@ int64_t url_fseek(ByteIOContext *s, int64_t offset, int whence) s->must_flush = 1; } #endif /* CONFIG_MUXERS || CONFIG_NETWORK */ +#warning TODO read the whole block from the file to the buffer if (!s->seek || (res = s->seek(s->opaque, offset, SEEK_SET)) < 0) return res; if (!s->write_flag) @@ -538,7 +557,8 @@ int url_fdopen(ByteIOContext **s, URLContext *h) } else { buffer_size = IO_BUFFER_SIZE; } - buffer = av_malloc(buffer_size); + buffer_size = 2*buffer_size+BLOCK_SIZE; + buffer = memalign(sysconf(_SC_PAGESIZE), buffer_size); if (!buffer) return AVERROR(ENOMEM); diff --git a/libavformat/file.c b/libavformat/file.c index da0ce1509..5cc887d1c 100644 --- a/libavformat/file.c +++ b/libavformat/file.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#define _GNU_SOURCE #include "libavutil/avstring.h" #include "avformat.h" #include @@ -50,6 +51,7 @@ static int file_open(URLContext *h, const char *filename, int flags) #ifdef O_BINARY access |= O_BINARY; #endif + access |= O_DIRECT; fd = open(filename, access, 0666); if (fd < 0) return AVERROR(ENOENT);