diff options
-rw-r--r-- | libavformat/rtpdec_jpeg.c | 33 |
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); |