summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-09-11 11:03:05 +0300
committerMartin Storsjö <martin@martin.st>2012-09-12 12:07:29 +0300
commit7ef4323405fae8f62732111b747d585ef9c786c7 (patch)
tree9dcc19fe957083936a188c4b4f5b57e89852668d
parent76fa7e09f18d5efa6b9c8ec5ef8d032a85e15865 (diff)
rtpdec_jpeg: Write the DHT section properly
Currently the size header of the generated DHT section is incorrect, making the mjpeg decoder just skip it. Since the written huffman tables are the default ones, this failure had gone undetected. Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r--libavformat/rtpdec_jpeg.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/libavformat/rtpdec_jpeg.c b/libavformat/rtpdec_jpeg.c
index 671763d289..19ecbf47fa 100644
--- a/libavformat/rtpdec_jpeg.c
+++ b/libavformat/rtpdec_jpeg.c
@@ -76,13 +76,12 @@ static void jpeg_free_context(PayloadContext *jpeg)
av_free(jpeg);
}
-static void jpeg_create_huffman_table(PutBitContext *p, int table_class,
- int table_id, const uint8_t *bits_table,
- const uint8_t *value_table)
+static int jpeg_create_huffman_table(PutBitContext *p, int table_class,
+ int table_id, const uint8_t *bits_table,
+ const uint8_t *value_table)
{
int i, n = 0;
- put_bits(p, 8, 0);
put_bits(p, 4, table_class);
put_bits(p, 4, table_id);
@@ -94,12 +93,15 @@ static void jpeg_create_huffman_table(PutBitContext *p, int table_class,
for (i = 0; i < n; i++) {
put_bits(p, 8, value_table[i]);
}
+ return n + 17;
}
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)
{
PutBitContext pbc;
+ uint8_t *dht_size_ptr;
+ int dht_size;
init_put_bits(&pbc, buf, size);
@@ -142,15 +144,20 @@ static int jpeg_create_header(uint8_t *buf, int size, uint32_t type, uint32_t w,
/* DHT */
put_marker(&pbc, DHT);
-
- jpeg_create_huffman_table(&pbc, 0, 0, avpriv_mjpeg_bits_dc_luminance,
- avpriv_mjpeg_val_dc);
- jpeg_create_huffman_table(&pbc, 0, 1, avpriv_mjpeg_bits_dc_chrominance,
- avpriv_mjpeg_val_dc);
- jpeg_create_huffman_table(&pbc, 1, 0, avpriv_mjpeg_bits_ac_luminance,
- avpriv_mjpeg_val_ac_luminance);
- jpeg_create_huffman_table(&pbc, 1, 1, avpriv_mjpeg_bits_ac_chrominance,
- avpriv_mjpeg_val_ac_chrominance);
+ flush_put_bits(&pbc);
+ dht_size_ptr = put_bits_ptr(&pbc);
+ put_bits(&pbc, 16, 0);
+
+ dht_size = 2;
+ dht_size += jpeg_create_huffman_table(&pbc, 0, 0,avpriv_mjpeg_bits_dc_luminance,
+ avpriv_mjpeg_val_dc);
+ dht_size += jpeg_create_huffman_table(&pbc, 0, 1, avpriv_mjpeg_bits_dc_chrominance,
+ avpriv_mjpeg_val_dc);
+ dht_size += jpeg_create_huffman_table(&pbc, 1, 0, avpriv_mjpeg_bits_ac_luminance,
+ avpriv_mjpeg_val_ac_luminance);
+ dht_size += jpeg_create_huffman_table(&pbc, 1, 1, avpriv_mjpeg_bits_ac_chrominance,
+ avpriv_mjpeg_val_ac_chrominance);
+ AV_WB16(dht_size_ptr, dht_size);
/* SOF0 */
put_marker(&pbc, SOF0);