mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
7c92eaace2
All cbs-functions to write units share a common pattern: 1. They check whether they have a write buffer (that is used to store the unit's data until the needed size becomes known after writing the unit when a dedicated buffer will be allocated). 2. They use this buffer for a PutBitContext. 3. The (codec-specific) writing takes place through the PutBitContext. 4. The return value is checked. AVERROR(ENOSPC) here always indicates that the buffer was too small and leads to a reallocation of said buffer. 5. The final buffer will be allocated and the data copied. This commit factors this common code out in a single function in cbs.c. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
124 lines
2.9 KiB
C
124 lines
2.9 KiB
C
/*
|
|
* This file is part of FFmpeg.
|
|
*
|
|
* FFmpeg is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* FFmpeg is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with FFmpeg; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef AVCODEC_CBS_JPEG_H
|
|
#define AVCODEC_CBS_JPEG_H
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#include "libavutil/buffer.h"
|
|
|
|
|
|
enum {
|
|
JPEG_MARKER_SOF0 = 0xc0,
|
|
JPEG_MARKER_SOF1 = 0xc1,
|
|
JPEG_MARKER_SOF2 = 0xc2,
|
|
JPEG_MARKER_SOF3 = 0xc3,
|
|
|
|
JPEG_MARKER_DHT = 0xc4,
|
|
JPEG_MARKER_SOI = 0xd8,
|
|
JPEG_MARKER_EOI = 0xd9,
|
|
JPEG_MARKER_SOS = 0xda,
|
|
JPEG_MARKER_DQT = 0xdb,
|
|
|
|
JPEG_MARKER_APPN = 0xe0,
|
|
JPEG_MARKER_JPGN = 0xf0,
|
|
JPEG_MARKER_COM = 0xfe,
|
|
};
|
|
|
|
enum {
|
|
JPEG_MAX_COMPONENTS = 255,
|
|
|
|
JPEG_MAX_HEIGHT = 65535,
|
|
JPEG_MAX_WIDTH = 65535,
|
|
};
|
|
|
|
|
|
typedef struct JPEGRawFrameHeader {
|
|
uint16_t Lf;
|
|
uint8_t P;
|
|
uint16_t Y;
|
|
uint16_t X;
|
|
uint16_t Nf;
|
|
|
|
uint8_t C [JPEG_MAX_COMPONENTS];
|
|
uint8_t H [JPEG_MAX_COMPONENTS];
|
|
uint8_t V [JPEG_MAX_COMPONENTS];
|
|
uint8_t Tq[JPEG_MAX_COMPONENTS];
|
|
} JPEGRawFrameHeader;
|
|
|
|
typedef struct JPEGRawScanHeader {
|
|
uint16_t Ls;
|
|
uint8_t Ns;
|
|
|
|
uint8_t Cs[JPEG_MAX_COMPONENTS];
|
|
uint8_t Td[JPEG_MAX_COMPONENTS];
|
|
uint8_t Ta[JPEG_MAX_COMPONENTS];
|
|
|
|
uint8_t Ss;
|
|
uint8_t Se;
|
|
uint8_t Ah;
|
|
uint8_t Al;
|
|
} JPEGRawScanHeader;
|
|
|
|
typedef struct JPEGRawScan {
|
|
JPEGRawScanHeader header;
|
|
uint8_t *data;
|
|
size_t data_size;
|
|
AVBufferRef *data_ref;
|
|
} JPEGRawScan;
|
|
|
|
typedef struct JPEGRawQuantisationTable {
|
|
uint8_t Pq;
|
|
uint8_t Tq;
|
|
uint16_t Q[64];
|
|
} JPEGRawQuantisationTable;
|
|
|
|
typedef struct JPEGRawQuantisationTableSpecification {
|
|
uint16_t Lq;
|
|
JPEGRawQuantisationTable table[4];
|
|
} JPEGRawQuantisationTableSpecification;
|
|
|
|
typedef struct JPEGRawHuffmanTable {
|
|
uint8_t Tc;
|
|
uint8_t Th;
|
|
uint8_t L[16];
|
|
uint8_t V[224];
|
|
} JPEGRawHuffmanTable;
|
|
|
|
typedef struct JPEGRawHuffmanTableSpecification {
|
|
uint16_t Lh;
|
|
JPEGRawHuffmanTable table[8];
|
|
} JPEGRawHuffmanTableSpecification;
|
|
|
|
typedef struct JPEGRawApplicationData {
|
|
uint16_t Lp;
|
|
uint8_t *Ap;
|
|
AVBufferRef *Ap_ref;
|
|
} JPEGRawApplicationData;
|
|
|
|
typedef struct JPEGRawComment {
|
|
uint16_t Lc;
|
|
uint8_t *Cm;
|
|
AVBufferRef *Cm_ref;
|
|
} JPEGRawComment;
|
|
|
|
|
|
#endif /* AVCODEC_CBS_JPEG_H */
|