shithub: libopusenc

Download patch

ref: ecdd28cd75c37a3550245e44c329ec9d5362bdcc
parent: 81b3f1567c3625fbc8887ab91d0f08f1a7a6432d
author: Jean-Marc Valin <jmvalin@jmvalin.ca>
date: Mon Feb 5 08:23:37 EST 2018

More refactoring of the picture handling code

--- a/src/picture.c
+++ b/src/picture.c
@@ -290,6 +290,12 @@
   return buf;
 }
 
+static int validate_picture_type(int picture_type, int seen_file_icons) {
+  if (picture_type > 20) return 0;
+  if(picture_type>=1&&picture_type<=2&&(seen_file_icons&picture_type)) return 0;
+  return 1;
+}
+
 /*Parse a picture SPECIFICATION as given on the command-line.
   spec: The specification.
   error_message: Returns an error message on error.
@@ -297,31 +303,23 @@
    have already been added, to ensure only one is allowed.
   Return: A Base64-encoded string suitable for use in a METADATA_BLOCK_PICTURE
    tag.*/
-char *_ope_parse_picture_specification(const char *filename, int picture_type, const char *description,
+static char *_ope_parse_picture_specification_impl(unsigned char *buf, size_t nbuf, size_t data_offset, int picture_type, const char *description,
                                   int *error, int *seen_file_icons){
   opus_uint32  width;
   opus_uint32  height;
   opus_uint32  depth;
   opus_uint32  colors;
-  unsigned char *buf;
   const char    *mime_type;
   char          *out;
-  size_t         nbuf;
-  size_t         data_offset;
   size_t         data_length;
   size_t         b64_length;
   int          has_palette;
   *error = OPE_OK;
   if (picture_type < 0) picture_type=3;
-  if (picture_type > 20) {
-    *error=OPE_INVALID_PICTURE;
+  if (!validate_picture_type(picture_type, *seen_file_icons)) {
+    *error = OPE_INVALID_PICTURE;
     return NULL;
   }
-  if(picture_type>=1&&picture_type<=2&&(*seen_file_icons&picture_type)){
-    *error=OPE_INVALID_PICTURE;
-    return NULL;
-  }
-  buf = _ope_read_picture_file(filename, description, error, &nbuf, &data_offset);
   if (buf == NULL) return NULL;
   data_length=nbuf-data_offset;
   /*Try to extract the image dimensions/color information from the file.*/
@@ -394,4 +392,18 @@
   }
   free(buf);
   return out;
+}
+
+char *_ope_parse_picture_specification(const char *filename, int picture_type, const char *description,
+                                  int *error, int *seen_file_icons){
+  size_t nbuf;
+  size_t data_offset;
+  unsigned char *buf;
+  if (picture_type < 0) picture_type=3;
+  if (!validate_picture_type(picture_type, *seen_file_icons)) {
+    *error = OPE_INVALID_PICTURE;
+    return NULL;
+  }
+  buf = _ope_read_picture_file(filename, description, error, &nbuf, &data_offset);
+  return _ope_parse_picture_specification_impl(buf, nbuf, data_offset, picture_type, description, error, seen_file_icons);
 }