save cover if available, report avfc to streaminfo2

Origin commit data
------------------
Branch: master
Commit: 04ef6adff5
Author: TangoCash <eric@loxat.de>
Date: 2020-09-16 (Wed, 16 Sep 2020)


------------------
No further description and justification available within origin commit message!

------------------
This commit was generated by Migit
This commit is contained in:
TangoCash
2020-09-16 21:40:39 +02:00
committed by vanhofen
parent 89efe1a366
commit ba6bc533cd
4 changed files with 62 additions and 3 deletions

View File

@@ -54,6 +54,7 @@ bool cPlayback::Open(playmode_t PlayMode)
last_size = 0; last_size = 0;
nPlaybackSpeed = 0; nPlaybackSpeed = 0;
init_jump = -1; init_jump = -1;
avft = avformat_alloc_context();
if (!player) if (!player)
{ {
@@ -117,7 +118,6 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in
mAudioStream = 0; mAudioStream = 0;
mSubtitleStream = -1; mSubtitleStream = -1;
mTeletextStream = -1; mTeletextStream = -1;
unlink("/tmp/.id3coverart");
std::string file; std::string file;
if (*filename == '/') if (*filename == '/')
@@ -856,11 +856,17 @@ uint64_t cPlayback::GetReadCount()
AVFormatContext *cPlayback::GetAVFormatContext() AVFormatContext *cPlayback::GetAVFormatContext()
{ {
return NULL; if (player && player->container && player->container->selectedContainer)
{
player->container->selectedContainer->Command(player, CONTAINER_GET_AVCONTEXT, avft);
}
return avft;
} }
void cPlayback::ReleaseAVFormatContext() void cPlayback::ReleaseAVFormatContext()
{ {
avft->streams = NULL;
avft->nb_streams = NULL;
} }
#if 0 #if 0

View File

@@ -35,6 +35,7 @@ class cPlayback
std::string fn_xml; std::string fn_xml;
off64_t last_size; off64_t last_size;
int init_jump; int init_jump;
AVFormatContext *avft;
public: public:
cPlayback(int num = 0); cPlayback(int num = 0);
~cPlayback(); ~cPlayback();

View File

@@ -3287,6 +3287,52 @@ static int container_ffmpeg_get_metadata(Context_t *context, char ***p)
*pp++ = NULL; *pp++ = NULL;
*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; 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); ret = container_ffmpeg_get_metadata(context, (char ***)argument);
break; break;
} }
case CONTAINER_GET_AVFCONTEXT:
{
ret = container_ffmpeg_av_context(context, (AVFormatContext *)argument);
break;
}
default: default:
ffmpeg_err("ContainerCmd %d not supported!\n", command); ffmpeg_err("ContainerCmd %d not supported!\n", command);
ret = cERR_CONTAINER_FFMPEG_ERR; ret = cERR_CONTAINER_FFMPEG_ERR;

View File

@@ -25,7 +25,8 @@ typedef enum
CONTAINER_GET_BUFFER_SIZE, CONTAINER_GET_BUFFER_SIZE,
CONTAINER_GET_BUFFER_STATUS, CONTAINER_GET_BUFFER_STATUS,
CONTAINER_STOP_BUFFER, CONTAINER_STOP_BUFFER,
CONTAINER_GET_METADATA CONTAINER_GET_METADATA,
CONTAINER_GET_AVFCONTEXT
} ContainerCmd_t; } ContainerCmd_t;
struct Context_s; struct Context_s;