mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 12:49:40 +00:00
ext/dvdread/dvdreadsrc.c: Fix regression in DVD seeking - when a pack we expect to be a NAV block turns out not to be...
Original commit message from CVS: * ext/dvdread/dvdreadsrc.c: Fix regression in DVD seeking - when a pack we expect to be a NAV block turns out not to be, scan forwards for up to 2MB (at most ~1sec) until we find one. Fixes: #516278
This commit is contained in:
parent
76967905b3
commit
79f25f10db
2 changed files with 30 additions and 10 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2008-02-13 Jan Schmidt <jan.schmidt@sun.com>
|
||||||
|
|
||||||
|
* ext/dvdread/dvdreadsrc.c:
|
||||||
|
Fix regression in DVD seeking - when a pack we
|
||||||
|
expect to be a NAV block turns out not to be, scan forwards
|
||||||
|
for up to 2MB (at most ~1sec) until we find one.
|
||||||
|
|
||||||
|
Fixes: #516278
|
||||||
|
|
||||||
2008-02-12 Sebastien Moutte <sebastien@moutte.net>
|
2008-02-12 Sebastien Moutte <sebastien@moutte.net>
|
||||||
|
|
||||||
* win32/vs6/libgstmpegaudioparse.dsp:
|
* win32/vs6/libgstmpegaudioparse.dsp:
|
||||||
|
|
|
@ -628,7 +628,7 @@ gst_dvd_read_src_get_next_cell (GstDvdReadSrc * src, pgc_t * pgc, gint cell)
|
||||||
|
|
||||||
/* Returns true if the pack is a NAV pack */
|
/* Returns true if the pack is a NAV pack */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_dvd_read_src_is_nav_pack (const guint8 * data)
|
gst_dvd_read_src_is_nav_pack (const guint8 * data, gint lbn, dsi_t * dsi_pack)
|
||||||
{
|
{
|
||||||
if (GST_READ_UINT32_BE (data + 0x26) != 0x000001BF)
|
if (GST_READ_UINT32_BE (data + 0x26) != 0x000001BF)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -651,6 +651,11 @@ gst_dvd_read_src_is_nav_pack (const guint8 * data)
|
||||||
if (GST_READ_UINT16_BE (data + 0x404) != 0x03fa)
|
if (GST_READ_UINT16_BE (data + 0x404) != 0x03fa)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
/* Read the DSI packet into the provided struct and check it */
|
||||||
|
navRead_DSI (dsi_pack, (unsigned char *) data + DSI_START_BYTE);
|
||||||
|
if (lbn != dsi_pack->dsi_gi.nv_pck_lbn)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -723,6 +728,7 @@ gst_dvd_read_src_read (GstDvdReadSrc * src, gint angle, gint new_seek,
|
||||||
dsi_t dsi_pack;
|
dsi_t dsi_pack;
|
||||||
guint next_vobu, next_ilvu_start, cur_output_size;
|
guint next_vobu, next_ilvu_start, cur_output_size;
|
||||||
gint len;
|
gint len;
|
||||||
|
gint retries;
|
||||||
|
|
||||||
/* playback by cell in this pgc, starting at the cell for our chapter */
|
/* playback by cell in this pgc, starting at the cell for our chapter */
|
||||||
if (new_seek)
|
if (new_seek)
|
||||||
|
@ -777,20 +783,25 @@ again:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read NAV packet */
|
/* read NAV packet */
|
||||||
|
retries = 0;
|
||||||
|
nav_retry:
|
||||||
|
retries++;
|
||||||
|
|
||||||
len = DVDReadBlocks (src->dvd_title, src->cur_pack, 1, oneblock);
|
len = DVDReadBlocks (src->dvd_title, src->cur_pack, 1, oneblock);
|
||||||
if (len != 1)
|
if (len != 1)
|
||||||
goto read_error;
|
goto read_error;
|
||||||
|
|
||||||
if (!gst_dvd_read_src_is_nav_pack (oneblock)) {
|
if (!gst_dvd_read_src_is_nav_pack (oneblock, src->cur_pack, &dsi_pack)) {
|
||||||
GST_LOG_OBJECT (src, "Expected nav packet @ pack %d", src->cur_pack);
|
GST_LOG_OBJECT (src, "Skipping nav packet @ pack %d", src->cur_pack);
|
||||||
goto read_error;
|
src->cur_pack++;
|
||||||
}
|
|
||||||
|
|
||||||
/* parse the contained dsi packet */
|
if (retries < 2000) {
|
||||||
navRead_DSI (&dsi_pack, &oneblock[DSI_START_BYTE]);
|
goto nav_retry;
|
||||||
if (src->cur_pack != dsi_pack.dsi_gi.nv_pck_lbn) {
|
} else {
|
||||||
GST_ERROR ("src->cur_pack = %d, dsi_pack.dsi_gi.nv_pck_lbn = %d",
|
GST_LOG_OBJECT (src, "No nav packet @ pack %d after 2000 blocks",
|
||||||
src->cur_pack, dsi_pack.dsi_gi.nv_pck_lbn);
|
src->cur_pack);
|
||||||
|
goto read_error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* determine where we go next. These values are the ones we
|
/* determine where we go next. These values are the ones we
|
||||||
|
|
Loading…
Reference in a new issue