summaryrefslogtreecommitdiffstats
path: root/stream/stream_dvdnav.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-11-16 06:54:22 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-11-16 07:01:46 +0200
commit287b62163eed8811b6cd33716c0691d328947d48 (patch)
tree3143d2cb17b32a19e3e7e0aa428210d1bba3eb0b /stream/stream_dvdnav.c
parent507f4fe6c7811558b1367e4b64855ae7f9bc8da8 (diff)
parentb411278fbb00767b8013604157a43e0203f66f4c (diff)
downloadmpv-287b62163eed8811b6cd33716c0691d328947d48.tar.bz2
mpv-287b62163eed8811b6cd33716c0691d328947d48.tar.xz
Merge svn changes up to r29912
Diffstat (limited to 'stream/stream_dvdnav.c')
-rw-r--r--stream/stream_dvdnav.c88
1 files changed, 35 insertions, 53 deletions
diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c
index 1700463787..3f419dfb65 100644
--- a/stream/stream_dvdnav.c
+++ b/stream/stream_dvdnav.c
@@ -47,10 +47,6 @@ typedef struct {
unsigned int state;
} dvdnav_priv_t;
-extern char *dvd_device;
-extern char *audio_lang, *dvdsub_lang;
-extern char *dvd_audio_stream_channels[6], *dvd_audio_stream_types[8];
-
static struct stream_priv_s {
int track;
char* device;
@@ -91,6 +87,8 @@ static dvdnav_priv_t * new_dvdnav_stream(char * filename) {
return NULL;
}
+ dvd_set_speed(priv->filename, dvd_speed);
+
if(dvdnav_open(&(priv->dvdnav),priv->filename)!=DVDNAV_STATUS_OK)
{
free(priv->filename);
@@ -295,6 +293,7 @@ static void stream_dvdnav_close(stream_t *s) {
dvdnav_priv_t *priv = s->priv;
dvdnav_close(priv->dvdnav);
priv->dvdnav = NULL;
+ dvd_set_speed(priv->filename, -1);
free(priv);
}
@@ -350,8 +349,10 @@ static int fill_buffer(stream_t *s, char *but, int len)
if(dvdnav_current_title_info(priv->dvdnav, &tit, &part) == DVDNAV_STATUS_OK) {
mp_msg(MSGT_CPLAYER,MSGL_V, "\r\nDVDNAV, NEW TITLE %d\r\n", tit);
dvdnav_get_highlight (priv, 0);
- if(priv->title > 0 && tit != priv->title)
+ if(priv->title > 0 && tit != priv->title) {
+ priv->state |= NAV_FLAG_EOF;
return 0;
+ }
}
break;
}
@@ -365,8 +366,10 @@ static int fill_buffer(stream_t *s, char *but, int len)
priv->state |= NAV_FLAG_WAIT_READ;
if(priv->title > 0 && dvd_last_chapter > 0) {
int tit=0, part=0;
- if(dvdnav_current_title_info(priv->dvdnav, &tit, &part) == DVDNAV_STATUS_OK && part > dvd_last_chapter)
+ if(dvdnav_current_title_info(priv->dvdnav, &tit, &part) == DVDNAV_STATUS_OK && part > dvd_last_chapter) {
+ priv->state |= NAV_FLAG_EOF;
return 0;
+ }
}
dvdnav_get_highlight (priv, 1);
}
@@ -517,9 +520,9 @@ static void show_audio_subs_languages(dvdnav_t *nav)
uint8_t lg;
uint16_t i, lang, format, id, channels;
int base[7] = {128, 0, 0, 0, 160, 136, 0};
- char tmp[3];
for(i=0; i<8; i++)
{
+ char tmp[] = "unknown";
lg = dvdnav_get_audio_logical_stream(nav, i);
if(lg == 0xff) continue;
channels = dvdnav_audio_stream_channels(nav, lg);
@@ -528,41 +531,37 @@ static void show_audio_subs_languages(dvdnav_t *nav)
else
channels--;
lang = dvdnav_audio_stream_to_lang(nav, lg);
- if(lang == 0xFFFF)
- tmp[0] = tmp[1] = '?';
- else
+ if(lang != 0xFFFF)
{
tmp[0] = lang >> 8;
tmp[1] = lang & 0xFF;
+ tmp[2] = 0;
}
- tmp[2] = 0;
format = dvdnav_audio_stream_format(nav, lg);
if(format == 0xFFFF || format > 6)
format = 1; //unknown
id = i + base[format];
- if (lang != 0xFFFF) {
- mp_tmsg(MSGT_OPEN,MSGL_STATUS,"audio stream: %d format: %s (%s) language: %s aid: %d.\n", i,
- dvd_audio_stream_types[format], dvd_audio_stream_channels[channels], tmp, id);
- if(lang && tmp[0])
+ mp_tmsg(MSGT_OPEN,MSGL_STATUS,"audio stream: %d format: %s (%s) language: %s aid: %d.\n", i,
+ dvd_audio_stream_types[format], dvd_audio_stream_channels[channels], tmp, id);
+ if (lang != 0xFFFF && lang && tmp[0])
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", id, tmp);
- }
}
for(i=0; i<32; i++)
{
+ char tmp[] = "unknown";
lg = dvdnav_get_spu_logical_stream(nav, i);
if(lg == 0xff) continue;
- lang = dvdnav_spu_stream_to_lang(nav, lg);
- if(lang == 0xFFFF)
- tmp[0] = tmp[1] = '?';
- else
+ lang = dvdnav_spu_stream_to_lang(nav, i);
+ if(lang != 0xFFFF)
{
tmp[0] = lang >> 8;
tmp[1] = lang & 0xFF;
+ tmp[2] = 0;
}
- tmp[2] = 0;
- if (lang != 0xFFFF)
- mp_tmsg(MSGT_OPEN,MSGL_STATUS,"subtitle ( sid ): %d language: %s\n", i+0x20, tmp);
+ mp_msg(MSGT_OPEN,MSGL_STATUS,"subtitle ( sid ): %d language: %s\n", lg, tmp);
+ if (lang != 0xFFFF && lang && tmp[0])
+ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", lg, tmp);
}
}
@@ -698,11 +697,11 @@ static int mp_dvdnav_get_aid_from_format (stream_t *stream, int index, uint8_t l
format = dvdnav_audio_stream_format(priv->dvdnav, lg);
switch(format) {
case DVDNAV_FORMAT_AC3:
- return (index + 128);
+ return index + 128;
case DVDNAV_FORMAT_DTS:
- return (index + 136);
+ return index + 136;
case DVDNAV_FORMAT_LPCM:
- return (index + 160);
+ return index + 160;
case DVDNAV_FORMAT_MPEGAUDIO:
return index;
default:
@@ -713,27 +712,6 @@ static int mp_dvdnav_get_aid_from_format (stream_t *stream, int index, uint8_t l
}
/**
- * \brief mp_dvdnav_aid_from_audio_num() returns the audio id corresponding to the logical number
- * \param stream: - stream pointer
- * \param audio_num: - logical number
- * \return -1 on error, current subtitle id if successful
- */
-int mp_dvdnav_aid_from_audio_num(stream_t *stream, int audio_num) {
- dvdnav_priv_t * priv = stream->priv;
- int k;
- uint8_t lg;
-
- for(k=0; k<32; k++) {
- lg = dvdnav_get_audio_logical_stream(priv->dvdnav, k);
- if (lg == 0xff) continue;
- if (lg != audio_num) continue;
-
- return mp_dvdnav_get_aid_from_format (stream, k, lg);
- }
- return -1;
-}
-
-/**
* \brief mp_dvdnav_aid_from_lang() returns the audio id corresponding to the language code 'lang'
* \param stream: - stream pointer
* \param lang: 2-characters language code[s], eventually separated by spaces of commas
@@ -801,9 +779,9 @@ int mp_dvdnav_sid_from_lang(stream_t *stream, unsigned char *language) {
for(k=0; k<32; k++) {
lg = dvdnav_get_spu_logical_stream(priv->dvdnav, k);
if(lg == 0xff) continue;
- lang = dvdnav_spu_stream_to_lang(priv->dvdnav, lg);
+ lang = dvdnav_spu_stream_to_lang(priv->dvdnav, k);
if(lang != 0xFFFF && lang == lcode) {
- return k;
+ return lg;
}
}
language += 2;
@@ -820,12 +798,16 @@ int mp_dvdnav_sid_from_lang(stream_t *stream, unsigned char *language) {
* \return 0 on error, 1 if successful
*/
int mp_dvdnav_lang_from_sid(stream_t *stream, int sid, unsigned char *buf) {
- uint8_t lg;
+ uint8_t k;
uint16_t lang;
dvdnav_priv_t *priv = stream->priv;
if(sid < 0) return 0;
- lg = dvdnav_get_spu_logical_stream(priv->dvdnav, sid);
- lang = dvdnav_spu_stream_to_lang(priv->dvdnav, lg);
+ for (k=0; k<32; k++)
+ if (dvdnav_get_spu_logical_stream(priv->dvdnav, k) == sid)
+ break;
+ if (k == 32)
+ return 0;
+ lang = dvdnav_spu_stream_to_lang(priv->dvdnav, k);
if(lang == 0xffff) return 0;
buf[0] = lang >> 8;
buf[1] = lang & 0xFF;
@@ -846,7 +828,7 @@ int mp_dvdnav_number_of_subs(stream_t *stream) {
for(k=0; k<32; k++) {
lg = dvdnav_get_spu_logical_stream(priv->dvdnav, k);
if(lg == 0xff) continue;
- n++;
+ if(lg >= n) n = lg + 1;
}
return n;
}