int eServiceDVD::getInfo(int w) { eDebug("[eServiceDVD] getInfo: %d", w); switch (w) { case sCurrentChapter: { struct ddvd_time info; ddvd_get_last_time(m_ddvdconfig, &info); return info.pos_chapter; } case sTotalChapters: { struct ddvd_time info; ddvd_get_last_time(m_ddvdconfig, &info); return info.end_chapter; } case sCurrentTitle: { struct ddvd_time info; ddvd_get_last_time(m_ddvdconfig, &info); return info.pos_title; } case sTotalTitles: { struct ddvd_time info; ddvd_get_last_time(m_ddvdconfig, &info); return info.end_title; } case sTXTPID: // we abuse HAS_TELEXT icon in InfoBar to signalize subtitles status { int spu_id; uint16_t spu_lang; ddvd_get_last_spu(m_ddvdconfig, &spu_id, &spu_lang); return spu_id; } case sUser+6: case sUser+7: case sUser+8: return resIsPyObject; #ifdef DDVD_SUPPORTS_PICTURE_INFO case sVideoWidth: return m_width; case sVideoHeight: return m_height; case sAspect: return m_aspect; case sProgressive: return m_progressive; case sFrameRate: return m_framerate; #endif default: return resNA; } }
RESULT eServiceDVD::getPlayPosition(pts_t &pos) { struct ddvd_time info; ddvd_get_last_time(m_ddvdconfig, &info); pos = info.pos_hours * 3600; pos += info.pos_minutes * 60; pos += info.pos_seconds; // eDebug("getPlayPosition %lld", pos); pos *= 90000; return 0; }
RESULT eServiceDVD::getLength(pts_t &len) { // eDebug("eServiceDVD::getLength"); struct ddvd_time info; ddvd_get_last_time(m_ddvdconfig, &info); len = info.end_hours * 3600; len += info.end_minutes * 60; len += info.end_seconds; len *= 90000; return 0; }
void eServiceDVD::saveCuesheet() { eDebug("eServiceDVD::saveCuesheet()"); struct ddvd_resume resume_info; ddvd_get_resume_pos(m_ddvdconfig, &resume_info); if (resume_info.title) { struct ddvd_time info; ddvd_get_last_time(m_ddvdconfig, &info); pts_t pos; pos = info.pos_hours * 3600; pos += info.pos_minutes * 60; pos += info.pos_seconds; pos *= 90000; m_cue_pts = pos; eDebug("ddvd_get_resume_pos resume_info.title=%d, chapter=%d, block=%lu, audio_id=%d, audio_lock=%d, spu_id=%d, spu_lock=%d (pts=%llu)",resume_info.title,resume_info.chapter,resume_info.block,resume_info.audio_id, resume_info.audio_lock, resume_info.spu_id, resume_info.spu_lock,m_cue_pts); } else { eDebug("we're in a menu or somewhere else funny. so save cuesheet with pts=0"); m_cue_pts = 0; } FILE* f; { std::string filename = m_ref.path; filename += "/dvd.cuts"; f = fopen(filename.c_str(), "wb"); } if (f == NULL) { char filename[128]; if ( m_ddvd_titlestring[0] != '\0' ) snprintf(filename, sizeof(filename), "/home/root/dvd-%s.cuts", m_ddvd_titlestring); else { struct stat st; if (stat(m_ref.path.c_str(), &st) == 0) { // DVD has no name and cannot be written. Use the mtime to generate something unique... snprintf(filename, 128, "/home/root/dvd-%x.cuts", st.st_mtime); } else { strcpy(filename, "/home/root/dvd-untitled.cuts"); } } eDebug("eServiceDVD::saveCuesheet() filename=%s",filename); f = fopen(filename, "wb"); } if (f) { unsigned long long where; int what; #if BYTE_ORDER == BIG_ENDIAN where = m_cue_pts; #else where = bswap_64(m_cue_pts); #endif what = htonl(3); fwrite(&where, sizeof(where), 1, f); fwrite(&what, sizeof(what), 1, f); what = htonl(4); fwrite(&resume_info, sizeof(struct ddvd_resume), 1, f); fwrite(&what, sizeof(what), 1, f); fclose(f); } }
void eServiceDVD::gotMessage(int /*what*/) { switch(ddvd_get_next_message(m_ddvdconfig,1)) { case DDVD_COLORTABLE_UPDATE: { /* struct ddvd_color ctmp[4]; ddvd_get_last_colortable(ddvdconfig, ctmp); int i=0; while (i < 4) { rd1[252+i]=ctmp[i].red; bl1[252+i]=ctmp[i].blue; gn1[252+i]=ctmp[i].green; tr1[252+i]=ctmp[i].trans; i++; } if(ioctl(fb, FBIOPUTCMAP, &colormap) == -1) { printf("Framebuffer: <FBIOPUTCMAP failed>\n"); return 1; } */ eDebug("no support for 8bpp framebuffer in dvdplayer yet!"); break; } case DDVD_SCREEN_UPDATE: eDebug("DVD_SCREEN_UPDATE!"); if (m_subtitle_widget) { int x1,x2,y1,y2; ddvd_get_last_blit_area(m_ddvdconfig, &x1, &x2, &y1, &y2); int x_offset = 0, y_offset = 0, width = 720, height = 576; #ifdef DDVD_SUPPORTS_GET_BLIT_DESTINATION ddvd_get_blit_destination(m_ddvdconfig, &x_offset, &y_offset, &width, &height); eDebug("values got from ddvd: %d %d %d %d", x_offset, y_offset, width, height); y_offset = -y_offset; width -= x_offset * 2; height -= y_offset * 2; #endif eRect dest(x_offset, y_offset, width, height); if (dest.width() && dest.height()) m_subtitle_widget->setPixmap(m_pixmap, eRect(x1, y1, (x2-x1)+1, (y2-y1)+1), dest); } break; case DDVD_SHOWOSD_STATE_PLAY: { eDebug("DVD_SHOWOSD_STATE_PLAY!"); m_current_trick = 0; m_event(this, evUser+1); break; } case DDVD_SHOWOSD_STATE_PAUSE: { eDebug("DVD_SHOWOSD_STATE_PAUSE!"); m_event(this, evUser+2); break; } case DDVD_SHOWOSD_STATE_FFWD: { eDebug("DVD_SHOWOSD_STATE_FFWD!"); m_event(this, evUser+3); break; } case DDVD_SHOWOSD_STATE_FBWD: { eDebug("DVD_SHOWOSD_STATE_FBWD!"); m_event(this, evUser+4); break; } case DDVD_SHOWOSD_STRING: { eDebug("DVD_SHOWOSD_STRING!"); m_event(this, evUser+5); break; } case DDVD_SHOWOSD_AUDIO: { eDebug("DVD_SHOWOSD_STRING!"); m_event(this, evUser+6); break; } case DDVD_SHOWOSD_SUBTITLE: { eDebug("DVD_SHOWOSD_SUBTITLE!"); m_event((iPlayableService*)this, evUpdatedInfo); m_event(this, evUser+7); break; } case DDVD_EOF_REACHED: eDebug("DVD_EOF_REACHED!"); m_event(this, evEOF); break; case DDVD_SOF_REACHED: eDebug("DVD_SOF_REACHED!"); m_event(this, evSOF); break; case DDVD_SHOWOSD_ANGLE: { int current, num; ddvd_get_angle_info(m_ddvdconfig, ¤t, &num); eDebug("DVD_ANGLE_INFO: %d / %d", current, num); m_event(this, evUser+13); break; } case DDVD_SHOWOSD_TIME: { static struct ddvd_time last_info; struct ddvd_time info; // eDebug("DVD_SHOWOSD_TIME!"); ddvd_get_last_time(m_ddvdconfig, &info); if ( info.pos_chapter != last_info.pos_chapter ) m_event(this, evUser+8); // chapterUpdated if ( info.pos_title != last_info.pos_title ) m_event(this, evUser+9); // titleUpdated memcpy(&last_info, &info, sizeof(struct ddvd_time)); break; } case DDVD_SHOWOSD_TITLESTRING: { ddvd_get_title_string(m_ddvdconfig, m_ddvd_titlestring); eDebug("DDVD_SHOWOSD_TITLESTRING: %s",m_ddvd_titlestring); loadCuesheet(); if (!m_cue_pts) unpause(); m_event(this, evStart); break; } case DDVD_MENU_OPENED: eDebug("DVD_MENU_OPENED!"); m_state = stMenu; m_event(this, evSeekableStatusChanged); m_event(this, evUser+11); break; case DDVD_MENU_CLOSED: eDebug("DVD_MENU_CLOSED!"); m_state = stRunning; m_event(this, evSeekableStatusChanged); m_event(this, evUser+12); break; #ifdef DDVD_SUPPORTS_PICTURE_INFO case DDVD_SIZE_CHANGED: { int changed = m_width != -1 && m_height != -1 && m_aspect != -1; ddvd_get_last_size(m_ddvdconfig, &m_width, &m_height, &m_aspect); if (changed) m_event((iPlayableService*)this, evVideoSizeChanged); break; } case DDVD_PROGRESSIVE_CHANGED: { int changed = m_progressive != -1; ddvd_get_last_progressive(m_ddvdconfig, &m_progressive); if (changed) m_event((iPlayableService*)this, evVideoProgressiveChanged); break; } case DDVD_FRAMERATE_CHANGED: { int changed = m_framerate != -1; ddvd_get_last_framerate(m_ddvdconfig, &m_framerate); if (changed) m_event((iPlayableService*)this, evVideoFramerateChanged); break; } #endif default: break; } }