From e1c1c07b0d9a6a028f1d1afb4d2f946ae67d3988 Mon Sep 17 00:00:00 2001 From: TangoCash Date: Wed, 16 Sep 2020 21:40:39 +0200 Subject: [PATCH] save cover if available, report avfc to streaminfo2 --- libarmbox/playback_libeplayer3.cpp | 10 ++++- libarmbox/playback_libeplayer3.h | 1 + libeplayer3/container/container_ffmpeg.c | 51 ++++++++++++++++++++++++ libeplayer3/include/container.h | 3 +- 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/libarmbox/playback_libeplayer3.cpp b/libarmbox/playback_libeplayer3.cpp index 4e621f9..9654ebf 100644 --- a/libarmbox/playback_libeplayer3.cpp +++ b/libarmbox/playback_libeplayer3.cpp @@ -54,6 +54,7 @@ bool cPlayback::Open(playmode_t PlayMode) last_size = 0; nPlaybackSpeed = 0; init_jump = -1; + avft = avformat_alloc_context(); if (!player) { @@ -117,7 +118,6 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in mAudioStream = 0; mSubtitleStream = -1; mTeletextStream = -1; - unlink("/tmp/.id3coverart"); std::string file; if (*filename == '/') @@ -856,11 +856,17 @@ uint64_t cPlayback::GetReadCount() AVFormatContext *cPlayback::GetAVFormatContext() { - return NULL; + if (player && player->container && player->container->selectedContainer) + { + player->container->selectedContainer->Command(player, CONTAINER_GET_AVFCONTEXT, avft); + } + return avft; } void cPlayback::ReleaseAVFormatContext() { + avft->streams = NULL; + avft->nb_streams = NULL; } #if 0 diff --git a/libarmbox/playback_libeplayer3.h b/libarmbox/playback_libeplayer3.h index 054c528..9b1a0f7 100644 --- a/libarmbox/playback_libeplayer3.h +++ b/libarmbox/playback_libeplayer3.h @@ -35,6 +35,7 @@ class cPlayback std::string fn_xml; off64_t last_size; int init_jump; + AVFormatContext *avft; public: cPlayback(int num = 0); ~cPlayback(); diff --git a/libeplayer3/container/container_ffmpeg.c b/libeplayer3/container/container_ffmpeg.c index 276f4ec..98004b8 100644 --- a/libeplayer3/container/container_ffmpeg.c +++ b/libeplayer3/container/container_ffmpeg.c @@ -3287,6 +3287,52 @@ static int container_ffmpeg_get_metadata(Context_t *context, char ***p) *pp++ = NULL; *pp = NULL; + // find the first attached picture, if available + unlink("/tmp/.id3coverart"); + for(unsigned int i = 0; i < avContextTab[0]->nb_streams; i++) { + if (avContextTab[0]->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC) { + AVPacket *pkt = NULL; + pkt = av_packet_clone(&avContextTab[0]->streams[i]->attached_pic); + FILE *cover_art = fopen("/tmp/.id3coverart", "wb"); + if (cover_art) { + fwrite(pkt->data, pkt->size, 1, cover_art); + fclose(cover_art); + } + av_packet_free(&pkt); + break; + } + } + + return cERR_CONTAINER_FFMPEG_NO_ERROR; +} + +static int container_ffmpeg_av_context(Context_t *context, AVFormatContext *ext_avContext) +{ + if (!context) + { + fprintf(stderr, "BUG %s:%d\n", __func__, __LINE__); + return cERR_CONTAINER_FFMPEG_ERR; + } + if (avContextTab[0] != NULL) + { + getMutex(__FILE__, __FUNCTION__, __LINE__); + ext_avContext->streams = avContextTab[0]->streams; + ext_avContext->nb_streams = avContextTab[0]->nb_streams; + releaseMutex(__FILE__, __FUNCTION__, __LINE__); + } + else if ((avContextTab[0] == NULL) && (avContextTab[1] != NULL)) + { + getMutex(__FILE__, __FUNCTION__, __LINE__); + ext_avContext->streams = avContextTab[1]->streams; + ext_avContext->nb_streams = avContextTab[1]->nb_streams; + releaseMutex(__FILE__, __FUNCTION__, __LINE__); + } + else + { + ext_avContext->streams = NULL; + ext_avContext->nb_streams = NULL; + } + return cERR_CONTAINER_FFMPEG_NO_ERROR; } @@ -3383,6 +3429,11 @@ static int32_t Command(Context_t *context, ContainerCmd_t command, void *argumen ret = container_ffmpeg_get_metadata(context, (char ***)argument); break; } + case CONTAINER_GET_AVFCONTEXT: + { + ret = container_ffmpeg_av_context(context, (AVFormatContext *)argument); + break; + } default: ffmpeg_err("ContainerCmd %d not supported!\n", command); ret = cERR_CONTAINER_FFMPEG_ERR; diff --git a/libeplayer3/include/container.h b/libeplayer3/include/container.h index dc1a585..cdfc1ec 100644 --- a/libeplayer3/include/container.h +++ b/libeplayer3/include/container.h @@ -25,7 +25,8 @@ typedef enum CONTAINER_GET_BUFFER_SIZE, CONTAINER_GET_BUFFER_STATUS, CONTAINER_STOP_BUFFER, - CONTAINER_GET_METADATA + CONTAINER_GET_METADATA, + CONTAINER_GET_AVFCONTEXT } ContainerCmd_t; struct Context_s;