diff --git a/libavformat/async.c b/libavformat/async.c index 9172f5d178..a8c8f542c1 100644 --- a/libavformat/async.c +++ b/libavformat/async.c @@ -387,6 +387,9 @@ static const AVOption options[] = { {NULL}, }; +#undef D +#undef OFFSET + static const AVClass async_context_class = { .class_name = "Async", .item_name = av_default_item_name, @@ -413,6 +416,9 @@ typedef struct TestContext { AVClass *class; int64_t logical_pos; int64_t logical_size; + + /* options */ + int opt_read_error; } TestContext; static int async_test_open(URLContext *h, const char *arg, int flags, AVDictionary **options) @@ -434,6 +440,9 @@ static int async_test_read(URLContext *h, unsigned char *buf, int size) int i; int read_len = 0; + if (c->opt_read_error) + return c->opt_read_error; + if (c->logical_pos >= c->logical_size) return AVERROR_EOF; @@ -471,9 +480,22 @@ static int64_t async_test_seek(URLContext *h, int64_t pos, int whence) return new_logical_pos; } +#define OFFSET(x) offsetof(TestContext, x) +#define D AV_OPT_FLAG_DECODING_PARAM + +static const AVOption async_test_options[] = { + { "async-test-read-error", "cause read fail", + OFFSET(opt_read_error), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, .flags = D }, + {NULL}, +}; + +#undef D +#undef OFFSET + static const AVClass async_test_context_class = { .class_name = "Async-Test", .item_name = av_default_item_name, + .option = async_test_options, .version = LIBAVUTIL_VERSION_INT, }; @@ -496,10 +518,14 @@ int main(void) int64_t pos; int64_t read_len; unsigned char buf[4096]; + AVDictionary *opts = NULL; ffurl_register_protocol(&ff_async_protocol); ffurl_register_protocol(&ff_async_test_protocol); + /* + * test normal read + */ ret = ffurl_open(&h, "async:async-test:", AVIO_FLAG_READ, NULL, NULL); printf("open: %d\n", ret); @@ -534,6 +560,9 @@ int main(void) } printf("read: %"PRId64"\n", read_len); + /* + * test normal seek + */ ret = ffurl_read(h, buf, 1); printf("read: %d\n", ret); @@ -568,7 +597,19 @@ int main(void) ret = ffurl_read(h, buf, 1); printf("read: %d\n", ret); + /* + * test read error + */ + ffurl_close(h); + av_dict_set_int(&opts, "async-test-read-error", -10000, 0); + ret = ffurl_open(&h, "async:async-test:", AVIO_FLAG_READ, NULL, &opts); + printf("open: %d\n", ret); + + ret = ffurl_read(h, buf, 1); + printf("read: %d\n", ret); + fail: + av_dict_free(&opts); ffurl_close(h); return 0; } diff --git a/tests/ref/fate/async b/tests/ref/fate/async index 3ab5e8c629..c4c0b0beba 100644 --- a/tests/ref/fate/async +++ b/tests/ref/fate/async @@ -5,3 +5,5 @@ read: 0 seek: 1536 read: 512 read: 0 +open: 0 +read: -10000