44 16, 11, 12, 14, 12, 10, 16, 14,
45 13, 14, 18, 17, 16, 19, 24, 40,
46 26, 24, 22, 22, 24, 49, 35, 37,
47 29, 40, 58, 51, 61, 60, 57, 51,
48 56, 55, 64, 72, 92, 78, 64, 68,
49 87, 69, 55, 56, 80, 109, 81, 87,
50 95, 98, 103, 104, 103, 62, 77, 113,
51 121, 112, 100, 120, 92, 101, 103, 99,
54 17, 18, 18, 24, 21, 24, 47, 26,
55 26, 47, 99, 66, 56, 66, 99, 99,
56 99, 99, 99, 99, 99, 99, 99, 99,
57 99, 99, 99, 99, 99, 99, 99, 99,
58 99, 99, 99, 99, 99, 99, 99, 99,
59 99, 99, 99, 99, 99, 99, 99, 99,
60 99, 99, 99, 99, 99, 99, 99, 99,
61 99, 99, 99, 99, 99, 99, 99, 99
70 int table_id,
const uint8_t *bits_table,
75 bytestream2_put_byte(p, table_class << 4 | table_id);
77 for (i = 1; i <= 16; i++) {
79 bytestream2_put_byte(p, bits_table[i]);
82 for (i = 0; i < n; i++) {
83 bytestream2_put_byte(p, value_table[i]);
90 bytestream2_put_byte(pbc, 0xff);
91 bytestream2_put_byte(pbc, code);
95 uint32_t
h,
const uint8_t *qtable,
int nb_qtable,
113 bytestream2_put_be16(&pbc, 16);
115 bytestream2_put_be16(&pbc, 0x0102);
116 bytestream2_put_byte(&pbc, 0);
117 bytestream2_put_be16(&pbc, 1);
118 bytestream2_put_be16(&pbc, 1);
119 bytestream2_put_byte(&pbc, 0);
120 bytestream2_put_byte(&pbc, 0);
124 bytestream2_put_be16(&pbc, 4);
125 bytestream2_put_be16(&pbc, dri);
130 bytestream2_put_be16(&pbc, 2 + nb_qtable * (1 + 64));
132 for (i = 0; i < nb_qtable; i++) {
133 bytestream2_put_byte(&pbc, i);
143 dht_size_ptr = pbc.
buffer;
144 bytestream2_put_be16(&pbc, 0);
155 AV_WB16(dht_size_ptr, dht_size);
159 bytestream2_put_be16(&pbc, 17);
160 bytestream2_put_byte(&pbc, 8);
161 bytestream2_put_be16(&pbc, h);
162 bytestream2_put_be16(&pbc, w);
163 bytestream2_put_byte(&pbc, 3);
164 bytestream2_put_byte(&pbc, 1);
165 bytestream2_put_byte(&pbc, (2 << 4) | (type ? 2 : 1));
166 bytestream2_put_byte(&pbc, 0);
167 bytestream2_put_byte(&pbc, 2);
168 bytestream2_put_byte(&pbc, 1 << 4 | 1);
169 bytestream2_put_byte(&pbc, nb_qtable == 2 ? 1 : 0);
170 bytestream2_put_byte(&pbc, 3);
171 bytestream2_put_byte(&pbc, 1 << 4 | 1);
172 bytestream2_put_byte(&pbc, nb_qtable == 2 ? 1 : 0);
176 bytestream2_put_be16(&pbc, 12);
177 bytestream2_put_byte(&pbc, 3);
178 bytestream2_put_byte(&pbc, 1);
179 bytestream2_put_byte(&pbc, 0);
180 bytestream2_put_byte(&pbc, 2);
181 bytestream2_put_byte(&pbc, 17);
182 bytestream2_put_byte(&pbc, 3);
183 bytestream2_put_byte(&pbc, 17);
184 bytestream2_put_byte(&pbc, 0);
185 bytestream2_put_byte(&pbc, 63);
186 bytestream2_put_byte(&pbc, 0);
198 factor = av_clip(q, 1, 99);
203 S = 200 - factor * 2;
205 for (i = 0; i < 128; i++) {
209 val = av_clip(val, 1, 255);
268 precision =
AV_RB8(buf + 1);
276 if (qtable_len > 0) {
277 if (len < qtable_len) {
287 memcmp(qtables, &jpeg->
qtables[q - 128][0], qtable_len))) {
289 "Quantization tables for q=%d changed\n", q);
290 }
else if (!jpeg->
qtables_len[q - 128] && qtable_len <= 128) {
291 memcpy(&jpeg->
qtables[q - 128][0], qtables,
299 "Invalid RTP/JPEG packet. Quantization tables not found.\n");
304 "No quantization tables known for q=%d yet.\n", q);
307 qtables = &jpeg->
qtables[q - 128][0];
311 if (q == 0 || q > 99) {
316 qtables = new_qtables;
317 qtable_len =
sizeof(new_qtables);
333 qtable_len / 64, dri);
341 "Received packet without a start chunk; dropping frame.\n");
355 "Missing packets; dropping frame.\n");
372 "Error occurred when getting frame buffer.\n");
389 .static_payload_id = 26,
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_WARNING
Something somehow does not look correct.
RTP/JPEG specific private data.
int index
stream index in AVFormatContext
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
MJPEG encoder and decoder.
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
AVIOContext * frame
current frame buffer
static int jpeg_create_huffman_table(PutByteContext *p, int table_class, int table_id, const uint8_t *bits_table, const uint8_t *value_table)
static void jpeg_put_marker(PutByteContext *pbc, int code)
const uint8_t avpriv_mjpeg_bits_dc_luminance[17]
const RTPDynamicProtocolHandler ff_jpeg_dynamic_handler
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
uint32_t timestamp
current frame timestamp
static int jpeg_create_header(uint8_t *buf, int size, uint32_t type, uint32_t w, uint32_t h, const uint8_t *qtable, int nb_qtable, int dri)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define RTP_FLAG_MARKER
RTP marker bit was set for this packet.
uint8_t qtables[128][128]
const uint8_t avpriv_mjpeg_bits_dc_chrominance[17]
static void jpeg_close_context(PayloadContext *jpeg)
static av_always_inline int bytestream2_tell_p(PutByteContext *p)
static av_always_inline unsigned int bytestream2_put_buffer(PutByteContext *p, const uint8_t *src, unsigned int size)
static void create_default_qtables(uint8_t *qtables, uint8_t q)
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, AVStream *st, AVPacket *pkt, uint32_t *timestamp, const uint8_t *buf, int len, uint16_t seq, int flags)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_WB16 unsigned int_TMPL AV_RB8
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_RB24
const uint8_t avpriv_mjpeg_val_dc[12]
uint8_t * buf
the temporary storage buffer
static const int factor[16]
const uint8_t avpriv_mjpeg_bits_ac_chrominance[17]
const uint8_t avpriv_mjpeg_val_ac_chrominance[]
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define flags(name, subs,...)
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
static const uint8_t default_quantizers[128]
int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
Close the dynamic buffer and make a packet from it.
const uint8_t avpriv_mjpeg_bits_ac_luminance[17]
const uint8_t avpriv_mjpeg_val_ac_luminance[]
int hdr_size
size of the current frame header
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
static double val(void *priv, double ch)
This structure stores compressed data.