Closed GoogleCodeExporter closed 8 years ago
Does this code in tags.c not work for you?
if( tags->artworkCount ) {
const MP4TagArtwork* art = tags->artwork; /* artwork != NULL when
artworkCount > 0 */
uint32_t i;
for( i = 0; i < tags->artworkCount; i++, art++ )
printf( "art[%d]: type=%d size=%u data=%p\n", i, art->type, art->size,
art->data );
}
...admittedly it seems like tags->artwork would need to be **, but give this
code a
try and let me know how it goes.
Original comment by kid...@gmail.com
on 6 Apr 2010 at 2:58
Yes this works to inform you of how many artworks are available. The problem is
that
the Tags structure only
retrieves the Last art work. In the Meta data we had GetMetadataCoverArt Which
allows
you to get the artwork by index.
As far as I can find there is no similar function in the New "Tags" version. Am
I
Missing it ? ( I will feel like a fool if I am )
I did a temporary change to the GetMetadataCoverArt for my use that includes
the
arttype. It was simple and saves me the time
Seemed silly not to return the arttype when you are retrieving a piece of
artwork.
Thanx for your help !
Below is the modifications that I made to the 1.91 release to get what I wanted.
Seems like it would not be that hard to
add something similar to the "Tags" version since the routines and structures
are all
still there. Understand I am a Delphi
(pascal) programmer first and a C++ in my spare time ! This has been tortured
and has
( so far ) ran flawlessly.
Of course this could not be used because if would break anybody else's use of
the
library.
in cmeta.cpp .....................................
bool MP4GetMetadataCoverArt(MP4FileHandle hFile,
uint8_t **coverArt, uint32_t* size,uint32_t* type,
uint32_t index)
{
if (MP4_IS_VALID_FILE_HANDLE(hFile)) {
try {
return ((MP4File*)hFile)->GetMetadataCoverArt(coverArt, size,type, index);
}
catch (MP4Error* e) {
PRINT_ERROR(e);
delete e;
}
}
return false;
}
in coverartbox.cpp .................................
bool
CoverArtBox::get( MP4FileHandle hFile, Item& item, uint32_t index )
{
item.reset();
MP4File& file = *((MP4File*)hFile);
MP4Atom* covr = file.FindAtom( "moov.udta.meta.ilst.covr" );
if( !covr )
return true;
if( !(index < covr->GetNumberOfChildAtoms()) )
return true;
MP4DataAtom* data = static_cast<MP4DataAtom*>( covr->GetChildAtom( index ));
if( !data )
return true;
MP4BytesProperty* metadata = NULL;
if ( !data->FindProperty( "data.metadata", (MP4Property**)&metadata ))
return true;
// -------------- changes start here
--------------------------------------------------
// the problem here is that some programs have the wrong number
// in the "type" or just 00 hence we end up with the wrong types
// better bet is to find the type using the routine already in place !
// rather than screw up the rest ( got an Exception error without )
// just let the lib take care of this
metadata->GetValue( &item.buffer, &item.size );
item.autofree = true;
item.type = data->typeCode.GetValue();
item.type = BT_UNDEFINED; // setting this overrides the value above !
// i'm sure there is a better way to do this
// I will leave that to the code gods
// this borrowed from the set cover art !
item.type = (item.type == BT_UNDEFINED) ? computeBasicType( item.buffer, item.size
): item.type;
// -------------------------------- end changes
------------------------------------
return false;
}
in type.cpp .................................
// POD static init does not need singletons
static ImageHeader IMAGE_HEADERS[] = {
{ BT_BMP, "\x42\x4d" }, // there was an error here these bytes were
reversed see issue # 59
{ BT_GIF, "GIF87a" },
{ BT_GIF, "GIF89a" },
{ BT_JPEG, "\xff\xd8\xff\xe0" },
{ BT_PNG, "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" },
{ BT_UNDEFINED } // must be last
};
}
in mp4file.h .................................................
bool GetMetadataCoverArt(uint8_t **coverArt, uint32_t* size, uint32_t* type,
uint32_t index = 0);
in meta.h .....
/**
* @deprecated Deprecated, scheduled for removal. Please use the tags convenience API.
*/
MP4V2_DEPRECATED
MP4V2_EXPORT
bool MP4GetMetadataCoverArt(
MP4FileHandle hFile,
uint8_t** coverArt,
uint32_t* size,
uint32_t* type, // added by DW 3/1/10
uint32_t index DEFAULT(0) );
in MP4Meta.cpp ................................
bool MP4File::GetMetadataCoverArt(uint8_t **coverArt, uint32_t *size,uint32_t
*type,
uint32_t index)
{
char buffer[256];
if (size == NULL || coverArt == NULL) return false;
if (index > 0 && index > GetMetadataCoverArtCount()) return false;
snprintf(buffer, 256, "moov.udta.meta.ilst.covr.data[%d].metadata", index);
*coverArt = NULL;
*size = 0;
*type =0;
GetBytesProperty(buffer, coverArt, size);
itmf::BasicType arttype;
arttype = impl::itmf::computeBasicType(*coverArt,*size);
*type = arttype;
if (size == 0)
return false;
return true;
}
Original comment by wils...@tampabay.rr.com
on 6 Apr 2010 at 12:57
could you attach a file with multiple pieces of artwork for me to play with?
Original comment by kid...@gmail.com
on 6 Apr 2010 at 8:09
Ok this has Six pictures attached first 4 are simple arrows down left right and
up
then there is a .jpg image and then another .bmp ! I had built this file when I
Could not understand why the .bmp file type was not recognized. ( This was the
Error
in the type.cpp file. If I can help in anyway please let me know. I just about
got
the library figured out but still a lot I do not understand !
Thanx
Don Wilson
Original comment by wils...@tampabay.rr.com
on 6 Apr 2010 at 10:06
Attachments:
okay, kona did some research on this. Basically, you either need to use trunk
or
wait for 2.0.0. The code I posted above works just fine to retrieve artwork,
including multiple pieces of art.
I did submit your change to the BM string, so that's already in there.
Closing
Original comment by kid...@gmail.com
on 23 Apr 2010 at 10:23
Original issue reported on code.google.com by
wils...@tampabay.rr.com
on 26 Feb 2010 at 9:13Attachments: