[FFmpeg-cvslog] rtpdec_jpeg: Write the DHT section properly

Martin Storsjö git at videolan.org
Thu Sep 13 15:29:00 CEST 2012


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Tue Sep 11 11:03:05 2012 +0300| [7ef4323405fae8f62732111b747d585ef9c786c7] | committer: Martin Storsjö

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 at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7ef4323405fae8f62732111b747d585ef9c786c7
---

 libavformat/rtpdec_jpeg.c |   33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/libavformat/rtpdec_jpeg.c b/libavformat/rtpdec_jpeg.c
index 671763d..19ecbf4 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);



More information about the ffmpeg-cvslog mailing list