|
@@ -29,13 +29,20 @@
|
|
|
#include "avio.h"
|
|
|
#include "avio_internal.h"
|
|
|
|
|
|
-int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size)
|
|
|
+static int av1_filter_obus(AVIOContext *pb, const uint8_t *buf,
|
|
|
+ int size, int *offset)
|
|
|
{
|
|
|
- const uint8_t *end = buf + size;
|
|
|
+ const uint8_t *start = buf, *end = buf + size;
|
|
|
int64_t obu_size;
|
|
|
- int start_pos, type, temporal_id, spatial_id;
|
|
|
-
|
|
|
- size = 0;
|
|
|
+ int off, start_pos, type, temporal_id, spatial_id;
|
|
|
+ enum {
|
|
|
+ START_NOT_FOUND,
|
|
|
+ START_FOUND,
|
|
|
+ END_FOUND,
|
|
|
+ OFFSET_IMPOSSIBLE,
|
|
|
+ } state = START_NOT_FOUND;
|
|
|
+
|
|
|
+ off = size = 0;
|
|
|
while (buf < end) {
|
|
|
int len = parse_obu_header(buf, end - buf, &obu_size, &start_pos,
|
|
|
&type, &temporal_id, &spatial_id);
|
|
@@ -47,8 +54,16 @@ int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size)
|
|
|
case AV1_OBU_REDUNDANT_FRAME_HEADER:
|
|
|
case AV1_OBU_TILE_LIST:
|
|
|
case AV1_OBU_PADDING:
|
|
|
+ if (state == START_FOUND)
|
|
|
+ state = END_FOUND;
|
|
|
break;
|
|
|
default:
|
|
|
+ if (state == START_NOT_FOUND) {
|
|
|
+ off = buf - start;
|
|
|
+ state = START_FOUND;
|
|
|
+ } else if (state == END_FOUND) {
|
|
|
+ state = OFFSET_IMPOSSIBLE;
|
|
|
+ }
|
|
|
if (pb)
|
|
|
avio_write(pb, buf, len);
|
|
|
size += len;
|
|
@@ -57,19 +72,35 @@ int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size)
|
|
|
buf += len;
|
|
|
}
|
|
|
|
|
|
+ if (offset)
|
|
|
+ *offset = state != OFFSET_IMPOSSIBLE ? off : -1;
|
|
|
+
|
|
|
return size;
|
|
|
}
|
|
|
|
|
|
-int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out, int *size)
|
|
|
+int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size)
|
|
|
+{
|
|
|
+ return av1_filter_obus(pb, buf, size, NULL);
|
|
|
+}
|
|
|
+
|
|
|
+int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out,
|
|
|
+ int *size, int *offset)
|
|
|
{
|
|
|
AVIOContext pb;
|
|
|
uint8_t *buf;
|
|
|
- int len, ret;
|
|
|
+ int len, off, ret;
|
|
|
|
|
|
- len = ret = ff_av1_filter_obus(NULL, in, *size);
|
|
|
+ len = ret = av1_filter_obus(NULL, in, *size, &off);
|
|
|
if (ret < 0) {
|
|
|
return ret;
|
|
|
}
|
|
|
+ if (off >= 0) {
|
|
|
+ *out = (uint8_t *)in;
|
|
|
+ *size = len;
|
|
|
+ *offset = off;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
buf = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE);
|
|
|
if (!buf)
|
|
@@ -77,13 +108,14 @@ int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out, int *size)
|
|
|
|
|
|
ffio_init_context(&pb, buf, len, 1, NULL, NULL, NULL, NULL);
|
|
|
|
|
|
- ret = ff_av1_filter_obus(&pb, in, *size);
|
|
|
+ ret = av1_filter_obus(&pb, in, *size, NULL);
|
|
|
av_assert1(ret == len);
|
|
|
|
|
|
memset(buf + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
|
|
|
|
|
*out = buf;
|
|
|
*size = len;
|
|
|
+ *offset = 0;
|
|
|
|
|
|
return 0;
|
|
|
}
|