+static int decode_byterun2(uint8_t *dst, int height, int line_size,
+ GetByteContext *gb)
+{
+ GetByteContext cmds;
+ unsigned count;
+ int i, y_pos = 0, x_pos = 0;
+
+ if (bytestream2_get_be32(gb) != MKBETAG('V', 'D', 'A', 'T'))
+ return 0;
+
+ bytestream2_skip(gb, 4);
+ count = bytestream2_get_be16(gb) - 2;
+ if (bytestream2_get_bytes_left(gb) < count)
+ return 0;
+
+ bytestream2_init(&cmds, gb->buffer, count);
+ bytestream2_skip(gb, count);
+
+ for (i = 0; i < count && x_pos < line_size; i++) {
+ int8_t cmd = bytestream2_get_byte(&cmds);
+ int l, r;
+
+ if (cmd == 0) {
+ l = bytestream2_get_be16(gb);
+ while (l-- > 0 && x_pos < line_size) {
+ dst[x_pos + y_pos * line_size ] = bytestream2_get_byte(gb);
+ dst[x_pos + y_pos++ * line_size + 1] = bytestream2_get_byte(gb);
+ if (y_pos >= height) {
+ y_pos = 0;
+ x_pos += 2;
+ }
+ }
+ } else if (cmd < 0) {
+ l = -cmd;
+ while (l-- > 0 && x_pos < line_size) {
+ dst[x_pos + y_pos * line_size ] = bytestream2_get_byte(gb);
+ dst[x_pos + y_pos++ * line_size + 1] = bytestream2_get_byte(gb);
+ if (y_pos >= height) {
+ y_pos = 0;
+ x_pos += 2;
+ }
+ }
+ } else if (cmd == 1) {
+ l = bytestream2_get_be16(gb);
+ r = bytestream2_get_be16(gb);
+ while (l-- > 0 && x_pos < line_size) {
+ dst[x_pos + y_pos * line_size ] = r >> 8;
+ dst[x_pos + y_pos++ * line_size + 1] = r & 0xFF;
+ if (y_pos >= height) {
+ y_pos = 0;
+ x_pos += 2;
+ }
+ }
+ } else {
+ l = cmd;
+ r = bytestream2_get_be16(gb);
+ while (l-- > 0 && x_pos < line_size) {
+ dst[x_pos + y_pos * line_size ] = r >> 8;
+ dst[x_pos + y_pos++ * line_size + 1] = r & 0xFF;
+ if (y_pos >= height) {
+ y_pos = 0;
+ x_pos += 2;
+ }
+ }
+ }
+ }
+
+ return bytestream2_tell(gb);
+}
+