[vlc-devel] [PATCH 1/4] jpeg: move some setup in init function

Rafaël Carré funman at videolan.org
Tue Jan 28 11:21:55 CET 2014


---
 modules/codec/jpeg.c | 90 ++++++++++++++++++++++++++--------------------------
 1 file changed, 45 insertions(+), 45 deletions(-)

diff --git a/modules/codec/jpeg.c b/modules/codec/jpeg.c
index 32964cc..44572c0 100644
--- a/modules/codec/jpeg.c
+++ b/modules/codec/jpeg.c
@@ -42,6 +42,8 @@ struct decoder_sys_t
     jmp_buf setjmp_buffer;
 
     decoder_t *p_dec;
+
+    struct jpeg_decompress_struct p_jpeg;
 };
 
 static int  OpenDecoder(vlc_object_t *);
@@ -62,6 +64,28 @@ vlc_module_begin()
 vlc_module_end()
 
 /*
+ * Exit error handler for libjpeg
+ */
+static void user_error_exit(j_common_ptr p_jpeg)
+{
+    decoder_sys_t *p_sys = (decoder_sys_t *)p_jpeg->err;
+    p_sys->err.output_message(p_jpeg);
+    longjmp(p_sys->setjmp_buffer, 1);
+}
+
+/*
+ * Emit message error handler for libjpeg
+ */
+static void user_error_message(j_common_ptr p_jpeg)
+{
+    char error_msg[JMSG_LENGTH_MAX];
+
+    decoder_sys_t *p_sys = (decoder_sys_t *)p_jpeg->err;
+    p_sys->err.format_message(p_jpeg, error_msg);
+    msg_Err(p_sys->p_dec, "%s", error_msg);
+}
+
+/*
  * Probe the decoder and return score
  */
 static int OpenDecoder(vlc_object_t *p_this)
@@ -74,11 +98,11 @@ static int OpenDecoder(vlc_object_t *p_this)
     }
 
     /* Allocate the memory needed to store the decoder's structure */
-    p_dec->p_sys = malloc(sizeof(decoder_sys_t));
-    if (p_dec->p_sys == NULL)
-    {
+    decoder_sys_t *p_sys = malloc(sizeof(decoder_sys_t));
+    if (p_sys == NULL)
         return VLC_ENOMEM;
-    }
+
+    p_dec->p_sys = p_sys;
 
     p_dec->p_sys->p_dec = p_dec;
 
@@ -88,29 +112,14 @@ static int OpenDecoder(vlc_object_t *p_this)
     /* Set callbacks */
     p_dec->pf_decode_video = DecodeBlock;
 
-    return VLC_SUCCESS;
-}
-
-/*
- * Exit error handler for libjpeg
- */
-static void user_error_exit(j_common_ptr p_jpeg)
-{
-    decoder_sys_t *p_sys = (decoder_sys_t *)p_jpeg->err;
-    p_sys->err.output_message(p_jpeg);
-    longjmp(p_sys->setjmp_buffer, 1);
-}
+    p_sys->p_jpeg.err = jpeg_std_error(&p_sys->err);
+    p_sys->err.error_exit = user_error_exit;
+    p_sys->err.output_message = user_error_message;
 
-/*
- * Emit message error handler for libjpeg
- */
-static void user_error_message(j_common_ptr p_jpeg)
-{
-    char error_msg[JMSG_LENGTH_MAX];
+    jpeg_create_decompress(&p_sys->p_jpeg);
+    p_sys->p_jpeg.out_color_space = JCS_RGB;
 
-    decoder_sys_t *p_sys = (decoder_sys_t *)p_jpeg->err;
-    p_sys->err.format_message(p_jpeg, error_msg);
-    msg_Err(p_sys->p_dec, "%s", error_msg);
+    return VLC_SUCCESS;
 }
 
 /*
@@ -122,7 +131,6 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
     block_t *p_block;
     picture_t *p_pic = 0;
 
-    struct jpeg_decompress_struct p_jpeg;
     JSAMPARRAY p_row_pointers = NULL;
 
     if (!pp_block || !*pp_block)
@@ -139,28 +147,21 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
         return NULL;
     }
 
-    p_jpeg.err = jpeg_std_error(&p_sys->err);
-    p_sys->err.error_exit = user_error_exit;
-    p_sys->err.output_message = user_error_message;
-
     /* libjpeg longjmp's there in case of error */
     if (setjmp(p_sys->setjmp_buffer))
     {
         goto error;
     }
 
-    jpeg_create_decompress(&p_jpeg);
-    jpeg_mem_src(&p_jpeg, p_block->p_buffer, p_block->i_buffer);
-    jpeg_read_header(&p_jpeg, TRUE);
-
-    p_jpeg.out_color_space = JCS_RGB;
+    jpeg_mem_src(&p_sys->p_jpeg, p_block->p_buffer, p_block->i_buffer);
+    jpeg_read_header(&p_sys->p_jpeg, TRUE);
 
-    jpeg_start_decompress(&p_jpeg);
+    jpeg_start_decompress(&p_sys->p_jpeg);
 
     /* Set output properties */
     p_dec->fmt_out.i_codec = VLC_CODEC_RGB24;
-    p_dec->fmt_out.video.i_width = p_jpeg.output_width;
-    p_dec->fmt_out.video.i_height = p_jpeg.output_height;
+    p_dec->fmt_out.video.i_width = p_sys->p_jpeg.output_width;
+    p_dec->fmt_out.video.i_height = p_sys->p_jpeg.output_height;
     p_dec->fmt_out.video.i_sar_num = 1;
     p_dec->fmt_out.video.i_sar_den = 1;
     p_dec->fmt_out.video.i_rmask = 0x000000ff;
@@ -175,7 +176,7 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
     }
 
     /* Decode picture */
-    p_row_pointers = malloc(sizeof(JSAMPROW) * p_jpeg.output_height);
+    p_row_pointers = malloc(sizeof(JSAMPROW) * p_sys->p_jpeg.output_height);
     if (!p_row_pointers)
     {
         goto error;
@@ -184,14 +185,13 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
         p_row_pointers[i] = p_pic->p->p_pixels + p_pic->p->i_pitch * i;
     }
 
-    while (p_jpeg.output_scanline < p_jpeg.output_height)
+    while (p_sys->p_jpeg.output_scanline < p_sys->p_jpeg.output_height)
     {
-        jpeg_read_scanlines(&p_jpeg, p_row_pointers + p_jpeg.output_scanline,
-                                     p_jpeg.output_height - p_jpeg.output_scanline);
+        jpeg_read_scanlines(&p_sys->p_jpeg, p_row_pointers + p_sys->p_jpeg.output_scanline,
+                                     p_sys->p_jpeg.output_height - p_sys->p_jpeg.output_scanline);
     }
 
-    jpeg_finish_decompress(&p_jpeg);
-    jpeg_destroy_decompress(&p_jpeg);
+    jpeg_finish_decompress(&p_sys->p_jpeg);
     free(p_row_pointers);
 
     p_pic->date = p_block->i_pts > VLC_TS_INVALID ? p_block->i_pts : p_block->i_dts;
@@ -203,7 +203,6 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
 
 error:
 
-    jpeg_destroy_decompress(&p_jpeg);
     free(p_row_pointers);
 
     block_Release(p_block);
@@ -220,5 +219,6 @@ static void CloseDecoder(vlc_object_t *p_this)
     decoder_t *p_dec = (decoder_t *)p_this;
     decoder_sys_t *p_sys = p_dec->p_sys;
 
+    jpeg_destroy_decompress(&p_sys->p_jpeg);
     free(p_sys);
 }
-- 
1.8.5.3




More information about the vlc-devel mailing list