mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-26 15:02:58 +02:00
save cover if available, report avfc to streaminfo2
This commit is contained in:
@@ -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_AVFCONTEXT, avft);
|
||||||
|
}
|
||||||
|
return avft;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cPlayback::ReleaseAVFormatContext()
|
void cPlayback::ReleaseAVFormatContext()
|
||||||
{
|
{
|
||||||
|
avft->streams = NULL;
|
||||||
|
avft->nb_streams = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@@ -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();
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user