1
0
Fork 0
forked from len0rd/rockbox

FS#7931 - mpegplayer - resume on idle off - play files without start time of zero

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15079 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Robert Kukla 2007-10-11 22:38:16 +00:00
parent 9875700627
commit 83ec896586

View file

@ -380,9 +380,12 @@ static int video_thumb_print IBSS_ATTR; /* If 1, the video thread is
only decoding one frame for only decoding one frame for
use in the menu. If 0, use in the menu. If 0,
normal operation */ normal operation */
static int play_time IBSS_ATTR; /* The movie time as represented by static int end_pts_time IBSS_ATTR; /* The movie end time as represented by
the maximum audio PTS tag in the the maximum audio PTS tag in the
stream converted to half minutes */ stream converted to half minutes */
static int start_pts_time IBSS_ATTR; /* The movie start time as represented by
the first audio PTS tag in the
stream converted to half minutes */
char *filename; /* hack for resume time storage */ char *filename; /* hack for resume time storage */
@ -1116,7 +1119,8 @@ static int button_loop(void)
rb->lcd_setfont(FONT_SYSFIXED); rb->lcd_setfont(FONT_SYSFIXED);
if (result) { if (result) {
settings.resume_time = (int)(get_stream_time()/44100/30); settings.resume_time = (int)(get_stream_time()/44100/
30-start_pts_time);
str_send_msg(&video_str, STREAM_QUIT, 0); str_send_msg(&video_str, STREAM_QUIT, 0);
audio_str.status = STREAM_STOPPED; audio_str.status = STREAM_STOPPED;
} else { } else {
@ -1127,12 +1131,16 @@ static int button_loop(void)
break; break;
case MPEG_STOP: case MPEG_STOP:
settings.resume_time = (int)(get_stream_time()/44100/30); settings.resume_time = (int)(get_stream_time()/44100/
30-start_pts_time);
str_send_msg(&video_str, STREAM_QUIT, 0); str_send_msg(&video_str, STREAM_QUIT, 0);
audio_str.status = STREAM_STOPPED; audio_str.status = STREAM_STOPPED;
break; break;
case MPEG_PAUSE: case MPEG_PAUSE:
settings.resume_time = (int)(get_stream_time()/44100/
30-start_pts_time);
save_settings();
str_send_msg(&video_str, STREAM_PAUSE, 0); str_send_msg(&video_str, STREAM_PAUSE, 0);
audio_str.status = STREAM_PAUSED; audio_str.status = STREAM_PAUSED;
pcm_playback_play_pause(false); pcm_playback_play_pause(false);
@ -1937,13 +1945,59 @@ void display_thumb(int in_file)
rb->splash(0, "frame not available"); rb->splash(0, "frame not available");
} }
int find_length( int in_file ) int find_start_pts( int in_file )
{ {
uint8_t *p; uint8_t *p;
size_t read_length = 60*1024; size_t read_length = 60*1024;
size_t disk_buf_len; size_t disk_buf_len;
play_time = 0; start_pts_time = 0;
/* temporary read buffer size cannot exceed buffer size */
if ( read_length > disk_buf_size )
read_length = disk_buf_size;
/* read tail of file */
rb->lseek( in_file, 0, SEEK_SET );
disk_buf_len = rb->read( in_file, disk_buf_start, read_length );
disk_buf_tail = disk_buf_start + disk_buf_len;
/* sync reader to this segment of the stream */
p=disk_buf_start;
if (sync_data_stream(&p))
{
DEBUGF("Could not sync stream\n");
return PLUGIN_ERROR;
}
/* find first PTS in audio stream. if the PTS can not be determined,
set start_pts_time to 0 */
audio_sync_start = 0;
audio_sync_time = 0;
video_sync_start = 0;
{
Stream tmp;
initialize_stream(&tmp,p,disk_buf_len-(disk_buf_start-p),0xc0);
int count=0;
do
{
count++;
get_next_data(&tmp, 2);
}
while (tmp.tagged != 1 && count < 30);
if (tmp.tagged == 1)
start_pts_time = (int)((tmp.curr_pts/45000)/30);
}
return 0;
}
int find_end_pts( int in_file )
{
uint8_t *p;
size_t read_length = 60*1024;
size_t disk_buf_len;
end_pts_time = 0;
/* temporary read buffer size cannot exceed buffer size */ /* temporary read buffer size cannot exceed buffer size */
if ( read_length > disk_buf_size ) if ( read_length > disk_buf_size )
@ -1963,7 +2017,7 @@ int find_length( int in_file )
} }
/* find last PTS in audio stream; will movie always have audio? if /* find last PTS in audio stream; will movie always have audio? if
the play time can not be determined, set play_time to 0 */ the play time can not be determined, set end_pts_time to 0 */
audio_sync_start = 0; audio_sync_start = 0;
audio_sync_time = 0; audio_sync_time = 0;
video_sync_start = 0; video_sync_start = 0;
@ -1976,7 +2030,7 @@ int find_length( int in_file )
get_next_data(&tmp, 2); get_next_data(&tmp, 2);
if (tmp.tagged == 1) if (tmp.tagged == 1)
/* 10 sec less to insure the video frame exist */ /* 10 sec less to insure the video frame exist */
play_time = (int)((tmp.curr_pts/45000-10)/30); end_pts_time = (int)((tmp.curr_pts/45000-10)/30);
} }
while (tmp.curr_packet_end != NULL); while (tmp.curr_packet_end != NULL);
} }
@ -2003,8 +2057,10 @@ ssize_t seek_PTS( int in_file, int start_time, int accept_button )
} }
else if ( start_time != 0 ) else if ( start_time != 0 )
{ {
seek_pos = rb->filesize(in_file)*start_time/play_time; seek_pos = rb->filesize(in_file)*start_time/
int seek_pos_sec_inc = rb->filesize(in_file)/play_time/30; (end_pts_time-start_pts_time);
int seek_pos_sec_inc = rb->filesize(in_file)/
(end_pts_time-start_pts_time)/30;
if (seek_pos<0) if (seek_pos<0)
seek_pos=0; seek_pos=0;
@ -2058,9 +2114,11 @@ ssize_t seek_PTS( int in_file, int start_time, int accept_button )
} }
/* are we after start_time in the stream? */ /* are we after start_time in the stream? */
if ( coarse_seek && (int)(tmp.curr_pts/45000) >= start_time*30 ) if ( coarse_seek && (int)(tmp.curr_pts/45000) >=
(start_time+start_pts_time)*30 )
{ {
int time_to_backup = (int)(tmp.curr_pts/45000) - start_time*30; int time_to_backup = (int)(tmp.curr_pts/45000) -
(start_time+start_pts_time)*30;
if (time_to_backup == 0) if (time_to_backup == 0)
time_to_backup++; time_to_backup++;
seek_pos -= seek_pos_sec_inc * time_to_backup; seek_pos -= seek_pos_sec_inc * time_to_backup;
@ -2085,9 +2143,11 @@ ssize_t seek_PTS( int in_file, int start_time, int accept_button )
} }
/* are we well before start_time in the stream? */ /* are we well before start_time in the stream? */
if ( coarse_seek && start_time*30 - (int)(tmp.curr_pts/45000) > 2 ) if ( coarse_seek && (start_time+start_pts_time)*30 -
(int)(tmp.curr_pts/45000) > 2 )
{ {
int time_to_advance = start_time*30 - (int)(tmp.curr_pts/45000) - 2; int time_to_advance = (start_time+start_pts_time)*30 -
(int)(tmp.curr_pts/45000) - 2;
if (time_to_advance <= 0) if (time_to_advance <= 0)
time_to_advance = 1; time_to_advance = 1;
seek_pos += seek_pos_sec_inc * time_to_advance; seek_pos += seek_pos_sec_inc * time_to_advance;
@ -2113,14 +2173,16 @@ ssize_t seek_PTS( int in_file, int start_time, int accept_button )
coarse_seek = 0; coarse_seek = 0;
/* are we at start_time in the stream? */ /* are we at start_time in the stream? */
if ( (int)(tmp.curr_pts/45000) >= start_time*30 ) if ( (int)(tmp.curr_pts/45000) >= (start_time+start_pts_time)*
30 )
cont_seek_loop = 0; cont_seek_loop = 0;
} }
while ( cont_seek_loop ); while ( cont_seek_loop );
DEBUGF("start diff: %u %u\n",(unsigned int)(tmp.curr_pts/45000),start_time*30); DEBUGF("start diff: %u %u\n",(unsigned int)(tmp.curr_pts/45000),
(start_time+start_pts_time)*30);
seek_pos+=tmp.curr_packet_end-disk_buf_start; seek_pos+=tmp.curr_packet_end-disk_buf_start;
last_seek_pos = seek_pos; last_seek_pos = seek_pos;
@ -2257,18 +2319,19 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
disk_buf_end = disk_buf_start + disk_buf_size-MPEG_GUARDBUF_SIZE; disk_buf_end = disk_buf_start + disk_buf_size-MPEG_GUARDBUF_SIZE;
/* initalize play_time with the length (in half minutes) of the movie /* initalize start_pts_time and end_pts_time with the length (in half
zero if the time could not be determined */ minutes) of the movie. zero if the time could not be determined */
find_length( in_file ); find_start_pts( in_file );
find_end_pts( in_file );
/* start menu */ /* start menu */
start_time = mpeg_start_menu(play_time, in_file); start_time = mpeg_start_menu(end_pts_time-start_pts_time, in_file);
if ( start_time == -1 ) if ( start_time == -1 )
return 0; return 0;
else if ( start_time < 0 ) else if ( start_time < 0 )
start_time = 0; start_time = 0;
else if ( start_time > play_time ) else if ( start_time > (end_pts_time-start_pts_time) )
start_time = play_time; start_time = (end_pts_time-start_pts_time);
rb->splash(0, "loading ..."); rb->splash(0, "loading ...");