[Flac-dev] FLAC__metadata_get_picture()

Josh Coalson xflac at yahoo.com
Fri May 23 10:32:27 PDT 2008


that is a convenience function for trying to get the best picture
that matches a constraint.  to get more than one, you should use
one of the iterator interfaces:

http://flac.sourceforge.net/api/group__flac__metadata.html


--- "Alex J. Ivasyuv" <industral at gmail.com> wrote:

> Hi all!
> 
> I have a problem to get _all_ images from flac file.
> I have flac file with 3 images inside ( FLAC__METADATA_TYPE_PICTURE )
> 
> How to get _all_ images with bool FLAC::Metadata::get_picture() func?
> 
> This function is wrapper FLAC__bool FLAC__metadata_get_picture().
> 
> flac-1.2.1/src/libFLAC/metadata_iterators.c:
> ...
> 285 FLAC_API FLAC__bool FLAC__metadata_get_picture(const char
> *filename, 
> FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type
> type, 
> const char *mime_type, const FLAC__byte *description, unsigned 
> max_width, unsigned max_height, unsigned max_depth, unsigned
> max_colors)
>   286 {
>   287     FLAC__Metadata_SimpleIterator *it;
>   288     FLAC__uint64 max_area_seen = 0;
>   289     FLAC__uint64 max_depth_seen = 0;
>   290
>   291     FLAC__ASSERT(0 != filename);
>   292     FLAC__ASSERT(0 != picture);
>   293
>   294     *picture = 0;
>   295
>   296     it = FLAC__metadata_simple_iterator_new();
>   297     if(0 == it)
>   298         return false;
>   299     if(!FLAC__metadata_simple_iterator_init(it, filename, 
> /*read_only=*/true, /*preserve_file_stats=*/true)) {
>   300         FLAC__metadata_simple_iterator_delete(it);
>   301         return false;
>   302     }
>   303     do {
>   304         if(FLAC__metadata_simple_iterator_get_block_type(it) ==
> 
> FLAC__METADATA_TYPE_PICTURE) {
>   305             FLAC__StreamMetadata *obj = 
> FLAC__metadata_simple_iterator_get_block(it);
>   306             FLAC__uint64 area = 
> (FLAC__uint64)obj->data.picture.width * 
> (FLAC__uint64)obj->data.picture.height;
>   307             /* check constraints */
>   308             if(
>   309                 (type ==
> (FLAC__StreamMetadata_Picture_Type)(-1) 
> || type == obj->data.picture.type) &&
>   310                 (mime_type == 0 || !strcmp(mime_type, 
> obj->data.picture.mime_type)) &&
>   311                 (description == 0 || !strcmp((const char 
> *)description, (const char *)obj->data.picture.description)) &&
>   312                 obj->data.picture.width <= max_width &&
>   313                 obj->data.picture.height <= max_height &&
>   314                 obj->data.picture.depth <= max_depth &&
>   315                 obj->data.picture.colors <= max_colors &&
>   316                 (area > max_area_seen || (area == max_area_seen
> && 
> obj->data.picture.depth > max_depth_seen))
>   317             ) {
>   318                 if(*picture)
>   319                     FLAC__metadata_object_delete(*picture);
>   320                 *picture = obj; // <------- HERE
>   321                 max_area_seen = area;
>   322                 max_depth_seen = obj->data.picture.depth;
>   323             }
>   324             else {
>   325                 FLAC__metadata_object_delete(obj);
>   326             }
>   327         }
>   328     } while(FLAC__metadata_simple_iterator_next(it));
>   329
>   330     FLAC__metadata_simple_iterator_delete(it);
>   331
>   332     return (0 != *picture);
>   333 }
> ...
> 
> In line 320 picture always overwrite in do { } ... while ( ) cycle.
> So it means, that every time I will get only the last image from
> file.
> Am I right?
> 
> So how to get all images?
> Thanks for any help.
> 
> Bests,
> 
> _______________________________________________
> Flac-dev mailing list
> Flac-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/flac-dev



      


More information about the Flac-dev mailing list