[FFmpeg-devel] [PATCH v2 24/36] lavc/cbs: Add JPEG support

Mark Thompson sw at jkqxz.net
Sun Jun 17 16:59:44 EEST 2018


On 15/06/18 01:52, Xiang, Haihao wrote:
> On Fri, 2018-06-08 at 00:43 +0100, Mark Thompson wrote:
>> ---
>>  configure                             |   2 +
>>  libavcodec/Makefile                   |   1 +
>>  libavcodec/cbs.c                      |   6 +
>>  libavcodec/cbs_internal.h             |   1 +
>>  libavcodec/cbs_jpeg.c                 | 513
>> ++++++++++++++++++++++++++++++++++
>>  libavcodec/cbs_jpeg.h                 | 128 +++++++++
>>  libavcodec/cbs_jpeg_syntax_template.c | 191 +++++++++++++
>>  7 files changed, 842 insertions(+)
>>  create mode 100644 libavcodec/cbs_jpeg.c
>>  create mode 100644 libavcodec/cbs_jpeg.h
>>  create mode 100644 libavcodec/cbs_jpeg_syntax_template.c
>>
>> ...
>> diff --git a/libavcodec/cbs_jpeg.c b/libavcodec/cbs_jpeg.c
>> new file mode 100644
>> index 0000000000..365db73394
>> --- /dev/null
>> +++ b/libavcodec/cbs_jpeg.c
>> ...
>> +static int cbs_jpeg_read_unit(CodedBitstreamContext *ctx,
>> +                              CodedBitstreamUnit *unit)
>> +{
>> +    GetBitContext gbc;
>> +    int err;
>> +
>> +    err = init_get_bits(&gbc, unit->data, 8 * unit->data_size);
>> +    if (err < 0)
>> +        return err;
>> +
>> +    if (unit->type >= JPEG_MARKER_SOF0 &&
>> +        unit->type <= JPEG_MARKER_SOF3) {
>> +        err = ff_cbs_alloc_unit_content(ctx, unit,
>> +                                        sizeof(JPEGRawFrameHeader),
>> +                                        NULL);
>> +        if (err < 0)
>> +            return err;
>> +
>> +        err = cbs_jpeg_read_frame_header(ctx, &gbc, unit->content);
>> +        if (err < 0)
>> +            return err;
>> +
>> +    } else if (unit->type >= JPEG_MARKER_APPN &&
>> +               unit->type <= JPEG_MARKER_APPN + 15) {
>> +        err = ff_cbs_alloc_unit_content(ctx, unit,
>> +                                        sizeof(JPEGRawApplicationData),
>> +                                        &cbs_jpeg_free_application_data);
>> +        if (err < 0)
>> +            return err;
>> +
>> +        err = cbs_jpeg_read_application_data(ctx, &gbc, unit->content);
>> +        if (err < 0)
>> +            return err;
>> +
>> +    } else if (unit->type == JPEG_MARKER_SOS) {
>> +        JPEGRawScan *scan;
>> +        int pos;
>> +
>> +        err = ff_cbs_alloc_unit_content(ctx, unit,
>> +                                        sizeof(JPEGRawScan),
>> +                                        &cbs_jpeg_free_scan);
>> +        if (err < 0)
>> +            return err;
>> +        scan = unit->content;
>> +
>> +        err = cbs_jpeg_read_scan_header(ctx, &gbc, &scan->header);
>> +        if (err < 0)
>> +            return err;
>> +
>> +        pos = get_bits_count(&gbc);
>> +        av_assert0(pos % 8 == 0);
>> +        if (pos > 0) {
>> +            scan->data_size = unit->data_size - pos / 8;
>> +            scan->data_ref  = av_buffer_ref(unit->data_ref);
>> +            if (!scan->data_ref)
>> +                return AVERROR(ENOMEM);
>> +            scan->data = unit->data + pos / 8;
>> +        }
>> +
>> +    } else {
>> +        switch (unit->type) {
>> +#define SEGMENT(marker, type, func) \
>> +        case JPEG_MARKER_ ## marker: \
>> +            { \
>> +                err = ff_cbs_alloc_unit_content(ctx, unit, \
>> +                                                sizeof(type), NULL); \
>> +                if (err < 0) \
>> +                    return err; \
>> +                err = cbs_jpeg_read_ ## func(ctx, &gbc, unit->content); \
>> +                if (err < 0) \
>> +                    return err; \
>> +            } \
>> +            break
>> +            SEGMENT(DQT, JPEGRawQuantisationTableSpecification, dqt);
>> +            SEGMENT(DHT, JPEGRawHuffmanTableSpecification,      dht);
>> +            SEGMENT(COM, JPEGRawComment,                    comment);
> 
> A free function should be provided for JPEGRawComment as JPEGRawComment includes
> a AVBufferRef pointer. 

Yep, fixed.

>> +#undef SEGMENT
>> +        default:
>> +            return AVERROR(ENOSYS);
>> +        }
>> +    }
>> +
>> +    return 0;
>> +}
>> ...

Thanks,

- Mark


More information about the ffmpeg-devel mailing list