mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-26 23:13:16 +02:00
libeplayer3: fix backward mode
This commit is contained in:
@@ -82,8 +82,9 @@ bool Input::Play()
|
|||||||
{
|
{
|
||||||
hasPlayThreadStarted = 1;
|
hasPlayThreadStarted = 1;
|
||||||
|
|
||||||
int64_t showtime = 0, bofcount = 0;
|
int64_t showtime = 0;
|
||||||
bool restart_audio_resampling = false;
|
bool restart_audio_resampling = false;
|
||||||
|
bool bof = false;
|
||||||
int warnAudioWrite = 0;
|
int warnAudioWrite = 0;
|
||||||
int warnVideoWrite = 0;
|
int warnVideoWrite = 0;
|
||||||
|
|
||||||
@@ -103,19 +104,19 @@ bool Input::Play()
|
|||||||
if (avfc->iformat->flags & AVFMT_TS_DISCONT) {
|
if (avfc->iformat->flags & AVFMT_TS_DISCONT) {
|
||||||
if (avfc->bit_rate) {
|
if (avfc->bit_rate) {
|
||||||
seek_target_flag = AVSEEK_FLAG_BYTE;
|
seek_target_flag = AVSEEK_FLAG_BYTE;
|
||||||
seek_target = avio_tell(avfc->pb) + seek_avts_rel * avfc->bit_rate / ( 8 * AV_TIME_BASE);
|
seek_target = avio_tell(avfc->pb) + av_rescale(seek_avts_rel, avfc->bit_rate, 8 * AV_TIME_BASE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int64_t pts;
|
int64_t pts;
|
||||||
if(player->output.GetPts(pts))
|
if(player->output.GetPts(pts))
|
||||||
seek_target = (pts * AV_TIME_BASE) / 90000 + seek_avts_rel;
|
seek_target = av_rescale(pts, AV_TIME_BASE, 90000ll) + seek_avts_rel;
|
||||||
}
|
}
|
||||||
seek_avts_rel = 0;
|
seek_avts_rel = 0;
|
||||||
} else if (seek_avts_abs != INT64_MIN) {
|
} else if (seek_avts_abs != INT64_MIN) {
|
||||||
if (avfc->iformat->flags & AVFMT_TS_DISCONT) {
|
if (avfc->iformat->flags & AVFMT_TS_DISCONT) {
|
||||||
if (avfc->bit_rate) {
|
if (avfc->bit_rate) {
|
||||||
seek_target_flag = AVSEEK_FLAG_BYTE;
|
seek_target_flag = AVSEEK_FLAG_BYTE;
|
||||||
seek_target = seek_avts_abs * avfc->bit_rate / (8 * AV_TIME_BASE);
|
seek_target = av_rescale(seek_avts_abs, avfc->bit_rate, 8 * AV_TIME_BASE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
seek_target = seek_avts_abs;
|
seek_target = seek_avts_abs;
|
||||||
@@ -124,27 +125,16 @@ bool Input::Play()
|
|||||||
} else if (player->isBackWard && av_gettime() >= showtime) {
|
} else if (player->isBackWard && av_gettime() >= showtime) {
|
||||||
player->output.ClearVideo();
|
player->output.ClearVideo();
|
||||||
|
|
||||||
if (bofcount == 1) {
|
if (bof) {
|
||||||
showtime = av_gettime();
|
showtime = av_gettime();
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
seek_avts_rel = player->Speed * AV_TIME_BASE;
|
||||||
if (avfc->iformat->flags & AVFMT_TS_DISCONT) {
|
|
||||||
off_t pos = avio_tell(avfc->pb);
|
|
||||||
|
|
||||||
if (pos > 0 && avfc->bit_rate) {
|
|
||||||
seek_target_flag = AVSEEK_FLAG_BYTE;
|
|
||||||
seek_target = pos + player->Speed * avfc->bit_rate * AV_TIME_BASE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
int64_t pts;
|
|
||||||
if(player->output.GetPts(pts))
|
|
||||||
seek_target = (pts * AV_TIME_BASE) / 90000 + seek_avts_rel;
|
|
||||||
}
|
|
||||||
showtime = av_gettime() + 300000; //jump back every 300ms
|
showtime = av_gettime() + 300000; //jump back every 300ms
|
||||||
|
continue;
|
||||||
} else {
|
} else {
|
||||||
bofcount = 0;
|
bof = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seek_target > INT64_MIN) {
|
if (seek_target > INT64_MIN) {
|
||||||
@@ -154,7 +144,8 @@ bool Input::Play()
|
|||||||
res = avformat_seek_file(avfc, -1, INT64_MIN, seek_target, INT64_MAX, seek_target_flag);
|
res = avformat_seek_file(avfc, -1, INT64_MIN, seek_target, INT64_MAX, seek_target_flag);
|
||||||
|
|
||||||
if (res < 0 && player->isBackWard)
|
if (res < 0 && player->isBackWard)
|
||||||
bofcount = 1;
|
bof = true;
|
||||||
|
|
||||||
seek_target = INT64_MIN;
|
seek_target = INT64_MIN;
|
||||||
restart_audio_resampling = true;
|
restart_audio_resampling = true;
|
||||||
|
|
||||||
|
@@ -79,7 +79,7 @@ bool Output::Open()
|
|||||||
if (videofd < 0)
|
if (videofd < 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
dioctl(videofd, VIDEO_CLEAR_BUFFER, NULL);
|
ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL);
|
||||||
dioctl(videofd, VIDEO_SELECT_SOURCE, (void *) VIDEO_SOURCE_MEMORY);
|
dioctl(videofd, VIDEO_SELECT_SOURCE, (void *) VIDEO_SOURCE_MEMORY);
|
||||||
dioctl(videofd, VIDEO_SET_STREAMTYPE, (void *) STREAM_TYPE_PROGRAM);
|
dioctl(videofd, VIDEO_SET_STREAMTYPE, (void *) STREAM_TYPE_PROGRAM);
|
||||||
dioctl(videofd, VIDEO_SET_SPEED, DVB_SPEED_NORMAL_PLAY);
|
dioctl(videofd, VIDEO_SET_SPEED, DVB_SPEED_NORMAL_PLAY);
|
||||||
@@ -93,7 +93,7 @@ bool Output::Open()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
dioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
|
ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
|
||||||
dioctl(audiofd, AUDIO_SELECT_SOURCE, (void *) AUDIO_SOURCE_MEMORY);
|
dioctl(audiofd, AUDIO_SELECT_SOURCE, (void *) AUDIO_SOURCE_MEMORY);
|
||||||
dioctl(audiofd, AUDIO_SET_STREAMTYPE, (void *) STREAM_TYPE_PROGRAM);
|
dioctl(audiofd, AUDIO_SET_STREAMTYPE, (void *) STREAM_TYPE_PROGRAM);
|
||||||
|
|
||||||
@@ -225,10 +225,10 @@ bool Output::Flush()
|
|||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
||||||
|
|
||||||
if (videofd > -1 && dioctl(videofd, VIDEO_FLUSH, NULL))
|
if (videofd > -1 && ioctl(videofd, VIDEO_FLUSH, NULL))
|
||||||
ret = false;
|
ret = false;
|
||||||
|
|
||||||
if (audiofd > -1 && dioctl(audiofd, AUDIO_FLUSH, NULL))
|
if (audiofd > -1 && ioctl(audiofd, AUDIO_FLUSH, NULL))
|
||||||
ret = false;
|
ret = false;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -255,13 +255,13 @@ bool Output::AVSync(bool b)
|
|||||||
bool Output::ClearAudio()
|
bool Output::ClearAudio()
|
||||||
{
|
{
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
||||||
return audiofd > -1 && !dioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
|
return audiofd > -1 && !ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Output::ClearVideo()
|
bool Output::ClearVideo()
|
||||||
{
|
{
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
||||||
return videofd > -1 && !dioctl(videofd, VIDEO_CLEAR_BUFFER, NULL);
|
return videofd > -1 && !ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Output::Clear()
|
bool Output::Clear()
|
||||||
@@ -274,8 +274,8 @@ bool Output::Clear()
|
|||||||
bool Output::GetPts(int64_t &pts)
|
bool Output::GetPts(int64_t &pts)
|
||||||
{
|
{
|
||||||
pts = 0;
|
pts = 0;
|
||||||
return ((videofd > -1 && !dioctl(videofd, VIDEO_GET_PTS, (void *) &pts)) ||
|
return ((videofd > -1 && !ioctl(videofd, VIDEO_GET_PTS, (void *) &pts)) ||
|
||||||
(audiofd > -1 && !dioctl(audiofd, AUDIO_GET_PTS, (void *) &pts)));
|
(audiofd > -1 && !ioctl(audiofd, AUDIO_GET_PTS, (void *) &pts)));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Output::GetFrameCount(int64_t &framecount)
|
bool Output::GetFrameCount(int64_t &framecount)
|
||||||
|
Reference in New Issue
Block a user