#define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
#define u(width, name, range_min, range_max) \
- xu(width, name, range_min, range_max, 0)
+ xu(width, name, range_min, range_max, 0, )
#define us(width, name, sub, range_min, range_max) \
xu(width, name, range_min, range_max, 1, sub)
if (marker == JPEG_MARKER_EOI) {
break;
} else if (marker == JPEG_MARKER_SOS) {
+ next_marker = -1;
for (i = start; i + 1 < frag->data_size; i++) {
if (frag->data[i] != 0xff)
continue;
end = i;
for (++i; i + 1 < frag->data_size &&
frag->data[i] == 0xff; i++);
- if (i + 1 >= frag->data_size) {
- next_marker = -1;
- } else {
+ if (i + 1 < frag->data_size) {
if (frag->data[i] == 0x00)
continue;
next_marker = frag->data[i];
if (marker == JPEG_MARKER_SOS) {
length = AV_RB16(frag->data + start);
+ if (length > end - start)
+ return AVERROR_INVALIDDATA;
+
data_ref = NULL;
data = av_malloc(end - start +
AV_INPUT_BUFFER_PADDING_SIZE);
err = ff_cbs_insert_unit_data(ctx, frag, unit, marker,
data, data_size, data_ref);
- if (err < 0) {
- if (!data_ref)
- av_freep(&data);
+ if (err < 0)
return err;
- }
if (next_marker == -1)
break;
PutBitContext *pbc)
{
JPEGRawScan *scan = unit->content;
- int i, err;
+ int err;
err = cbs_jpeg_write_scan_header(ctx, pbc, &scan->header);
if (err < 0)
if (scan->data_size * 8 > put_bits_left(pbc))
return AVERROR(ENOSPC);
- for (i = 0; i < scan->data_size; i++)
- put_bits(pbc, 8, scan->data[i]);
+ av_assert0(put_bits_count(pbc) % 8 == 0);
+
+ flush_put_bits(pbc);
+
+ memcpy(put_bits_ptr(pbc), scan->data, scan->data_size);
+ skip_put_bytes(pbc, scan->data_size);
}
return 0;