FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rtpdec_jpeg.c
Go to the documentation of this file.
1 /*
2  * RTP JPEG-compressed Video Depacketizer, RFC 2435
3  * Copyright (c) 2012 Samuel Pitoiset
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "avformat.h"
23 #include "avio_internal.h"
24 #include "rtpdec.h"
25 #include "rtpdec_formats.h"
26 #include "libavutil/intreadwrite.h"
27 #include "libavcodec/mjpeg.h"
28 #include "libavcodec/bytestream.h"
29 
30 /**
31  * RTP/JPEG specific private data.
32  */
33 struct PayloadContext {
34  AVIOContext *frame; ///< current frame buffer
35  uint32_t timestamp; ///< current frame timestamp
36  int hdr_size; ///< size of the current frame header
37  uint8_t qtables[128][128];
39 };
40 
41 static const uint8_t default_quantizers[128] = {
42  /* luma table */
43  16, 11, 12, 14, 12, 10, 16, 14,
44  13, 14, 18, 17, 16, 19, 24, 40,
45  26, 24, 22, 22, 24, 49, 35, 37,
46  29, 40, 58, 51, 61, 60, 57, 51,
47  56, 55, 64, 72, 92, 78, 64, 68,
48  87, 69, 55, 56, 80, 109, 81, 87,
49  95, 98, 103, 104, 103, 62, 77, 113,
50  121, 112, 100, 120, 92, 101, 103, 99,
51 
52  /* chroma table */
53  17, 18, 18, 24, 21, 24, 47, 26,
54  26, 47, 99, 66, 56, 66, 99, 99,
55  99, 99, 99, 99, 99, 99, 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 };
62 
64 {
65  ffio_free_dyn_buf(&jpeg->frame);
66 }
67 
68 static int jpeg_create_huffman_table(PutByteContext *p, int table_class,
69  int table_id, const uint8_t *bits_table,
70  const uint8_t *value_table)
71 {
72  int i, n = 0;
73 
74  bytestream2_put_byte(p, table_class << 4 | table_id);
75 
76  for (i = 1; i <= 16; i++) {
77  n += bits_table[i];
78  bytestream2_put_byte(p, bits_table[i]);
79  }
80 
81  for (i = 0; i < n; i++) {
82  bytestream2_put_byte(p, value_table[i]);
83  }
84  return n + 17;
85 }
86 
87 static void jpeg_put_marker(PutByteContext *pbc, int code)
88 {
89  bytestream2_put_byte(pbc, 0xff);
90  bytestream2_put_byte(pbc, code);
91 }
92 
93 static int jpeg_create_header(uint8_t *buf, int size, uint32_t type, uint32_t w,
94  uint32_t h, const uint8_t *qtable, int nb_qtable,
95  int dri)
96 {
97  PutByteContext pbc;
98  uint8_t *dht_size_ptr;
99  int dht_size, i;
100 
101  bytestream2_init_writer(&pbc, buf, size);
102 
103  /* Convert from blocks to pixels. */
104  w <<= 3;
105  h <<= 3;
106 
107  /* SOI */
108  jpeg_put_marker(&pbc, SOI);
109 
110  /* JFIF header */
111  jpeg_put_marker(&pbc, APP0);
112  bytestream2_put_be16(&pbc, 16);
113  bytestream2_put_buffer(&pbc, "JFIF", 5);
114  bytestream2_put_be16(&pbc, 0x0201);
115  bytestream2_put_byte(&pbc, 0);
116  bytestream2_put_be16(&pbc, 1);
117  bytestream2_put_be16(&pbc, 1);
118  bytestream2_put_byte(&pbc, 0);
119  bytestream2_put_byte(&pbc, 0);
120 
121  if (dri) {
122  jpeg_put_marker(&pbc, DRI);
123  bytestream2_put_be16(&pbc, 4);
124  bytestream2_put_be16(&pbc, dri);
125  }
126 
127  /* DQT */
128  jpeg_put_marker(&pbc, DQT);
129  bytestream2_put_be16(&pbc, 2 + nb_qtable * (1 + 64));
130 
131  for (i = 0; i < nb_qtable; i++) {
132  bytestream2_put_byte(&pbc, i);
133 
134  /* Each table is an array of 64 values given in zig-zag
135  * order, identical to the format used in a JFIF DQT
136  * marker segment. */
137  bytestream2_put_buffer(&pbc, qtable + 64 * i, 64);
138  }
139 
140  /* DHT */
141  jpeg_put_marker(&pbc, DHT);
142  dht_size_ptr = pbc.buffer;
143  bytestream2_put_be16(&pbc, 0);
144 
145  dht_size = 2;
154  AV_WB16(dht_size_ptr, dht_size);
155 
156  /* SOF0 */
157  jpeg_put_marker(&pbc, SOF0);
158  bytestream2_put_be16(&pbc, 17); /* size */
159  bytestream2_put_byte(&pbc, 8); /* bits per component */
160  bytestream2_put_be16(&pbc, h);
161  bytestream2_put_be16(&pbc, w);
162  bytestream2_put_byte(&pbc, 3); /* number of components */
163  bytestream2_put_byte(&pbc, 1); /* component number */
164  bytestream2_put_byte(&pbc, (2 << 4) | (type ? 2 : 1)); /* hsample/vsample */
165  bytestream2_put_byte(&pbc, 0); /* matrix number */
166  bytestream2_put_byte(&pbc, 2); /* component number */
167  bytestream2_put_byte(&pbc, 1 << 4 | 1); /* hsample/vsample */
168  bytestream2_put_byte(&pbc, nb_qtable == 2 ? 1 : 0); /* matrix number */
169  bytestream2_put_byte(&pbc, 3); /* component number */
170  bytestream2_put_byte(&pbc, 1 << 4 | 1); /* hsample/vsample */
171  bytestream2_put_byte(&pbc, nb_qtable == 2 ? 1 : 0); /* matrix number */
172 
173  /* SOS */
174  jpeg_put_marker(&pbc, SOS);
175  bytestream2_put_be16(&pbc, 12);
176  bytestream2_put_byte(&pbc, 3);
177  bytestream2_put_byte(&pbc, 1);
178  bytestream2_put_byte(&pbc, 0);
179  bytestream2_put_byte(&pbc, 2);
180  bytestream2_put_byte(&pbc, 17);
181  bytestream2_put_byte(&pbc, 3);
182  bytestream2_put_byte(&pbc, 17);
183  bytestream2_put_byte(&pbc, 0);
184  bytestream2_put_byte(&pbc, 63);
185  bytestream2_put_byte(&pbc, 0);
186 
187  /* Return the length in bytes of the JPEG header. */
188  return bytestream2_tell_p(&pbc);
189 }
190 
191 static void create_default_qtables(uint8_t *qtables, uint8_t q)
192 {
193  int factor = q;
194  int i;
195 
196  factor = av_clip(q, 1, 99);
197 
198  if (q < 50)
199  q = 5000 / factor;
200  else
201  q = 200 - factor * 2;
202 
203  for (i = 0; i < 128; i++) {
204  int val = (default_quantizers[i] * q + 50) / 100;
205 
206  /* Limit the quantizers to 1 <= q <= 255. */
207  val = av_clip(val, 1, 255);
208  qtables[i] = val;
209  }
210 }
211 
213  AVStream *st, AVPacket *pkt, uint32_t *timestamp,
214  const uint8_t *buf, int len, uint16_t seq,
215  int flags)
216 {
217  uint8_t type, q, width, height;
218  const uint8_t *qtables = NULL;
219  uint16_t qtable_len;
220  uint32_t off;
221  int ret, dri = 0;
222 
223  if (len < 8) {
224  av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
225  return AVERROR_INVALIDDATA;
226  }
227 
228  /* Parse the main JPEG header. */
229  off = AV_RB24(buf + 1); /* fragment byte offset */
230  type = AV_RB8(buf + 4); /* id of jpeg decoder params */
231  q = AV_RB8(buf + 5); /* quantization factor (or table id) */
232  width = AV_RB8(buf + 6); /* frame width in 8 pixel blocks */
233  height = AV_RB8(buf + 7); /* frame height in 8 pixel blocks */
234  buf += 8;
235  len -= 8;
236 
237  if (type & 0x40) {
238  if (len < 4) {
239  av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
240  return AVERROR_INVALIDDATA;
241  }
242  dri = AV_RB16(buf);
243  buf += 4;
244  len -= 4;
245  type &= ~0x40;
246  }
247  /* Parse the restart marker header. */
248  if (type > 63) {
249  av_log(ctx, AV_LOG_ERROR,
250  "Unimplemented RTP/JPEG restart marker header.\n");
251  return AVERROR_PATCHWELCOME;
252  }
253  if (type > 1) {
254  av_log(ctx, AV_LOG_ERROR, "Unimplemented RTP/JPEG type %d\n", type);
255  return AVERROR_PATCHWELCOME;
256  }
257 
258  /* Parse the quantization table header. */
259  if (off == 0) {
260  /* Start of JPEG data packet. */
261  uint8_t new_qtables[128];
262  uint8_t hdr[1024];
263 
264  if (q > 127) {
265  uint8_t precision;
266  if (len < 4) {
267  av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
268  return AVERROR_INVALIDDATA;
269  }
270 
271  /* The first byte is reserved for future use. */
272  precision = AV_RB8(buf + 1); /* size of coefficients */
273  qtable_len = AV_RB16(buf + 2); /* length in bytes */
274  buf += 4;
275  len -= 4;
276 
277  if (precision)
278  av_log(ctx, AV_LOG_WARNING, "Only 8-bit precision is supported.\n");
279 
280  if (qtable_len > 0) {
281  if (len < qtable_len) {
282  av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
283  return AVERROR_INVALIDDATA;
284  }
285  qtables = buf;
286  buf += qtable_len;
287  len -= qtable_len;
288  if (q < 255) {
289  if (jpeg->qtables_len[q - 128] &&
290  (jpeg->qtables_len[q - 128] != qtable_len ||
291  memcmp(qtables, &jpeg->qtables[q - 128][0], qtable_len))) {
292  av_log(ctx, AV_LOG_WARNING,
293  "Quantization tables for q=%d changed\n", q);
294  } else if (!jpeg->qtables_len[q - 128] && qtable_len <= 128) {
295  memcpy(&jpeg->qtables[q - 128][0], qtables,
296  qtable_len);
297  jpeg->qtables_len[q - 128] = qtable_len;
298  }
299  }
300  } else {
301  if (q == 255) {
302  av_log(ctx, AV_LOG_ERROR,
303  "Invalid RTP/JPEG packet. Quantization tables not found.\n");
304  return AVERROR_INVALIDDATA;
305  }
306  if (!jpeg->qtables_len[q - 128]) {
307  av_log(ctx, AV_LOG_ERROR,
308  "No quantization tables known for q=%d yet.\n", q);
309  return AVERROR_INVALIDDATA;
310  }
311  qtables = &jpeg->qtables[q - 128][0];
312  qtable_len = jpeg->qtables_len[q - 128];
313  }
314  } else { /* q <= 127 */
315  if (q == 0 || q > 99) {
316  av_log(ctx, AV_LOG_ERROR, "Reserved q value %d\n", q);
317  return AVERROR_INVALIDDATA;
318  }
319  create_default_qtables(new_qtables, q);
320  qtables = new_qtables;
321  qtable_len = sizeof(new_qtables);
322  }
323 
324  /* Skip the current frame in case of the end packet
325  * has been lost somewhere. */
326  ffio_free_dyn_buf(&jpeg->frame);
327 
328  if ((ret = avio_open_dyn_buf(&jpeg->frame)) < 0)
329  return ret;
330  jpeg->timestamp = *timestamp;
331 
332  /* Generate a frame and scan headers that can be prepended to the
333  * RTP/JPEG data payload to produce a JPEG compressed image in
334  * interchange format. */
335  jpeg->hdr_size = jpeg_create_header(hdr, sizeof(hdr), type, width,
336  height, qtables,
337  qtable_len / 64, dri);
338 
339  /* Copy JPEG header to frame buffer. */
340  avio_write(jpeg->frame, hdr, jpeg->hdr_size);
341  }
342 
343  if (!jpeg->frame) {
344  av_log(ctx, AV_LOG_ERROR,
345  "Received packet without a start chunk; dropping frame.\n");
346  return AVERROR(EAGAIN);
347  }
348 
349  if (jpeg->timestamp != *timestamp) {
350  /* Skip the current frame if timestamp is incorrect.
351  * A start packet has been lost somewhere. */
352  ffio_free_dyn_buf(&jpeg->frame);
353  av_log(ctx, AV_LOG_ERROR, "RTP timestamps don't match.\n");
354  return AVERROR_INVALIDDATA;
355  }
356 
357  if (off != avio_tell(jpeg->frame) - jpeg->hdr_size) {
358  av_log(ctx, AV_LOG_ERROR,
359  "Missing packets; dropping frame.\n");
360  return AVERROR(EAGAIN);
361  }
362 
363  /* Copy data to frame buffer. */
364  avio_write(jpeg->frame, buf, len);
365 
366  if (flags & RTP_FLAG_MARKER) {
367  /* End of JPEG data packet. */
368  uint8_t buf[2] = { 0xff, EOI };
369 
370  /* Put EOI marker. */
371  avio_write(jpeg->frame, buf, sizeof(buf));
372 
373  /* Prepare the JPEG packet. */
374  if ((ret = ff_rtp_finalize_packet(pkt, &jpeg->frame, st->index)) < 0) {
375  av_log(ctx, AV_LOG_ERROR,
376  "Error occurred when getting frame buffer.\n");
377  return ret;
378  }
379 
380  return 0;
381  }
382 
383  return AVERROR(EAGAIN);
384 }
385 
387  .enc_name = "JPEG",
388  .codec_type = AVMEDIA_TYPE_VIDEO,
389  .codec_id = AV_CODEC_ID_MJPEG,
390  .priv_data_size = sizeof(PayloadContext),
391  .close = jpeg_close_context,
393  .static_payload_id = 26,
394 };