/*! * \brief Read the albumart images from the file * * \param tag The ID3v2 tag object in which to look for Album Art * \returns A QList containing a list of AlbumArtImage's * with the type and description of the APIC tag. */ AlbumArtList MetaIOID3::readAlbumArt(TagLib::ID3v2::Tag *tag) { AlbumArtList artlist; if (!tag->frameListMap()["APIC"].isEmpty()) { TagLib::ID3v2::FrameList apicframes = tag->frameListMap()["APIC"]; for(TagLib::ID3v2::FrameList::Iterator it = apicframes.begin(); it != apicframes.end(); ++it) { AttachedPictureFrame *frame = static_cast<AttachedPictureFrame *>(*it); // Assume a valid image would have at least // 100 bytes of data (1x1 indexed gif is 35 bytes) if (frame->picture().size() < 100) { LOG(VB_GENERAL, LOG_NOTICE, "Music Scanner - Discarding APIC frame " "with size less than 100 bytes"); continue; } AlbumArtImage *art = new AlbumArtImage(); if (frame->description().isEmpty()) art->m_description.clear(); else art->m_description = TStringToQString(frame->description()); art->m_embedded = true; art->m_hostname = gCoreContext->GetHostName(); QString ext = getExtFromMimeType( TStringToQString(frame->mimeType()).toLower()); switch (frame->type()) { case AttachedPictureFrame::FrontCover : art->m_imageType = IT_FRONTCOVER; art->m_filename = QString("front") + ext; break; case AttachedPictureFrame::BackCover : art->m_imageType = IT_BACKCOVER; art->m_filename = QString("back") + ext; break; case AttachedPictureFrame::Media : art->m_imageType = IT_CD; art->m_filename = QString("cd") + ext; break; case AttachedPictureFrame::LeafletPage : art->m_imageType = IT_INLAY; art->m_filename = QString("inlay") + ext; break; case AttachedPictureFrame::Artist : art->m_imageType = IT_ARTIST; art->m_filename = QString("artist") + ext; break; case AttachedPictureFrame::Other : art->m_imageType = IT_UNKNOWN; art->m_filename = QString("unknown") + ext; break; default: LOG(VB_GENERAL, LOG_ERR, "Music Scanner - APIC tag found " "with unsupported type"); delete art; continue; } artlist.append(art); } } return artlist; }
int internel_decoder::get_attached_images(char* url,stream_context *streamcontext){ stream_context *sc = streamcontext; AVInputFormat *format = sc->pFormatCtx->iformat; if(strcmp(format->name,"mp3") == 0){ sc->is_mp3 = 1; } /// If attached image of mp3 is not detected by ffmpeg then we use taglib to extract the attached image if(strcmp(format->name,"mp3") == 0 && sc->videostream == -1){ TagLib::MPEG::File mp3File(url); Tag * mp3Tag; FrameList listOfMp3Frames; AttachedPictureFrame * pictureFrame; AVPacket packet; //av_init_packet(&packet); mp3Tag= mp3File.ID3v2Tag(); if(mp3Tag) { listOfMp3Frames = mp3Tag->frameListMap()["APIC"]; if(!listOfMp3Frames.isEmpty()) { FrameList::ConstIterator it= listOfMp3Frames.begin(); // for(; it != listOfMp3Frames.end() ; it++) // { pictureFrame = static_cast<AttachedPictureFrame *> (*it); //cout <<"mime-type:"<<pictureFrame->mimeType()<<endl; AVCodec *codec; const char *mime_attached = pictureFrame->mimeType().toCString(false); const CodecMime *mime = ff_id3v2_mime_tags; while (mime->id != AV_CODEC_ID_NONE) { if (!av_strncasecmp(mime->str, mime_attached, sizeof(mime_attached))) { codec = avcodec_find_decoder(mime->id); cout <<"mime-type:"<<mime->str<<endl; break; } mime++; } if(mime->id != AV_CODEC_ID_NONE){ av_new_packet (&packet, pictureFrame->picture().size()); memcpy(packet.data,pictureFrame->picture().data(),pictureFrame->picture().size()); // packet.data = (uint8_t*)pictureFrame->picture().data(); packet.size = pictureFrame->picture().size(); packet.flags = AV_PKT_FLAG_KEY; pthread_mutex_lock(&sc->videolock); sc->videobuffer.push(packet); pthread_mutex_unlock(&sc->videolock); sc->videoctx = avcodec_alloc_context3(NULL); avcodec_open2(sc->videoctx,codec, NULL); sc->attachedimage = 1; AVFrame *frame = avcodec_alloc_frame(); int decode_ok; int len; while(true){ len = avcodec_decode_video2(sc->videoctx, frame, &decode_ok, &packet); if(decode_ok || len < 0){ break; } } if(len < 0){ sc->videoctx->width = 0; sc->videoctx->height = 0; sc->height = 0; sc->width = 0; av_free(frame); return -1; }else{ cout <<frame->height<<" - "<<frame->width<<endl; sc->videoctx->width = frame->width; sc->videoctx->height = frame->height; sc->height = frame->height; sc->width = frame->width; av_free(frame); } }else{ return -1; } //break; // } } else{ return -1; } } else { return -1; } } return 0; }