It will be useful in the following commits.
Anton Khirnov authored on 2016/02/19 22:29:10... | ... |
@@ -40,10 +40,15 @@ |
40 | 40 |
*/ |
41 | 41 |
#define SHORT_SEEK_THRESHOLD 4096 |
42 | 42 |
|
43 |
+typedef struct AVIOInternal { |
|
44 |
+ URLContext *h; |
|
45 |
+} AVIOInternal; |
|
46 |
+ |
|
43 | 47 |
static void *ff_avio_child_next(void *obj, void *prev) |
44 | 48 |
{ |
45 | 49 |
AVIOContext *s = obj; |
46 |
- return prev ? NULL : s->opaque; |
|
50 |
+ AVIOInternal *internal = s->opaque; |
|
51 |
+ return prev ? NULL : internal->h; |
|
47 | 52 |
} |
48 | 53 |
|
49 | 54 |
static const AVClass *ff_avio_child_class_next(const AVClass *prev) |
... | ... |
@@ -690,9 +695,44 @@ uint64_t ffio_read_varlen(AVIOContext *bc){ |
690 | 690 |
return val; |
691 | 691 |
} |
692 | 692 |
|
693 |
+static int io_read_packet(void *opaque, uint8_t *buf, int buf_size) |
|
694 |
+{ |
|
695 |
+ AVIOInternal *internal = opaque; |
|
696 |
+ return ffurl_read(internal->h, buf, buf_size); |
|
697 |
+} |
|
698 |
+ |
|
699 |
+static int io_write_packet(void *opaque, uint8_t *buf, int buf_size) |
|
700 |
+{ |
|
701 |
+ AVIOInternal *internal = opaque; |
|
702 |
+ return ffurl_write(internal->h, buf, buf_size); |
|
703 |
+} |
|
704 |
+ |
|
705 |
+static int64_t io_seek(void *opaque, int64_t offset, int whence) |
|
706 |
+{ |
|
707 |
+ AVIOInternal *internal = opaque; |
|
708 |
+ return ffurl_seek(internal->h, offset, whence); |
|
709 |
+} |
|
710 |
+ |
|
711 |
+static int io_read_pause(void *opaque, int pause) |
|
712 |
+{ |
|
713 |
+ AVIOInternal *internal = opaque; |
|
714 |
+ if (!internal->h->prot->url_read_pause) |
|
715 |
+ return AVERROR(ENOSYS); |
|
716 |
+ return internal->h->prot->url_read_pause(internal->h, pause); |
|
717 |
+} |
|
718 |
+ |
|
719 |
+static int64_t io_read_seek(void *opaque, int stream_index, int64_t timestamp, int flags) |
|
720 |
+{ |
|
721 |
+ AVIOInternal *internal = opaque; |
|
722 |
+ if (!internal->h->prot->url_read_seek) |
|
723 |
+ return AVERROR(ENOSYS); |
|
724 |
+ return internal->h->prot->url_read_seek(internal->h, stream_index, timestamp, flags); |
|
725 |
+} |
|
726 |
+ |
|
693 | 727 |
int ffio_fdopen(AVIOContext **s, URLContext *h) |
694 | 728 |
{ |
695 |
- uint8_t *buffer; |
|
729 |
+ AVIOInternal *internal = NULL; |
|
730 |
+ uint8_t *buffer = NULL; |
|
696 | 731 |
int buffer_size, max_packet_size; |
697 | 732 |
|
698 | 733 |
max_packet_size = h->max_packet_size; |
... | ... |
@@ -705,22 +745,29 @@ int ffio_fdopen(AVIOContext **s, URLContext *h) |
705 | 705 |
if (!buffer) |
706 | 706 |
return AVERROR(ENOMEM); |
707 | 707 |
|
708 |
- *s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE, h, |
|
709 |
- (int (*)(void *, uint8_t *, int)) ffurl_read, |
|
710 |
- (int (*)(void *, uint8_t *, int)) ffurl_write, |
|
711 |
- (int64_t (*)(void *, int64_t, int)) ffurl_seek); |
|
712 |
- if (!*s) { |
|
713 |
- av_free(buffer); |
|
714 |
- return AVERROR(ENOMEM); |
|
715 |
- } |
|
708 |
+ internal = av_mallocz(sizeof(*internal)); |
|
709 |
+ if (!internal) |
|
710 |
+ goto fail; |
|
711 |
+ |
|
712 |
+ internal->h = h; |
|
713 |
+ |
|
714 |
+ *s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE, |
|
715 |
+ internal, io_read_packet, io_write_packet, io_seek); |
|
716 |
+ if (!*s) |
|
717 |
+ goto fail; |
|
718 |
+ |
|
716 | 719 |
(*s)->seekable = h->is_streamed ? 0 : AVIO_SEEKABLE_NORMAL; |
717 | 720 |
(*s)->max_packet_size = max_packet_size; |
718 | 721 |
if(h->prot) { |
719 |
- (*s)->read_pause = (int (*)(void *, int))h->prot->url_read_pause; |
|
720 |
- (*s)->read_seek = (int64_t (*)(void *, int, int64_t, int))h->prot->url_read_seek; |
|
722 |
+ (*s)->read_pause = io_read_pause; |
|
723 |
+ (*s)->read_seek = io_read_seek; |
|
721 | 724 |
} |
722 | 725 |
(*s)->av_class = &ff_avio_class; |
723 | 726 |
return 0; |
727 |
+fail: |
|
728 |
+ av_freep(&internal); |
|
729 |
+ av_freep(&buffer); |
|
730 |
+ return AVERROR(ENOMEM); |
|
724 | 731 |
} |
725 | 732 |
|
726 | 733 |
int ffio_set_buf_size(AVIOContext *s, int buf_size) |
... | ... |
@@ -815,13 +862,17 @@ int avio_open2(AVIOContext **s, const char *filename, int flags, |
815 | 815 |
|
816 | 816 |
int avio_close(AVIOContext *s) |
817 | 817 |
{ |
818 |
+ AVIOInternal *internal; |
|
818 | 819 |
URLContext *h; |
819 | 820 |
|
820 | 821 |
if (!s) |
821 | 822 |
return 0; |
822 | 823 |
|
823 | 824 |
avio_flush(s); |
824 |
- h = s->opaque; |
|
825 |
+ internal = s->opaque; |
|
826 |
+ h = internal->h; |
|
827 |
+ |
|
828 |
+ av_freep(&s->opaque); |
|
825 | 829 |
av_freep(&s->buffer); |
826 | 830 |
av_free(s); |
827 | 831 |
return ffurl_close(h); |
... | ... |
@@ -857,15 +908,14 @@ int avio_pause(AVIOContext *s, int pause) |
857 | 857 |
int64_t avio_seek_time(AVIOContext *s, int stream_index, |
858 | 858 |
int64_t timestamp, int flags) |
859 | 859 |
{ |
860 |
- URLContext *h = s->opaque; |
|
861 | 860 |
int64_t ret; |
862 | 861 |
if (!s->read_seek) |
863 | 862 |
return AVERROR(ENOSYS); |
864 |
- ret = s->read_seek(h, stream_index, timestamp, flags); |
|
863 |
+ ret = s->read_seek(s->opaque, stream_index, timestamp, flags); |
|
865 | 864 |
if (ret >= 0) { |
866 | 865 |
int64_t pos; |
867 | 866 |
s->buf_ptr = s->buf_end; // Flush buffer |
868 |
- pos = s->seek(h, 0, SEEK_CUR); |
|
867 |
+ pos = s->seek(s->opaque, 0, SEEK_CUR); |
|
869 | 868 |
if (pos >= 0) |
870 | 869 |
s->pos = pos; |
871 | 870 |
else if (pos != AVERROR(ENOSYS)) |