mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-26 23:13:16 +02:00
libeplayer3 optimizations
This commit is contained in:
@@ -73,6 +73,10 @@ bool cPlayback::SetSubtitlePid(unsigned short /*pid*/)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cPlayback::GetPts(uint64_t &/*pts*/)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
bool cPlayback::SetDvbsubtitlePid(unsigned short /*pid*/)
|
bool cPlayback::SetDvbsubtitlePid(unsigned short /*pid*/)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
@@ -37,6 +37,7 @@ class cPlayback
|
|||||||
bool SetSpeed(int speed);
|
bool SetSpeed(int speed);
|
||||||
bool GetSpeed(int &speed) const;
|
bool GetSpeed(int &speed) const;
|
||||||
bool GetPosition(int &position, int &duration);
|
bool GetPosition(int &position, int &duration);
|
||||||
|
void GetPts(uint64_t &pts);
|
||||||
bool SetPosition(int position, bool absolute = false);
|
bool SetPosition(int position, bool absolute = false);
|
||||||
void FindAllPids(uint16_t *apids, unsigned short *ac3flags, uint16_t *numpida, std::string *language);
|
void FindAllPids(uint16_t *apids, unsigned short *ac3flags, uint16_t *numpida, std::string *language);
|
||||||
void FindAllSubtitlePids(uint16_t *pids, uint16_t *numpids, std::string *language);
|
void FindAllSubtitlePids(uint16_t *pids, uint16_t *numpids, std::string *language);
|
||||||
|
@@ -106,7 +106,7 @@ static AVFormatContext* avContext = NULL;
|
|||||||
|
|
||||||
static unsigned char isContainerRunning = 0;
|
static unsigned char isContainerRunning = 0;
|
||||||
|
|
||||||
long long int latestPts = 0;
|
static long long int latestPts = 0;
|
||||||
|
|
||||||
static int restart_audio_resampling = 0;
|
static int restart_audio_resampling = 0;
|
||||||
static off_t seek_target_bytes = 0;
|
static off_t seek_target_bytes = 0;
|
||||||
|
@@ -118,20 +118,19 @@ static int writeData(void* _call)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dst_stride = call->destStride/sizeof(uint32_t);
|
||||||
|
int dst_delta = dst_stride - call->Width;
|
||||||
|
uint32_t *dst = call->destination + call->y * dst_stride + call->x;
|
||||||
|
|
||||||
if (call->data)
|
if (call->data)
|
||||||
{
|
{
|
||||||
int src_stride = call->Stride;
|
int src_delta = call->Stride - call->Width;
|
||||||
unsigned int x,y;
|
unsigned char *src = call->data;
|
||||||
const unsigned char *src = call->data;
|
static uint32_t last_color = 0, colortable[256];
|
||||||
int dst_stride = call->destStride/sizeof(uint32_t);
|
|
||||||
int dst_delta = dst_stride - call->Width;
|
|
||||||
uint32_t *dst = call->destination + call->y * dst_stride + call->x;
|
|
||||||
static uint32_t last_color = 0;
|
|
||||||
static uint32_t colortable[256];
|
|
||||||
if (last_color != call->color) {
|
if (last_color != call->color) {
|
||||||
// call->color is rgba, our spark frame buffer is argb
|
// call->color is rgba, our spark frame buffer is argb
|
||||||
uint32_t c = call->color >> 8;
|
uint32_t c = call->color >> 8, a = 255 - (call->color & 0xff);
|
||||||
uint32_t a = 255 - (call->color & 0xff);
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < 256; i++) {
|
||||||
uint32_t k = (a * i) >> 8;
|
uint32_t k = (a * i) >> 8;
|
||||||
@@ -150,25 +149,21 @@ static int writeData(void* _call)
|
|||||||
fb_printf(100, "dest %p\n", call->destination);
|
fb_printf(100, "dest %p\n", call->destination);
|
||||||
fb_printf(100, "dest.stride %d\n", call->destStride);
|
fb_printf(100, "dest.stride %d\n", call->destStride);
|
||||||
|
|
||||||
for (y=0;y<call->Height;y++) {
|
unsigned char *src_final = src + call->Height * call->Width;
|
||||||
for (x = 0; x < call->Width; x++) {
|
for (; src < src_final; dst += dst_delta, src += src_delta) {
|
||||||
uint32_t c = colortable[src[x]];
|
u_char *src_end = src + call->Width;
|
||||||
|
for (; src < src_end; dst++, src++) {
|
||||||
|
uint32_t c = colortable[*src];
|
||||||
if (c)
|
if (c)
|
||||||
*dst++ = c;
|
*dst = c;
|
||||||
else
|
|
||||||
dst++;
|
|
||||||
}
|
}
|
||||||
dst += dst_delta;
|
|
||||||
src += src_stride;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int y;
|
uint32_t *dst_final = dst + call->Width + call->Height * dst_stride;
|
||||||
int dst_stride = call->destStride/sizeof(uint32_t);
|
for (; dst < dst_final; dst += dst_delta) {
|
||||||
uint32_t *dst = call->destination + call->y * dst_stride + call->x;
|
uint32_t *dst_end = dst + call->Width;
|
||||||
|
for (; dst < dst_end; dst++)
|
||||||
for (y = 0; y < call->Height; y++) {
|
*dst = 0;
|
||||||
memset(dst, 0, call->Width * 4);
|
|
||||||
dst += dst_stride;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -92,7 +92,6 @@ typedef struct avcC_s
|
|||||||
/* ***************************** */
|
/* ***************************** */
|
||||||
const unsigned char Head[] = {0, 0, 0, 1};
|
const unsigned char Head[] = {0, 0, 0, 1};
|
||||||
static int initialHeader = 1;
|
static int initialHeader = 1;
|
||||||
//static int NoOtherBeginningFound = 1;
|
|
||||||
static unsigned int NalLengthBytes = 1;
|
static unsigned int NalLengthBytes = 1;
|
||||||
|
|
||||||
/* ***************************** */
|
/* ***************************** */
|
||||||
@@ -106,7 +105,6 @@ static unsigned int NalLengthBytes = 1;
|
|||||||
static int reset()
|
static int reset()
|
||||||
{
|
{
|
||||||
initialHeader = 1;
|
initialHeader = 1;
|
||||||
//NoOtherBeginningFound = 1;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,8 +146,6 @@ static int writeData(void* _call)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((call->len > 3) && ((call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x00 && call->data[3] == 0x01) ||
|
if((call->len > 3) && ((call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x00 && call->data[3] == 0x01) ||
|
||||||
// This seems to make playback unreliable. Disabled for now. --martii
|
|
||||||
//(call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x01 && NoOtherBeginningFound) ||
|
|
||||||
(call->data[0] == 0xff && call->data[1] == 0xff && call->data[2] == 0xff && call->data[3] == 0xff)))
|
(call->data[0] == 0xff && call->data[1] == 0xff && call->data[2] == 0xff && call->data[3] == 0xff)))
|
||||||
{
|
{
|
||||||
unsigned int PacketLength = 0;
|
unsigned int PacketLength = 0;
|
||||||
@@ -172,7 +168,6 @@ static int writeData(void* _call)
|
|||||||
iov[0].iov_len = InsertPesHeader(PesHeader, PacketLength, MPEG_VIDEO_PES_START_CODE, call->Pts, FakeStartCode);
|
iov[0].iov_len = InsertPesHeader(PesHeader, PacketLength, MPEG_VIDEO_PES_START_CODE, call->Pts, FakeStartCode);
|
||||||
return writev(call->fd, iov, ic);
|
return writev(call->fd, iov, ic);
|
||||||
}
|
}
|
||||||
//NoOtherBeginningFound = 0;
|
|
||||||
|
|
||||||
if (initialHeader)
|
if (initialHeader)
|
||||||
{
|
{
|
||||||
|
@@ -206,7 +206,7 @@ static int writeData(void* _call)
|
|||||||
if (initialHeader) {
|
if (initialHeader) {
|
||||||
initialHeader = 0;
|
initialHeader = 0;
|
||||||
prepareClipPlay(pcmPrivateData->uNoOfChannels, pcmPrivateData->uSampleRate,
|
prepareClipPlay(pcmPrivateData->uNoOfChannels, pcmPrivateData->uSampleRate,
|
||||||
pcmPrivateData->uBitsPerSample, pcmPrivateData->bLittleEndian);
|
pcmPrivateData->uBitsPerSample, pcmPrivateData->bLittleEndian);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char * buffer = call->data;
|
unsigned char * buffer = call->data;
|
||||||
|
@@ -430,6 +430,11 @@ bool cPlayback::GetSpeed(int &speed) const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cPlayback::GetPts(uint64_t &pts)
|
||||||
|
{
|
||||||
|
player->playback->Command(player, PLAYBACK_PTS, (void*)pts);
|
||||||
|
}
|
||||||
|
|
||||||
// in milliseconds
|
// in milliseconds
|
||||||
bool cPlayback::GetPosition(int &position, int &duration)
|
bool cPlayback::GetPosition(int &position, int &duration)
|
||||||
{
|
{
|
||||||
|
@@ -41,6 +41,7 @@ class cPlayback
|
|||||||
bool SetSpeed(int speed);
|
bool SetSpeed(int speed);
|
||||||
bool GetSpeed(int &speed) const;
|
bool GetSpeed(int &speed) const;
|
||||||
bool GetPosition(int &position, int &duration);
|
bool GetPosition(int &position, int &duration);
|
||||||
|
void GetPts(uint64_t &pts);
|
||||||
bool SetPosition(int position, bool absolute = false);
|
bool SetPosition(int position, bool absolute = false);
|
||||||
void FindAllPids(uint16_t *apids, unsigned short *ac3flags, uint16_t *numpida, std::string *language);
|
void FindAllPids(uint16_t *apids, unsigned short *ac3flags, uint16_t *numpida, std::string *language);
|
||||||
void FindAllSubtitlePids(uint16_t *pids, uint16_t *numpids, std::string *language);
|
void FindAllSubtitlePids(uint16_t *pids, uint16_t *numpids, std::string *language);
|
||||||
|
Reference in New Issue
Block a user