Subversion Repositories Games.Descent

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. // Copyright 2011 Google Inc.
  2. //
  3. // This code is licensed under the same terms as WebM:
  4. //  Software License Agreement:  http://www.webmproject.org/license/software/
  5. //  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
  6. // -----------------------------------------------------------------------------
  7. //
  8. //  RIFF container manipulation for WEBP images.
  9. //
  10. // Authors: Urvang (urvang@google.com)
  11. //          Vikas (vikasa@google.com)
  12.  
  13. // This API allows manipulation of WebP container images containing features
  14. // like Color profile, XMP metadata, Animation & Tiling.
  15. //
  16. // Code Example#1: Creating a MUX with image data, color profile & XMP metadata.
  17. //
  18. //   int copy_data = 0;
  19. //   WebPMux* mux = WebPMuxNew();
  20. //   // ... (Prepare image data).
  21. //   WebPMuxSetImage(mux, image_data, image_data_size, alpha_data, alpha_size,
  22. //                   copy_data);
  23. //   // ... (Prepare ICCP color profile data).
  24. //   WebPMuxSetColorProfile(mux, icc_data, icc_data_size, copy_data);
  25. //   // ... (Prepare XMP metadata).
  26. //   WebPMuxSetMetadata(mux, xmp_data, xmp_data_size, copy_data);
  27. //   // Get data from mux in WebP RIFF format.
  28. //   WebPMuxAssemble(mux, &output_data, &output_data_size);
  29. //   WebPMuxDelete(mux);
  30. //   // ... (Consume output_data; e.g. write output_data to file).
  31. //   free(output_data);
  32. //
  33. // Code Example#2: Get image & color profile data from a WebP file.
  34. //
  35. //   int copy_data = 0;
  36. //   // ... (Read data from file).
  37. //   WebPMux* mux = WebPMuxCreate(data, data_size, copy_data);
  38. //   WebPMuxGetImage(mux, &image_data, &image_data_size,
  39. //                   &alpha_data, &alpha_size);
  40. //   // ... (Consume image_data; e.g. call WebPDecode() to decode the data).
  41. //   WebPMuxGetColorProfile(mux, &icc_data, &icc_data_size);
  42. //   // ... (Consume icc_data).
  43. //   WebPMuxDelete(mux);
  44. //   free(data);
  45.  
  46. #ifndef WEBP_WEBP_MUX_H_
  47. #define WEBP_WEBP_MUX_H_
  48.  
  49. #include "./types.h"
  50.  
  51. #if defined(__cplusplus) || defined(c_plusplus)
  52. extern "C" {
  53. #endif
  54.  
  55. // Error codes
  56. typedef enum {
  57.   WEBP_MUX_OK                 =  1,
  58.   WEBP_MUX_ERROR              =  0,
  59.   WEBP_MUX_NOT_FOUND          = -1,
  60.   WEBP_MUX_INVALID_ARGUMENT   = -2,
  61.   WEBP_MUX_INVALID_PARAMETER  = -3,
  62.   WEBP_MUX_BAD_DATA           = -4,
  63.   WEBP_MUX_MEMORY_ERROR       = -5
  64. } WebPMuxError;
  65.  
  66. // Flag values for different features used in VP8X chunk.
  67. typedef enum {
  68.   TILE_FLAG       = 0x00000001,
  69.   ANIMATION_FLAG  = 0x00000002,
  70.   ICCP_FLAG       = 0x00000004,
  71.   META_FLAG       = 0x00000008,
  72.   ALPHA_FLAG      = 0x00000010
  73. } FeatureFlags;
  74.  
  75. typedef struct WebPMux WebPMux;   // main opaque object.
  76.  
  77. //------------------------------------------------------------------------------
  78. // Life of a Mux object
  79.  
  80. // Creates an empty mux object.
  81. // Returns:
  82. //   A pointer to the newly created empty mux object.
  83. WEBP_EXTERN(WebPMux*) WebPMuxNew(void);
  84.  
  85. // Deletes the mux object.
  86. // Parameters:
  87. //   mux - (in/out) object to be deleted
  88. WEBP_EXTERN(void) WebPMuxDelete(WebPMux* const mux);
  89.  
  90. //------------------------------------------------------------------------------
  91. // Mux creation.
  92.  
  93. // Creates a mux object from raw data given in WebP RIFF format.
  94. // Parameters:
  95. //   data - (in) the raw data in WebP RIFF format
  96. //   size - (in) size of raw data
  97. //   copy_data - (in) value 1 indicates given data WILL copied to the mux, and
  98. //               value 0 indicates data will NOT be copied.
  99. // Returns:
  100. //   A pointer to the mux object created from given data - on success.
  101. //   NULL - In case of invalid data or memory error.
  102. WEBP_EXTERN(WebPMux*) WebPMuxCreate(const uint8_t* data, uint32_t size,
  103.                                     int copy_data);
  104.  
  105. //------------------------------------------------------------------------------
  106. // Single Image.
  107.  
  108. // Sets the image in the mux object. Any existing images (including frame/tile)
  109. // will be removed.
  110. // Parameters:
  111. //   mux - (in/out) object in which the image is to be set
  112. //   data - (in) the image data to be set. The data can be either a VP8
  113. //          bitstream or a single-image WebP file (non-animated & non-tiled)
  114. //   size - (in) size of the image data
  115. //   alpha_data - (in) the alpha data corresponding to the image (if present)
  116. //   alpha_size - (in) size of alpha chunk data
  117. //   copy_data - (in) value 1 indicates given data WILL copied to the mux, and
  118. //               value 0 indicates data will NOT be copied.
  119. // Returns:
  120. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or data is NULL.
  121. //   WEBP_MUX_MEMORY_ERROR - on memory allocation error.
  122. //   WEBP_MUX_OK - on success.
  123. WEBP_EXTERN(WebPMuxError) WebPMuxSetImage(WebPMux* const mux,
  124.                                           const uint8_t* data, uint32_t size,
  125.                                           const uint8_t* alpha_data,
  126.                                           uint32_t alpha_size, int copy_data);
  127.  
  128. // Gets a reference to the image in the mux object.
  129. // The caller should NOT free the returned data.
  130. // Parameters:
  131. //   mux - (in) object from which the image is to be fetched
  132. //   data - (out) the returned image data
  133. //   size - (out) size of the returned image data
  134. //   alpha_data - (in) the returned alpha data of the image (if present)
  135. //   alpha_size - (in) size of alpha chunk data
  136. // Returns:
  137. //   WEBP_MUX_INVALID_ARGUMENT - if either of mux, data or size is NULL
  138. //                               OR if mux contains animation/tiling.
  139. //   WEBP_MUX_NOT_FOUND - if image is not present in mux object.
  140. //   WEBP_MUX_OK - on success.
  141. WEBP_EXTERN(WebPMuxError) WebPMuxGetImage(const WebPMux* const mux,
  142.                                           const uint8_t** data, uint32_t* size,
  143.                                           const uint8_t** alpha_data,
  144.                                           uint32_t* alpha_size);
  145.  
  146. // Deletes the image in the mux object.
  147. // Parameters:
  148. //   mux - (in/out) object from which the image is to be deleted
  149. // Returns:
  150. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL
  151. //                               OR if mux contains animation/tiling.
  152. //   WEBP_MUX_NOT_FOUND - if image is not present in mux object.
  153. //   WEBP_MUX_OK - on success.
  154. WEBP_EXTERN(WebPMuxError) WebPMuxDeleteImage(WebPMux* const mux);
  155.  
  156. //------------------------------------------------------------------------------
  157. // XMP Metadata.
  158.  
  159. // Sets the XMP metadata in the mux object. Any existing metadata chunk(s) will
  160. // be removed.
  161. // Parameters:
  162. //   mux - (in/out) object to which the XMP metadata is to be added
  163. //   data - (in) the XMP metadata data to be added
  164. //   size - (in) size of the XMP metadata data
  165. //   copy_data - (in) value 1 indicates given data WILL copied to the mux, and
  166. //               value 0 indicates data will NOT be copied.
  167. // Returns:
  168. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or data is NULL.
  169. //   WEBP_MUX_MEMORY_ERROR - on memory allocation error.
  170. //   WEBP_MUX_OK - on success.
  171. WEBP_EXTERN(WebPMuxError) WebPMuxSetMetadata(WebPMux* const mux,
  172.                                              const uint8_t* data,
  173.                                              uint32_t size, int copy_data);
  174.  
  175. // Gets a reference to the XMP metadata in the mux object.
  176. // The caller should NOT free the returned data.
  177. // Parameters:
  178. //   mux - (in) object from which the XMP metadata is to be fetched
  179. //   data - (out) the returned XMP metadata
  180. //   size - (out) size of the returned XMP metadata
  181. // Returns:
  182. //   WEBP_MUX_INVALID_ARGUMENT - if either of mux, data or size is NULL
  183. //   WEBP_MUX_NOT_FOUND - if metadata is not present in mux object.
  184. //   WEBP_MUX_OK - on success.
  185. WEBP_EXTERN(WebPMuxError) WebPMuxGetMetadata(const WebPMux* const mux,
  186.                                              const uint8_t** data,
  187.                                              uint32_t* size);
  188.  
  189. // Deletes the XMP metadata in the mux object.
  190. // Parameters:
  191. //   mux - (in/out) object from which XMP metadata is to be deleted
  192. // Returns:
  193. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL
  194. //   WEBP_MUX_NOT_FOUND - If mux does not contain metadata.
  195. //   WEBP_MUX_OK - on success.
  196. WEBP_EXTERN(WebPMuxError) WebPMuxDeleteMetadata(WebPMux* const mux);
  197.  
  198. //------------------------------------------------------------------------------
  199. // ICC Color Profile.
  200.  
  201. // Sets the color profile in the mux object. Any existing color profile chunk(s)
  202. // will be removed.
  203. // Parameters:
  204. //   mux - (in/out) object to which the color profile is to be added
  205. //   data - (in) the color profile data to be added
  206. //   size - (in) size of the color profile data
  207. //   copy_data - (in) value 1 indicates given data WILL copied to the mux, and
  208. //               value 0 indicates data will NOT be copied.
  209. // Returns:
  210. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or data is NULL
  211. //   WEBP_MUX_MEMORY_ERROR - on memory allocation error
  212. //   WEBP_MUX_OK - on success
  213. WEBP_EXTERN(WebPMuxError) WebPMuxSetColorProfile(WebPMux* const mux,
  214.                                                  const uint8_t* data,
  215.                                                  uint32_t size, int copy_data);
  216.  
  217. // Gets a reference to the color profile in the mux object.
  218. // The caller should NOT free the returned data.
  219. // Parameters:
  220. //   mux - (in) object from which the color profile data is to be fetched
  221. //   data - (out) the returned color profile data
  222. //   size - (out) size of the returned color profile data
  223. // Returns:
  224. //   WEBP_MUX_INVALID_ARGUMENT - if either of mux, data or size is NULL
  225. //   WEBP_MUX_NOT_FOUND - if color profile is not present in mux object.
  226. //   WEBP_MUX_OK - on success.
  227. WEBP_EXTERN(WebPMuxError) WebPMuxGetColorProfile(const WebPMux* const mux,
  228.                                                  const uint8_t** data,
  229.                                                  uint32_t* size);
  230.  
  231. // Deletes the color profile in the mux object.
  232. // Parameters:
  233. //   mux - (in/out) object from which color profile is to be deleted
  234. // Returns:
  235. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL
  236. //   WEBP_MUX_NOT_FOUND - If mux does not contain color profile.
  237. //   WEBP_MUX_OK - on success.
  238. WEBP_EXTERN(WebPMuxError) WebPMuxDeleteColorProfile(WebPMux* const mux);
  239.  
  240. //------------------------------------------------------------------------------
  241. // Animation.
  242.  
  243. // Adds an animation frame to the mux object.
  244. // nth=0 has a special meaning - last position.
  245. // Parameters:
  246. //   mux - (in/out) object to which an animation frame is to be added
  247. //   nth - (in) The position at which the frame is to be added.
  248. //   data - (in) the raw VP8 image data corresponding to frame image. The data
  249. //          can be either a VP8 bitstream or a single-image WebP file
  250. //          (non-animated & non-tiled)
  251. //   size - (in) size of frame chunk data
  252. //   alpha_data - (in) the alpha data corresponding to frame image (if present)
  253. //   alpha_size - (in) size of alpha chunk data
  254. //   x_offset - (in) x-offset of the frame to be added
  255. //   y_offset - (in) y-offset of the frame to be added
  256. //   duration - (in) duration of the frame to be added (in milliseconds)
  257. //   copy_data - (in) value 1 indicates given data WILL copied to the mux, and
  258. //               value 0 indicates data will NOT be copied.
  259. // Returns:
  260. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or data is NULL
  261. //   WEBP_MUX_NOT_FOUND - If we have less than (nth-1) frames before adding.
  262. //   WEBP_MUX_MEMORY_ERROR - on memory allocation error.
  263. //   WEBP_MUX_OK - on success.
  264. WEBP_EXTERN(WebPMuxError) WebPMuxAddFrame(WebPMux* const mux, uint32_t nth,
  265.                                           const uint8_t* data, uint32_t size,
  266.                                           const uint8_t* alpha_data,
  267.                                           uint32_t alpha_size,
  268.                                           uint32_t x_offset, uint32_t y_offset,
  269.                                           uint32_t duration, int copy_data);
  270.  
  271. // TODO(urvang): Create a struct as follows to reduce argument list size:
  272. // typedef struct {
  273. //  int nth;
  274. //  uint8_t* data;
  275. //  uint32_t data_size;
  276. //  uint8_t* alpha;
  277. //  uint32_t alpha_size;
  278. //  uint32_t x_offset, y_offset;
  279. //  uint32_t duration;
  280. // } FrameInfo;
  281.  
  282. // Gets a reference to the nth animation frame from the mux object.
  283. // The caller should NOT free the returned data.
  284. // nth=0 has a special meaning - last position.
  285. // Parameters:
  286. //   mux - (in) object from which the info is to be fetched
  287. //   nth - (in) index of the frame in the mux object
  288. //   data - (out) the returned image data
  289. //   size - (out) size of the returned image data
  290. //   alpha_data - (in) the alpha data corresponding to frame image (if present)
  291. //   alpha_size - (in) size of alpha chunk data
  292. //   x_offset - (out) x-offset of the returned frame
  293. //   y_offset - (out) y-offset of the returned frame
  294. //   duration - (out) duration of the returned frame (in milliseconds)
  295. // Returns:
  296. //   WEBP_MUX_INVALID_ARGUMENT - if either mux, data, size, x_offset,
  297. //                               y_offset, or duration is NULL
  298. //   WEBP_MUX_NOT_FOUND - if there are less than nth frames in the mux object.
  299. //   WEBP_MUX_BAD_DATA - if nth frame chunk in mux is invalid.
  300. //   WEBP_MUX_OK - on success.
  301. WEBP_EXTERN(WebPMuxError) WebPMuxGetFrame(const WebPMux* const mux,
  302.                                           uint32_t nth,
  303.                                           const uint8_t** data, uint32_t* size,
  304.                                           const uint8_t** alpha_data,
  305.                                           uint32_t* alpha_size,
  306.                                           uint32_t* x_offset,
  307.                                           uint32_t* y_offset,
  308.                                           uint32_t* duration);
  309.  
  310. // Deletes an animation frame from the mux object.
  311. // nth=0 has a special meaning - last position.
  312. // Parameters:
  313. //   mux - (in/out) object from which a frame is to be deleted
  314. //   nth - (in) The position from which the frame is to be deleted
  315. // Returns:
  316. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL
  317. //   WEBP_MUX_NOT_FOUND - If there are less than nth frames in the mux object
  318. //                        before deletion.
  319. //   WEBP_MUX_OK - on success.
  320. WEBP_EXTERN(WebPMuxError) WebPMuxDeleteFrame(WebPMux* const mux, uint32_t nth);
  321.  
  322. // Sets the animation loop count in the mux object. Any existing loop count
  323. // value(s) will be removed.
  324. // Parameters:
  325. //   mux - (in/out) object in which loop chunk is to be set/added
  326. //   loop_count - (in) animation loop count value.
  327. //                Note that loop_count of zero denotes infinite loop.
  328. // Returns:
  329. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL
  330. //   WEBP_MUX_MEMORY_ERROR - on memory allocation error.
  331. //   WEBP_MUX_OK - on success.
  332. WEBP_EXTERN(WebPMuxError) WebPMuxSetLoopCount(WebPMux* const mux,
  333.                                               uint32_t loop_count);
  334.  
  335. // Gets the animation loop count from the mux object.
  336. // Parameters:
  337. //   mux - (in) object from which the loop count is to be fetched
  338. //   loop_count - (out) the loop_count value present in the LOOP chunk
  339. // Returns:
  340. //   WEBP_MUX_INVALID_ARGUMENT - if either of mux or loop_count is NULL
  341. //   WEBP_MUX_NOT_FOUND - if loop chunk is not present in mux object.
  342. //   WEBP_MUX_OK - on success.
  343. WEBP_EXTERN(WebPMuxError) WebPMuxGetLoopCount(const WebPMux* const mux,
  344.                                               uint32_t* loop_count);
  345.  
  346. //------------------------------------------------------------------------------
  347. // Tiling.
  348.  
  349. // Adds a tile to the mux object.
  350. // nth=0 has a special meaning - last position.
  351. // Parameters:
  352. //   mux - (in/out) object to which a tile is to be added
  353. //   nth - (in) The position at which the tile is to be added.
  354. //   data - (in) the raw VP8 image data corresponding to tile image.  The data
  355. //          can be either a VP8 bitstream or a single-image WebP file
  356. //          (non-animated & non-tiled)
  357. //   size - (in) size of tile chunk data
  358. //   alpha_data - (in) the alpha data corresponding to tile image (if present)
  359. //   alpha_size - (in) size of alpha chunk data
  360. //   x_offset - (in) x-offset of the tile to be added
  361. //   y_offset - (in) y-offset of the tile to be added
  362. //   copy_data - (in) value 1 indicates given data WILL copied to the mux, and
  363. //               value 0 indicates data will NOT be copied.
  364. // Returns:
  365. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or data is NULL
  366. //   WEBP_MUX_NOT_FOUND - If we have less than (nth-1) tiles before adding.
  367. //   WEBP_MUX_MEMORY_ERROR - on memory allocation error.
  368. //   WEBP_MUX_OK - on success.
  369. WEBP_EXTERN(WebPMuxError) WebPMuxAddTile(WebPMux* const mux, uint32_t nth,
  370.                                          const uint8_t* data, uint32_t size,
  371.                                          const uint8_t* alpha_data,
  372.                                          uint32_t alpha_size,
  373.                                          uint32_t x_offset, uint32_t y_offset,
  374.                                          int copy_data);
  375.  
  376. // Gets a reference to the nth tile from the mux object.
  377. // The caller should NOT free the returned data.
  378. // nth=0 has a special meaning - last position.
  379. // Parameters:
  380. //   mux - (in) object from which the info is to be fetched
  381. //   nth - (in) index of the tile in the mux object
  382. //   data - (out) the returned image data
  383. //   size - (out) size of the returned image data
  384. //   alpha_data - (in) the alpha data corresponding to tile image (if present)
  385. //   alpha_size - (in) size of alpha chunk data
  386. //   x_offset - (out) x-offset of the returned tile
  387. //   y_offset - (out) y-offset of the returned tile
  388. // Returns:
  389. //   WEBP_MUX_INVALID_ARGUMENT - if either mux, data, size, x_offset or
  390. //                               y_offset is NULL
  391. //   WEBP_MUX_NOT_FOUND - if there are less than nth tiles in the mux object.
  392. //   WEBP_MUX_BAD_DATA - if nth tile chunk in mux is invalid.
  393. //   WEBP_MUX_OK - on success.
  394. WEBP_EXTERN(WebPMuxError) WebPMuxGetTile(const WebPMux* const mux, uint32_t nth,
  395.                                          const uint8_t** data, uint32_t* size,
  396.                                          const uint8_t** alpha_data,
  397.                                          uint32_t* alpha_size,
  398.                                          uint32_t* x_offset,
  399.                                          uint32_t* y_offset);
  400.  
  401. // Deletes a tile from the mux object.
  402. // nth=0 has a special meaning - last position
  403. // Parameters:
  404. //   mux - (in/out) object from which a tile is to be deleted
  405. //   nth - (in) The position from which the tile is to be deleted
  406. // Returns:
  407. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL
  408. //   WEBP_MUX_NOT_FOUND - If there are less than nth tiles in the mux object
  409. //                        before deletion.
  410. //   WEBP_MUX_OK - on success.
  411. WEBP_EXTERN(WebPMuxError) WebPMuxDeleteTile(WebPMux* const mux, uint32_t nth);
  412.  
  413. //------------------------------------------------------------------------------
  414. // Misc Utilities.
  415.  
  416. // Gets the feature flags from the mux object.
  417. // Parameters:
  418. //   mux - (in) object from which the features are to be fetched
  419. //   flags - (out) the flags specifying which features are present in the
  420. //           mux object. This will be an OR of various flag values.
  421. //           Enum 'FeatureFlags' can be used to test for individual flag values.
  422. // Returns:
  423. //   WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or flags is NULL
  424. //   WEBP_MUX_NOT_FOUND - if VP8X chunk is not present in mux object.
  425. //   WEBP_MUX_BAD_DATA - if VP8X chunk in mux is invalid.
  426. //   WEBP_MUX_OK - on success.
  427. WEBP_EXTERN(WebPMuxError) WebPMuxGetFeatures(const WebPMux* const mux,
  428.                                              uint32_t* flags);
  429.  
  430. // Gets number of chunks having tag value tag in the mux object.
  431. // Parameters:
  432. //   mux - (in) object from which the info is to be fetched
  433. //   tag - (in) tag name specifying the type of chunk
  434. //   num_elements - (out) number of chunks corresponding to the specified tag
  435. // Returns:
  436. //   WEBP_MUX_INVALID_ARGUMENT - if either mux, tag or num_elements is NULL
  437. //   WEBP_MUX_OK - on success.
  438. WEBP_EXTERN(WebPMuxError) WebPMuxNumNamedElements(const WebPMux* const mux,
  439.                                                   const char* tag,
  440.                                                   int* num_elements);
  441.  
  442. // Assembles all chunks in WebP RIFF format and returns in output_data.
  443. // This function also validates the mux object.
  444. // The content of '*output_data' is allocated using malloc(), and NOT
  445. // owned by the 'mux' object.
  446. // It MUST be deallocated by the caller by calling free().
  447. // Parameters:
  448. //   mux - (in/out) object whose chunks are to be assembled
  449. //   output_data - (out) byte array where assembled WebP data is returned
  450. //   output_size - (out) size of returned data
  451. // Returns:
  452. //   WEBP_MUX_BAD_DATA - if mux object is invalid.
  453. //   WEBP_MUX_INVALID_ARGUMENT - if either mux, output_data or output_size is
  454. //                               NULL.
  455. //   WEBP_MUX_MEMORY_ERROR - on memory allocation error.
  456. //   WEBP_MUX_OK - on success
  457. WEBP_EXTERN(WebPMuxError) WebPMuxAssemble(WebPMux* const mux,
  458.                                           uint8_t** output_data,
  459.                                           uint32_t* output_size);
  460.  
  461. //------------------------------------------------------------------------------
  462.  
  463. #if defined(__cplusplus) || defined(c_plusplus)
  464. }    // extern "C"
  465. #endif
  466.  
  467. #endif  /* WEBP_WEBP_MUX_H_ */
  468.