mirror of https://git.ffmpeg.org/ffmpeg.git
avformat/dvdvideodec: Fix duration logic with 1 chapter and validate chapter range
Chapters and duration are calculated together in dvdvideo demuxer. Previous chapter calculation logic treated extraction of 1 chapter using chapter_start and chapter_end switches incorrectly, returning the duration of the entire title instead of just the segment. Fix the logic so that it calculates and returns the duration of the chapter segment instead. Additionally, validate that chapter_end exceeds chapter_start (except in the special case of 0). Signed-off-by: Marth64 <marth64@proxyid.net>
This commit is contained in:
parent
0c1c7688ea
commit
4dc204ea3e
|
@ -865,8 +865,7 @@ static int dvdvideo_chapters_setup_simple(AVFormatContext *s)
|
||||||
int chapter_end = c->opt_chapter_end > 0 ? c->opt_chapter_end : c->play_state.pgc_nb_pg_est - 1;
|
int chapter_end = c->opt_chapter_end > 0 ? c->opt_chapter_end : c->play_state.pgc_nb_pg_est - 1;
|
||||||
|
|
||||||
/* dvdnav_describe_title_chapters() describes PGs rather than PTTs, so validate our range */
|
/* dvdnav_describe_title_chapters() describes PGs rather than PTTs, so validate our range */
|
||||||
if (chapter_start == chapter_end ||
|
if (c->play_state.pgc_nb_pg_est == 1 ||
|
||||||
c->play_state.pgc_nb_pg_est == 1 ||
|
|
||||||
chapter_start > c->play_state.pgc_nb_pg_est ||
|
chapter_start > c->play_state.pgc_nb_pg_est ||
|
||||||
chapter_end > c->play_state.pgc_nb_pg_est) {
|
chapter_end > c->play_state.pgc_nb_pg_est) {
|
||||||
|
|
||||||
|
@ -878,8 +877,11 @@ static int dvdvideo_chapters_setup_simple(AVFormatContext *s)
|
||||||
for (int i = chapter_start - 1; i < chapter_end; i++) {
|
for (int i = chapter_start - 1; i < chapter_end; i++) {
|
||||||
uint64_t time_effective = c->play_state.pgc_pg_times_est[i] - c->play_state.nav_pts;
|
uint64_t time_effective = c->play_state.pgc_pg_times_est[i] - c->play_state.nav_pts;
|
||||||
|
|
||||||
if (!avpriv_new_chapter(s, i, DVDVIDEO_TIME_BASE_Q, time_prev, time_effective, NULL))
|
if (chapter_start != chapter_end &&
|
||||||
|
!avpriv_new_chapter(s, i, DVDVIDEO_TIME_BASE_Q, time_prev, time_effective, NULL)) {
|
||||||
|
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
time_prev = time_effective;
|
time_prev = time_effective;
|
||||||
total_duration = time_effective;
|
total_duration = time_effective;
|
||||||
|
@ -1548,6 +1550,13 @@ static int dvdvideo_read_header(AVFormatContext *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c->opt_chapter_end != 0 && c->opt_chapter_start > c->opt_chapter_end) {
|
||||||
|
av_log(s, AV_LOG_ERROR, "Chapter (PTT) range [%d, %d] is invalid\n",
|
||||||
|
c->opt_chapter_start, c->opt_chapter_end);
|
||||||
|
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
if (c->opt_title == 0) {
|
if (c->opt_title == 0) {
|
||||||
av_log(s, AV_LOG_INFO, "Defaulting to title #1. "
|
av_log(s, AV_LOG_INFO, "Defaulting to title #1. "
|
||||||
"This is not always the main feature, validation suggested.\n");
|
"This is not always the main feature, validation suggested.\n");
|
||||||
|
|
Loading…
Reference in New Issue