fix some movieplayer issues

This commit is contained in:
martii
2012-07-27 20:09:26 +02:00
parent 1d0e6663c4
commit d6bdeb0ff0
5 changed files with 85 additions and 0 deletions

View File

@@ -108,7 +108,11 @@ static long long int latestPts = 0;
/* Prototypes */
/* ***************************** */
static int container_ffmpeg_seek_bytes(off_t pos);
#ifdef MARTII
static int container_ffmpeg_seek(Context_t *context, float sec, int absolute);
#else
static int container_ffmpeg_seek(Context_t *context, float sec);
#endif
static int container_ffmpeg_seek_rel(Context_t *context, off_t pos, long long int pts, float sec);
static int container_ffmpeg_seek_bytes_rel(off_t start, off_t bytes);
@@ -1482,12 +1486,32 @@ static int container_ffmpeg_seek_rel(Context_t *context, off_t pos, long long in
return cERR_CONTAINER_FFMPEG_NO_ERROR;
}
#ifdef MARTII
static int container_ffmpeg_seek(Context_t *context, float sec, int absolute) {
#else
static int container_ffmpeg_seek(Context_t *context, float sec) {
#endif
Track_t * videoTrack = NULL;
Track_t * audioTrack = NULL;
Track_t * current = NULL;
int flag = 0;
#ifdef MARTII
if (absolute) {
ffmpeg_printf(10, "goto %f sec\n", sec);
if (sec < 0.0)
sec = 0.0;
} else {
ffmpeg_printf(10, "seeking %f sec\n", sec);
if (sec == 0.0)
{
ffmpeg_err("sec = 0.0 ignoring\n");
return cERR_CONTAINER_FFMPEG_ERR;
}
}
#else
#if !defined(VDR1722)
ffmpeg_printf(10, "seeking %f sec\n", sec);
@@ -1504,6 +1528,7 @@ static int container_ffmpeg_seek(Context_t *context, float sec) {
ffmpeg_err("sec < 0.0 ignoring\n");
return cERR_CONTAINER_FFMPEG_ERR;
}
#endif
#endif
context->manager->video->Command(context, MANAGER_GET_TRACK, &videoTrack);
context->manager->audio->Command(context, MANAGER_GET_TRACK, &audioTrack);
@@ -1514,7 +1539,11 @@ static int container_ffmpeg_seek(Context_t *context, float sec) {
current = audioTrack;
if (current == NULL) {
#ifdef MARTII
ffmpeg_err( "no track available to seek\n");
#else
ffmpeg_err( "no track avaibale to seek\n");
#endif
return cERR_CONTAINER_FFMPEG_ERR;
}
@@ -1551,15 +1580,26 @@ static int container_ffmpeg_seek(Context_t *context, float sec) {
{
sec *= 180000.0;
}
#ifdef MARTII
if (absolute)
pos = sec;
else
pos += sec;
#else
#if !defined(VDR1722)
pos += sec;
#else
pos = sec;
#endif
#endif
if (pos < 0)
{
#ifdef MARTII
pos = 0;
#else
ffmpeg_err("end of file reached\n");
return cERR_CONTAINER_FFMPEG_END_OF_FILE;
#endif
}
ffmpeg_printf(10, "1. seeking to position %lld bytes ->sec %f\n", pos, sec);
@@ -1573,8 +1613,13 @@ static int container_ffmpeg_seek(Context_t *context, float sec) {
} else
{
#ifdef MARTII
if (!absolute)
sec += ((float) current->pts / 90000.0f);
#else
#if !defined(VDR1722)
sec += ((float) current->pts / 90000.0f);
#endif
#endif
ffmpeg_printf(10, "2. seeking to position %f sec ->time base %f %d\n", sec, av_q2d(((AVStream*) current->stream)->time_base), AV_TIME_BASE);
@@ -1737,9 +1782,19 @@ static int Command(void *_context, ContainerCmd_t command, void * argument)
break;
}
case CONTAINER_SEEK: {
#ifdef MARTII
ret = container_ffmpeg_seek(context, (float)*((float*)argument), 0);
#else
ret = container_ffmpeg_seek(context, (float)*((float*)argument));
#endif
break;
}
#ifdef MARTII
case CONTAINER_SEEK_ABS: {
ret = container_ffmpeg_seek(context, (float)*((float*)argument), -1);
break;
}
#endif
case CONTAINER_LENGTH: {
double length = 0;
ret = container_ffmpeg_get_length(context, &length);

View File

@@ -10,6 +10,9 @@ CONTAINER_CAPABILITIES,
CONTAINER_PLAY,
CONTAINER_STOP,
CONTAINER_SEEK,
#ifdef MARTII
CONTAINER_SEEK_ABS,
#endif
CONTAINER_LENGTH,
CONTAINER_DEL,
CONTAINER_SWITCH_AUDIO,

View File

@@ -2,7 +2,11 @@
#define PLAYBACK_H_
#include <sys/types.h>
#ifdef MARTII
typedef enum {PLAYBACK_OPEN, PLAYBACK_CLOSE, PLAYBACK_PLAY, PLAYBACK_STOP, PLAYBACK_PAUSE, PLAYBACK_CONTINUE, PLAYBACK_FLUSH, PLAYBACK_TERM, PLAYBACK_FASTFORWARD, PLAYBACK_SEEK, PLAYBACK_SEEK_ABS, PLAYBACK_PTS, PLAYBACK_LENGTH, PLAYBACK_SWITCH_AUDIO, PLAYBACK_SWITCH_SUBTITLE, PLAYBACK_INFO, PLAYBACK_SLOWMOTION, PLAYBACK_FASTBACKWARD, PLAYBACK_GET_FRAME_COUNT} PlaybackCmd_t;
#else
typedef enum {PLAYBACK_OPEN, PLAYBACK_CLOSE, PLAYBACK_PLAY, PLAYBACK_STOP, PLAYBACK_PAUSE, PLAYBACK_CONTINUE, PLAYBACK_FLUSH, PLAYBACK_TERM, PLAYBACK_FASTFORWARD, PLAYBACK_SEEK, PLAYBACK_PTS, PLAYBACK_LENGTH, PLAYBACK_SWITCH_AUDIO, PLAYBACK_SWITCH_SUBTITLE, PLAYBACK_INFO, PLAYBACK_SLOWMOTION, PLAYBACK_FASTBACKWARD, PLAYBACK_GET_FRAME_COUNT} PlaybackCmd_t;
#endif
typedef struct PlaybackHandler_s {
char * Name;

View File

@@ -756,7 +756,11 @@ static int PlaybackSlowMotion(Context_t *context,int* speed) {
return ret;
}
#ifdef MARTII
static int PlaybackSeek(Context_t *context, float * pos, int absolute) {
#else
static int PlaybackSeek(Context_t *context, float * pos) {
#endif
int ret = cERR_PLAYBACK_NO_ERROR;
playback_printf(10, "pos: %f\n", *pos);
@@ -766,6 +770,11 @@ static int PlaybackSeek(Context_t *context, float * pos) {
context->output->Command(context, OUTPUT_CLEAR, NULL);
#ifdef MARTII
if (absolute)
context->container->selectedContainer->Command(context, CONTAINER_SEEK_ABS, pos);
else
#endif
context->container->selectedContainer->Command(context, CONTAINER_SEEK, pos);
context->playback->isSeeking = 0;
@@ -990,9 +999,19 @@ static int Command(void* _context, PlaybackCmd_t command, void * argument) {
break;
}
case PLAYBACK_SEEK: {
#ifdef MARTII
ret = PlaybackSeek(context, (float*)argument, 0);
#else
ret = PlaybackSeek(context, (float*)argument);
#endif
break;
}
#ifdef MARTII
case PLAYBACK_SEEK_ABS: {
ret = PlaybackSeek(context, (float*)argument, -1);
break;
}
#endif
case PLAYBACK_PTS: { // 10
ret = PlaybackPts(context, (unsigned long long int*)argument);
break;