diff options
Diffstat (limited to 'menu-vdrrip.c')
-rwxr-xr-x | menu-vdrrip.c | 1275 |
1 files changed, 1275 insertions, 0 deletions
diff --git a/menu-vdrrip.c b/menu-vdrrip.c new file mode 100755 index 0000000..356ddba --- /dev/null +++ b/menu-vdrrip.c @@ -0,0 +1,1275 @@ +// +// menu-vdrrip.c +// + +#include <vdr/plugin.h> +#include <vdr/videodir.h> + +#ifdef VDRRIP_DVD + #include <dvdnav/ifo_read.h> +#endif //VDRRIP_DVD + +#include "menu-vdrrip.h" +#include "movie.h" +#include "a-tools.h" +#include "templates.h" +#include "queue.h" +#include "vdrriprecordings.h" + +#define MINQUANT 2 +#define MAXQUANT 15 + +#define NUMSCALETYPES 4 +#define NUMPPDEINT 6 + +static const char *ScaleTypes[] = { "off", "auto", "dvb", "manual" }; +static const char *DVBScaleWidths[] = { "352", "480", "544", "688", "704", "720" }; +static const char *DVBScaleHeights[] = { "288", "576" }; +static const char *CropModes[] = { "crop width & height", "crop only height"}; +static const char *PPDeint[] = { "off", "fd", "lb", "li", "ci", "md", }; + +// --- cMenuVdrrip --------------------------------------------------------- + +cMenuVdrrip::cMenuVdrrip():cOsdMenu("Vdrrip") {Set();} + +void cMenuVdrrip::Set() { + Clear(); + + Add(new cOsdItem(tr("encode vdr-recording"), osUser1)); + +#ifdef VDRRIP_DVD + Add(new cOsdItem(tr("encode dvd"), osUser2)); +#endif //VDRRIP_DVD + + Add(new cOsdItem(tr("edit encoding queue"), osUser3)); + Add(new cOsdItem(tr("edit templates"), osUser4)); +} + +eOSState cMenuVdrrip::ProcessKey(eKeys Key) { + + eOSState state = cOsdMenu::ProcessKey(Key); + + switch (state) { + case osUser1: { + AddSubMenu(new cMenuVdrripEncode); + break; + } + +#ifdef VDRRIP_DVD + case osUser2: { + const char *s = "Most DVDs are encrypted with CSS (Contents " + "Scrambling System). Copying of encrypted DVDs is illegal in " + "many countries. This program is not meant for those who intend " + "on breaking copyright laws. Every illegal use of this software " + "is strictly prohibited. In no way I will be held responsible " + "if you do. " + "Be aware to check your countries law !"; + + AddSubMenu(new cMenuVdrripWarning("Warning", s)); + break; + } +#endif + + case osUser3: { + AddSubMenu(new cMenuVdrripQueue); + break; + } + + case osUser4: { + AddSubMenu(new cMenuVdrripTemplates); + break; + } + + default: break; + } + + return state; +} + + +// --- cMenuVdrripWarning ---------------------------------------------------------- + +# ifdef VDRRIP_DVD + +cMenuVdrripWarning::cMenuVdrripWarning(const char *Title, const char *Text) +:cOsdMenu(Title) +{ + bool warning; + warning = true; + //warning = false; + + if (warning) { + Add(new cMenuTextItem(Text, 1, 2, Setup.OSDwidth - 2, MAXOSDITEMS, clrWhite, clrBackground, fontOsd)); + SetHelp(tr("back"), tr("accept"), NULL, NULL); + hadsubmenu = false; + } else { + if (CheckDVD()) AddSubMenu(new cMenuVdrripMovie("dvd://", "")); + hadsubmenu = true; + } +} + +eOSState cMenuVdrripWarning::ProcessKey(eKeys Key) +{ + eOSState state = cOsdMenu::ProcessKey(Key); + + if (HasSubMenu()) { + hadsubmenu = true; + return osContinue; + } + + if (hadsubmenu) {return osBack;} + + switch (Key) { + case kRed: return osBack; + + case kGreen: { + if (CheckDVD()) AddSubMenu(new cMenuVdrripMovie("dvd://", "")); + break; + } + + default: break; + } + + return state; +} + +bool cMenuVdrripWarning::CheckDVD() { + dvd_reader_t *dvd = NULL; + ifo_handle_t *ifo_zero = NULL; + ifo_handle_t *ifo_tmp = NULL; + + Interface->Status(tr("checking dvd...")); + Interface->Flush(); + + if (access(DVD, R_OK) == -1) { + char *s = NULL; + asprintf(&s, "No read privileges on %s !", DVD); + Interface->Error(s); + FREE(s); + return false; + } + + dvd = DVDOpen(DVD); + + if (dvd) { + ifo_zero = ifoOpen(dvd, 0); + if (ifo_zero) { + for (int i = 1; i < ifo_zero->vts_atrt->nr_of_vtss; i++) { + ifo_tmp = ifoOpen(dvd, i); + if (ifo_tmp) ifoClose(ifo_tmp); + else { + char *s = NULL; + asprintf(&s, "Can't open ifo %d !", i); + Interface->Error(s); + FREE(s); + DVDClose(dvd); + return false; + } + } + ifoClose(ifo_zero); + DVDClose(dvd); + return true; + } else { + DVDClose(dvd); + Interface->Error("Can't open main ifo from dvd !"); + return false; + } + } + + char *s = NULL; + asprintf(&s, "Can 't open %s !", DVD); + Interface->Error(s); + FREE(s); + return false; +} + +#endif //VDRRIP_DVD + +// --- cMenuVdrripEncode ---------------------------------------------------- + +cMenuVdrripEncode::cMenuVdrripEncode():cOsdMenu(tr("encode vdr-recording")) { + R = NULL; + + Interface->Status(tr("scanning recordings...")); + Interface->Flush(); + + R = new cVdrripRecordings; + Set(); +} + +cMenuVdrripEncode::~cMenuVdrripEncode() { + DELETE(R); +} + +void cMenuVdrripEncode::Set() { + char *s = NULL; + int i; + + for (i = 0; i < R->getNumRec(); i++) { + asprintf(&s, "%s %s", R->getDate(i), R->getName(i)); + Add(new cOsdItem(s)); + FREE(s); + } +} + +eOSState cMenuVdrripEncode::ProcessKey(eKeys Key) { + + eOSState state = cOsdMenu::ProcessKey(Key); + + if (HasSubMenu()) return osContinue; + + if (Key == kOk) AddSubMenu(new cMenuVdrripMovie(R->getPath(Current()), R->getName(Current()))); + + return state; +} + + +// --- cMenuVdrripQueue ---------------------------------------------------- + +cMenuVdrripQueue::cMenuVdrripQueue():cOsdMenu(tr("edit encoding queue")) { + Q = NULL; + Q = new cQueue; + NumMovie = 0; + Set(); +} + +cMenuVdrripQueue::~cMenuVdrripQueue() { + DELETE(Q); +} + +void cMenuVdrripQueue::Set() { + char *s = NULL, *s1 = NULL; + int c; + struct QueueData *q; + + for (c = 0; c < Q->getNumMovies(); c++) { + q = Q->getData(c); + + asprintf(&s, "%s%s - %s:", (strstr(q->Dir, "dvd://")) ? "DVD": "VDR", (q->Preview == 1) ? " (preview)": "", q->Name); + asprintf(&s1, "- %s, %ix%i MB, %s:%i kbit/s, %s:%i kbit/s", q->Container, q->FileNumbers, q->FileSize, q->VCodec, q->BitrateVideo, q->ACodec, q->BitrateAudio); + if (c == 0 && Q->IsEncoding()) { + AddColItem(new cOsdItem(s)); + AddColItem(new cOsdItem(s1)); + AddColItem(new cOsdItem(Q->getQueueStat())); + } else { + Add(new cOsdItem(s)); + Add(new cOsdItem(s1)); + } + FREE(s); + FREE(s1); + } + + if (Q->getLockStat()) {Interface->Error(tr("the queuefile is locked by the queuehandler !"));} + + SetHelpKeys(); +} + +eOSState cMenuVdrripQueue::ProcessKey(eKeys Key) { + + eOSState state = cOsdMenu::ProcessKey(Key); + + if (HasSubMenu()) return osContinue; + + if (Q->IsEncoding()) { + NumMovie = (Current() - 1) / 2; + if (NumMovie < 0) NumMovie = 0; + } else NumMovie = Current() / 2; + + SetHelpKeys(); + + switch (Key) { + + case kRed: { + if (Delete) { + char *buf = NULL; + asprintf(&buf, tr("delete movie %s from queue ?"), Q->getShortname(NumMovie)); + if (Interface->Confirm(buf)) { + Q->Del(NumMovie); + RefreshOSD(); + } + FREE(buf); + } + break; + } + + case kGreen: { + if (Up) { + Q->Up(NumMovie); + RefreshOSD(); + } + break; + } + + case kYellow: { + if (Down) { + Q->Down(NumMovie); + RefreshOSD(); + } + break; + } + + case kBlue: { + if (Switch) { + Q->Switch(NumMovie); + RefreshOSD(); + } + break; + } + + default: break; + } + + return state; +} + +void cMenuVdrripQueue::RefreshOSD() { + int i = Current(); + Clear(); + Set(); + SetCurrent(Get(i)); + SetHelpKeys(); + Display(); +} + +void cMenuVdrripQueue::SetHelpKeys() { + if (Q->getLockStat() || Q->getNumMovies() == 0 || (NumMovie == 0 && Q->IsEncoding())) { + Delete = Up = Down = Switch = false; + } else { + Delete = true; + Switch = true; + + // up-Key: + if (NumMovie >= 1 && NumMovie < Q->getNumMovies()) { + (NumMovie == 1 && Q->IsEncoding()) ? Up = false : Up = true; + } else {Up = false;} + + // down-key + if (NumMovie >= 0 && NumMovie < Q->getNumMovies() - 1) { + (NumMovie == 0 && Q->IsEncoding()) ? Down = false : Down = true; + } else {Down = false;} + } + + SetHelp(Delete ? tr("delete") : NULL, Up ? tr("up") : NULL, Down ? tr("down") : NULL, Switch ? tr("switch mode") : NULL); +} + +void cMenuVdrripQueue::AddColItem(cOsdItem *i) { +#ifdef clrScrolLine + i->SetColor(clrScrolLine, clrBackground); +#else + i->SetColor(clrCyan, clrBackground); +#endif + + Add(i); +} + +// --- cMenuVdrripTemplates ------------------------------------------------- + +cMenuVdrripTemplates::cMenuVdrripTemplates():cOsdMenu(tr("edit templates")) { + + T = new cTemplate(); + + Set(); + SetHelp(tr("edit"), tr("new"), tr("delete"), NULL); +} + +cMenuVdrripTemplates::~cMenuVdrripTemplates() { + DELETE(T); +} + +void cMenuVdrripTemplates::Set() { + for (int i = 0; i < T->getNumTemplates(); i++) { + Add(new cOsdItem(T->getName(i))); + } + + hadsubmenu = false; +} + +eOSState cMenuVdrripTemplates::ProcessKey(eKeys Key) { + + eOSState state = cOsdMenu::ProcessKey(Key); + + if (HasSubMenu()) { + hadsubmenu = true; + return osContinue; + } + + if (hadsubmenu) {RefreshOSD();} + + switch (Key) { + case kOk: { + AddSubMenu(new cMenuVdrripEditTemplate(T, Current())); + break; + } + + case kRed: { + AddSubMenu(new cMenuVdrripEditTemplate(T, Current())); + break; + } + + case kGreen: { + AddSubMenu(new cMenuVdrripEditTemplate(T, T->New("new"))); + break; + } + + case kYellow: { + char *buf; + asprintf(&buf, tr("delete template %s ?"), T->getShortname(Current())); + if (Interface->Confirm(buf)) {T->Del(Current());} + FREE(buf); + RefreshOSD(); + break; + } + + default: break; + } + + return state; +} + +void cMenuVdrripTemplates::RefreshOSD() { + int i = Current(); + Clear(); + Set(); + SetCurrent(Get(i)); + Display(); +} + + + +// --- cMenuVdrripEditTemplate ----------------------------------------------- + +cMenuVdrripEditTemplate::cMenuVdrripEditTemplate(cTemplate *t, int i):cOsdMenu(tr("edit template"), 15) { + T = t; + NumTemplate = i; + TempOSDsaveName = NULL; + OSDupdate = true; + + SetHelp(tr("ABC/abc"), tr("Overwrite"), tr("Delete"), NULL); + Set(); +} + +cMenuVdrripEditTemplate::~cMenuVdrripEditTemplate() { + FREE(TempOSDsaveName); +} + +void cMenuVdrripEditTemplate::Set() { + + // get data + TempOSD.Name = T->getName(NumTemplate); + TempOSD.FileSize = T->getFileSize(NumTemplate); + TempOSD.FileNumbers = T->getFileNumbers(NumTemplate); + TempOSD.BitrateAudio = T->getBitrateAudio(NumTemplate); + TempOSD.BitrateVideo = T->getBitrateVideo(NumTemplate); + TempOSD.Container = T->getContainer(NumTemplate); + TempOSD.VCodec = T->getVCodec(NumTemplate); + TempOSD.ACodec = T->getACodec(NumTemplate); + TempOSD.ScaleType = T->getScaleType(NumTemplate); + TempOSD.Bpp = T->getBpp(NumTemplate); + + // save data + FREE(TempOSDsaveName); + TempOSDsaveName = strdup(TempOSD.Name); + TempOSDsave = TempOSD; + + // rebuild osd + int i = Current(); + Clear(); + OSDCreate(); + SetCurrent(Get(i)); + Display(); +} + +void cMenuVdrripEditTemplate::OSDCreate() { + + Add(new cMenuEditStrItem(tr("Name"), TempOSD.Name, 32, FileNameChars)); + Add(new cMenuEditIntItem(tr("FileSize"), &TempOSD.FileSize, -1, 9999)); + Add(new cMenuEditIntItem(tr("FileNumbers"), &TempOSD.FileNumbers, 1, 99)); + Add(new cMenuEditIntItem(tr("BitrateVideo"), &TempOSD.BitrateVideo, -1, 99999)); + if (strcmp(T->C->getACodec(TempOSD.ACodec), "copy") == 0 ) { + AddColItem(new cMenuEditIntItem(tr("BitrateAudio"), &TempOSD.BitrateAudio, TempOSD.BitrateAudio, TempOSD.BitrateAudio)); + } else { + Add(new cMenuEditIntItem(tr("BitrateAudio"), &TempOSD.BitrateAudio, 1, 9999)); + } + Add(new cMenuEditStraItem(tr("Container"), &TempOSD.Container, + T->C->getNumContainers(), T->C->getContainers())); + Add(new cMenuEditStraItem(tr("Video-Codec"), &TempOSD.VCodec, + T->C->getNumVCodecs(), T->C->getVCodecs())); + Add(new cMenuEditStraItem(tr("Audio-Codec"), &TempOSD.ACodec, + T->C->getNumACodecs(), T->C->getACodecs())); + Add(new cMenuEditIntItem(tr("Bpp-Value (*100)"), &TempOSD.Bpp, 1, 99)); + Add(new cMenuEditStraItem(tr("ScaleType"), &TempOSD.ScaleType, + NUMSCALETYPES, ScaleTypes)); +} + +void cMenuVdrripEditTemplate::OSDChange() { + + if (TempOSD.FileSize != TempOSDsave.FileSize || TempOSD.FileNumbers != TempOSDsave.FileNumbers) { + T->setFileSize(NumTemplate, TempOSD.FileSize, TempOSD.FileNumbers); + T->Save(); + Set(); + + } else if (TempOSD.BitrateVideo != TempOSDsave.BitrateVideo || TempOSD.BitrateAudio != TempOSDsave.BitrateAudio) { + T->setBitrate(NumTemplate, TempOSD.BitrateVideo, TempOSD.BitrateAudio); + T->Save(); + Set(); + + } else if (TempOSD.VCodec != TempOSDsave.VCodec) { + T->setCodecs(NumTemplate, TempOSD.VCodec, TempOSD.ACodec); + T->Save(); + Set(); + + } else if (TempOSD.ACodec != TempOSDsave.ACodec) { + if (strcmp(T->C->getContainer(TempOSD.Container), "avi") == 0 && + strcmp(T->C->getACodec(TempOSD.ACodec), "ogg-vorbis") == 0) { + // avi couldn't contain ogg-vorbis audio + T->setCodecs(NumTemplate, TempOSD.VCodec, TempOSDsave.ACodec); + } else { + T->setCodecs(NumTemplate, TempOSD.VCodec, TempOSD.ACodec); + } + T->Save(); + Set(); + + } else if (TempOSD.Container != TempOSDsave.Container) { + if (strcmp(T->C->getContainer(TempOSD.Container), "avi") == 0 && + strcmp(T->C->getACodec(TempOSD.ACodec), "ogg-vorbis") == 0) { + // avi couldn't contain ogg-vorbis audio + T->setContainer(NumTemplate, TempOSDsave.Container); + } else { + T->setContainer(NumTemplate, TempOSD.Container); + } + T->Save(); + Set(); + + } else if (TempOSD.ScaleType != TempOSDsave.ScaleType) { + T->setScaleType(NumTemplate, TempOSD.ScaleType); + T->Save(); + Set(); + + } else if (TempOSD.Bpp != TempOSDsave.Bpp) { + T->setBpp(NumTemplate, TempOSD.Bpp); + T->Save(); + Set(); + + } else if (strcmp(TempOSD.Name, TempOSDsaveName) != 0) { + T->setName(NumTemplate, TempOSD.Name); + T->Save(); + } +} + +eOSState cMenuVdrripEditTemplate::ProcessKey(eKeys Key) { + + eOSState state = cOsdMenu::ProcessKey(Key); + + if (Current() == 0) { + SetHelp(tr("ABC/abc"), tr("Overwrite"), tr("Delete"), NULL); + } else { + SetHelp(NULL, NULL, NULL, NULL); + + switch (Key) { + case k0 ... k9: { + OSDupdate = false; + break; + } + + default: { + OSDupdate = true; + break; + } + } + } + + if (OSDupdate) {OSDChange();} + + return state; +} + +void cMenuVdrripEditTemplate::AddColItem(cOsdItem *i) { +#ifdef clrScrolLine + i->SetColor(clrScrolLine, clrBackground); +#else + i->SetColor(clrCyan, clrBackground); +#endif + + Add(i); +} + +// --- cMenuVdrripMovie ------------------------------------------------------ + +cMenuVdrripMovie::cMenuVdrripMovie(char *p, char *n):cOsdMenu(tr("encode movie"), 15) { + M = NULL; + MovOSDsaveName = NULL; + FileSize[0] = MovieData[0] = CropData[0] = ScaleData[0] = NULL; + + Interface->Status(tr("reading movie-data...")); + Interface->Flush(); + + M = new cMovie(p, n); + Init(); + Set(); +} + +cMenuVdrripMovie::~cMenuVdrripMovie() { + DELETE(M); + + FREE(MovOSDsaveName); + FREE(FileSize[0]); + FREE(MovieData[0]); + FREE(CropData[0]); + FREE(ScaleData[0]); +} + +void cMenuVdrripMovie::Init() { + + OSDupdate = true; + Expert = false; + Crop = false; + CropReset = false; + + + // set DVBScaleWidth & DVBScaleHeight + MovOSD.DVBScaleWidth = 0; + MovOSD.DVBScaleHeight = 0; + + if (M->getScaleType() == 2) { + for (int i = 0; i < 6; i++) { + if (atoi(DVBScaleWidths[i]) == M->getScaleWidth()) { + MovOSD.DVBScaleWidth = i; + } + } + + for (int i = 0; i < 2; i++) { + if (atoi(DVBScaleHeights[i]) == M->getScaleHeight()) { + MovOSD.DVBScaleHeight = i; + } + } + } + + CropWidthsave = -1; + CropHeightsave = -1; + + MovOSD.PPDeinterlace = 0; + MovOSD.PPDeblock = 0; + + NumStatic = 0; +} + +void cMenuVdrripMovie::Set() { + + //get movie data + MovOSD.Name = M->getName(); + MovOSD.Template = M->getNumTemplate(); +#ifdef VDRRIP_DVD + if (M->isDVD()) MovOSD.Title = M->getDVDTitle(); +#endif //VDRRIP_DVD + MovOSD.FileSize = M->getFileSize(); + MovOSD.FileNumbers = M->getFileNumbers(); + MovOSD.BitrateAudio = M->getBitrateAudio(); + MovOSD.BitrateVideo = M->getBitrateVideo(); + MovOSD.Container = M->getContainer(); + MovOSD.VCodec = M->getVCodec(); + MovOSD.ACodec = M->getACodec(); + MovOSD.AudioID = M->getAudioID(); + MovOSD.ScaleType = M->getScaleType(); + MovOSD.ScaleWidth = M->getScaleWidth(); + MovOSD.ScaleHeight = M->getScaleHeight(); + + MovOSD.CropWidth = M->getCropWidth(); + MovOSD.CropHeight = M->getCropHeight(); + if (M->getPPValues()) { + if (strstr(M->getPPValues(), "fd")) MovOSD.PPDeinterlace = 1; + else if (strstr(M->getPPValues(), "lb")) MovOSD.PPDeinterlace = 2; + else if (strstr(M->getPPValues(), "li")) MovOSD.PPDeinterlace = 3; + else if (strstr(M->getPPValues(), "ci")) MovOSD.PPDeinterlace = 4; + else if (strstr(M->getPPValues(), "md")) MovOSD.PPDeinterlace = 5; + else MovOSD.PPDeinterlace = 0; + + if (strstr(M->getPPValues(), "hb/vb/dr/al")) MovOSD.PPDeblock = 1; + else MovOSD.PPDeblock = 0; + } else { + MovOSD.PPDeinterlace = 0; + MovOSD.PPDeblock = 0; + } + MovOSD.Bpp = (int)M->getBpp(); + + // save data + FREE(MovOSDsaveName); + MovOSDsaveName = strdup(MovOSD.Name); + MovOSDsave = MovOSD; + + // rebuild osd + int current = Current(); + Clear(); + OSDCreate(); + SetCurrent(Get(current)); + Display(); + + SetHelpKeys(); +} + + +void cMenuVdrripMovie::SetHelpKeys() { + if (Current() == 0) { + SetHelp(tr("ABC/abc"), tr("Overwrite"), tr("Delete"), NULL); + } else { + MovOSD.ScaleType == 1 | MovOSD.ScaleType == 3 ? Crop = true : Crop = false; + MovOSD.CropWidth == -1 && MovOSD.CropHeight == -1 ? CropReset = false : + CropReset = true; + + SetHelp(tr("add to queue"), + Crop ? tr(CropReset ? "reset boarders" : "crop boarders" ) : NULL, + tr(Expert ? "expert modus(off)" : "expert modus(on)"), + NULL); + } +} + + + + +void cMenuVdrripMovie::OSDCreate() { + char *s = NULL, *l = NULL; + cOsdItem *i; + + Add(new cMenuEditStrItem(tr("Name"), MovOSD.Name, 32, FileNameChars)); + + // Templates: + i = new cMenuEditStraItem(tr("Template"), &MovOSD.Template, M->T->getNumTemplates(), M->T->getTNames()); + (M->T->getNumTemplates() > 1) ? Add(i) : AddColItem(i); + FREE(s); + +#ifdef VDRRIP_DVD + if (M->isDVD()) { + i = new cMenuEditIntItem(tr("Title*") , &MovOSD.Title, 1, M->getNumDVDTitles()); + (M->getNumDVDTitles() > 1) ? Add(i) : AddColItem(i); + FREE(s); + } +#endif //VDRRIP_DVD + + // FileSize+Numbers + if (M->getLength() == -1) { + FREE(FileSize[0]); + asprintf(&FileSize[0], "%s", tr("unknown")); + asprintf(&s, "%s", tr("FileSize")); + AddColItem(new cMenuEditStraItem(s, &NumStatic, 1, FileSize)); + asprintf(&s, "%s", tr("FileNumbers")); + AddColItem(new cMenuEditIntItem(s, &MovOSD.FileNumbers, 1, 1)); + FREE(s); + l = strdup("Len: ?"); + } else { + Add(new cMenuEditIntItem(tr("FileSize"), &MovOSD.FileSize, 1, 9999)); + asprintf(&l, "Len: %i", M->getLength()); + Add(new cMenuEditIntItem(tr("FileNumbers"), &MovOSD.FileNumbers, 1, 99)); + } + + // MovieData: + asprintf(&MovieData[0], "%i:%i(Asp: %1.2f %s Fps: %1.2f)", M->getWidth(), + M->getHeight(), M->getAspect(), l, M->getFps() / 100); + AddColItem(new cMenuEditStraItem(tr("MovieData"), &NumStatic, 1, + MovieData)); + FREE(l); + + // CropData: + if (M->getCropWidth() == -1 && M->getCropHeight() == -1) { + if (M->getScaleType() == 0 || M->getScaleType() == 2) { + asprintf(&CropData[0], "%s", tr("not used")); + } else { + asprintf(&CropData[0], "%s", tr("unknown")); + } + } else { + asprintf(&CropData[0], "%i:%i(Asp: %1.2f)", M->getCropWidth(), + M->getCropHeight(), M->getCalcAspect()); + } + AddColItem(new cMenuEditStraItem(tr("CropData"), &NumStatic, 1, CropData)); + + + // Bitrate Video + Add(new cMenuEditIntItem(tr("BitrateVideo"), &MovOSD.BitrateVideo, + 150, 99999)); + + // check, if there is a audio-codec available + if (MovOSD.ACodec != -1) { + if (strcmp(M->C->getACodec(MovOSD.ACodec), "copy") == 0 ) { + AddColItem(new cMenuEditIntItem(tr("BitrateAudio"), + &MovOSD.BitrateAudio, MovOSD.BitrateAudio, MovOSD.BitrateAudio)); + FREE(s); + } else { + Add(new cMenuEditIntItem(tr("BitrateAudio"), &MovOSD.BitrateAudio, + 32, 999)); + } + } + + // Container Format + i = new cMenuEditStraItem(tr("Container"), &MovOSD.Container, + M->C->getNumContainers(), M->C->getContainers()); + (M->C->getNumContainers() > 1) ? Add(i) : AddColItem(i); + FREE(s); + + // check, if there is a video-codec available + if (MovOSD.VCodec != -1) { + Add(new cMenuEditStraItem(tr("Video-Codec"), &MovOSD.VCodec, + M->C->getNumVCodecs(), M->C->getVCodecs())); + Add(new cMenuEditStraItem(tr("Audio-Codec"), &MovOSD.ACodec, + M->C->getNumACodecs(), M->C->getACodecs())); + } + + // Audio-Stream + asprintf(&s, "%s %i*", tr("Audio-Str."), M->getAudioID(MovOSD.AudioID)); + i = new cMenuEditStraItem(s, &MovOSD.AudioID, M->getNumAudioID(), + M->getAudioData()); + FREE(s); + (M->getNumAudioID() > 1) ? Add(i) : AddColItem(i); + + // ScaleType + Add(new cMenuEditStraItem(tr("ScaleType"), &MovOSD.ScaleType, + NUMSCALETYPES, ScaleTypes)); + + switch (MovOSD.ScaleType) { + case 0: { //ScaleType off + break; + } + + case 1: { //ScaleType auto + asprintf(&ScaleData[0], "%i:%i(Asp: %1.2f Bpp: %1.3f)", M->getScaleWidth(), M->getScaleHeight(), (double)M->getScaleWidth() / (double)M->getScaleHeight(), M->getResBpp()); + AddColItem(new cMenuEditStraItem(tr("ScaleData"), &NumStatic, 1, + ScaleData)); + Add(new cMenuEditIntItem(tr("Bpp-Value (*100)"), &MovOSD.Bpp, 1, 99)); + break; + } + + case 2: { //ScaleType dvb + Add(new cMenuEditStraItem(tr("ScaleWidth"), &MovOSD.DVBScaleWidth, 6, DVBScaleWidths)); + Add(new cMenuEditStraItem(tr("ScaleHeight"), &MovOSD.DVBScaleHeight, 2, DVBScaleHeights)); + break; + } + + case 3: { //ScaleType manual + Add(new cMenuEditIntItem(tr("ScaleWidth"), &MovOSD.ScaleWidth, 1, 9999)); + Add(new cMenuEditIntItem(tr("ScaleHeight"), &MovOSD.ScaleHeight, 1, 9999)); + break; + } + + default: + break; + } + + //expert menu: + if (Expert) { + AddColItem(new cOsdItem(tr("------ expert settings: ------"))); + if (MovOSD.CropWidth != -1 && MovOSD.CropHeight != -1) { + AddColItem(new cOsdItem(tr("- adjust crop values:"))); + Add(new cMenuEditIntItem(tr("CropWidth"), &MovOSD.CropWidth, 0, M->getWidth())); + Add(new cMenuEditIntItem(tr("CropHeight"), &MovOSD.CropHeight, 0, M->getHeight())); + } + asprintf(&s, tr("- postprocessing Filters(%s):"), M->getPPValues() ? M->getPPValues() : "off"); + AddColItem(new cOsdItem(s)); + FREE(s); + Add(new cMenuEditStraItem("deinterlacing", &MovOSD.PPDeinterlace, NUMPPDEINT, PPDeint)); + Add(new cMenuEditBoolItem("deblocking", &MovOSD.PPDeblock, "off", "on")); + } + + hadsubmenu = false; +} + + +void cMenuVdrripMovie::OSDChange() { + + if (MovOSD.Template != MovOSDsave.Template) { + // save old crop values + if (M->getScaleType() == 1 || M->getScaleType() == 3) { + CropWidthsave = M->getCropWidth(); + CropHeightsave = M->getCropHeight(); + } + M->setNumTemplate(MovOSD.Template); + // restore old crop values + if (M->getScaleType() == 1 || M->getScaleType() == 3) { + M->setCropValues(CropWidthsave, CropHeightsave); + } + M->saveMovieData(); + Set(); + +#ifdef VDRRIP_DVD + } else if (M->isDVD() && MovOSD.Title != MovOSDsave.Title && MovOSD.Title > 0) { + Interface->Status(tr("reading audio-data from dvd...")); + Interface->Flush(); + M->setDVDTitle(MovOSD.Title, true); + M->saveMovieData(); + Set(); +#endif //VDRRIP_DVD + + } else if ((MovOSD.FileSize != MovOSDsave.FileSize || + MovOSD.FileNumbers != MovOSDsave.FileNumbers) && + MovOSD.FileNumbers > 0) { + M->setFileSize(MovOSD.FileSize, MovOSD.FileNumbers); + M->saveMovieData(); + Set(); + + } else if (MovOSD.BitrateVideo != MovOSDsave.BitrateVideo) { + M->setBitrate(MovOSD.BitrateVideo, MovOSD.BitrateAudio); + M->saveMovieData(); + Set(); + + } else if (MovOSD.BitrateAudio != MovOSDsave.BitrateAudio) { + M->setBitrate(-1 , MovOSD.BitrateAudio); + M->saveMovieData(); + Set(); + + } else if (MovOSD.Container != MovOSDsave.Container) { + if (strcmp(M->C->getContainer(MovOSD.Container), "avi") == 0 && + strcmp(M->C->getACodec(MovOSD.ACodec), "ogg-vorbis") == 0) { + // avi couldn't contain ogg-vorbis audio + M->setContainer(MovOSDsave.Container); + } else { + M->setContainer(MovOSD.Container); + } + M->saveMovieData(); + Set(); + + } else if (MovOSD.VCodec != MovOSDsave.VCodec) { + M->setCodecs(MovOSD.VCodec, MovOSD.ACodec); + M->saveMovieData(); + Set(); + + } else if (MovOSD.ACodec != MovOSDsave.ACodec) { + if (strcmp(M->C->getContainer(MovOSD.Container), "avi") == 0 && + strcmp(M->C->getACodec(MovOSD.ACodec), "ogg-vorbis") == 0) { + // avi couldn't contain ogg-vorbis audio + M->setCodecs(MovOSD.VCodec, MovOSDsave.ACodec); + } else { + M->setCodecs(MovOSD.VCodec, MovOSD.ACodec); + } + M->saveMovieData(); + Set(); + + } else if (MovOSD.AudioID != MovOSDsave.AudioID) { + M->setAudioID(MovOSD.AudioID); + M->saveMovieData(); + Set(); + + } else if (MovOSD.ScaleType != MovOSDsave.ScaleType) { + // restore - save old crop values + if (MovOSDsave.ScaleType == 1 || MovOSDsave.ScaleType == 3) { + CropWidthsave = M->getCropWidth(); + CropHeightsave = M->getCropHeight(); + M->setScaleType(MovOSD.ScaleType); + } else { + M->setScaleType(MovOSD.ScaleType); + M->setCropValues(CropWidthsave, CropHeightsave); + } + M->saveMovieData(); + Set(); + + } else if (MovOSD.ScaleWidth != MovOSDsave.ScaleWidth || + MovOSD.ScaleHeight != MovOSDsave.ScaleHeight) { + M->setScale(MovOSD.ScaleWidth, MovOSD.ScaleHeight); + M->saveMovieData(); + Set(); + + } else if (MovOSD.DVBScaleWidth != MovOSDsave.DVBScaleWidth || + MovOSD.DVBScaleHeight != MovOSDsave.DVBScaleHeight) { + M->setScale(atoi(DVBScaleWidths[MovOSD.DVBScaleWidth]), + atoi(DVBScaleHeights[MovOSD.DVBScaleHeight])); + M->saveMovieData(); + Set(); + + } else if (MovOSD.CropWidth != MovOSDsave.CropWidth || MovOSD.CropHeight != MovOSDsave.CropHeight) { + if (MovOSD.CropWidth <= MovOSDsave.CropWidth) { + MovOSD.CropWidth = roundValue(MovOSD.CropWidth, 16); + } else {MovOSD.CropWidth = roundValue(MovOSD.CropWidth, 16) + 16;} + + if (MovOSD.CropHeight <= MovOSDsave.CropHeight) { + MovOSD.CropHeight = roundValue(MovOSD.CropHeight, 16); + } else {MovOSD.CropHeight = roundValue(MovOSD.CropHeight, 16) + 16;} + + M->setCropValues(MovOSD.CropWidth, MovOSD.CropHeight); + M->saveMovieData(); + Set(); + + } else if (MovOSD.PPDeinterlace != MovOSDsave.PPDeinterlace || MovOSD.PPDeblock != MovOSDsave.PPDeblock) { + if (MovOSD.PPDeinterlace == 0 && MovOSD.PPDeblock == 0) M->setPPValues(NULL); + else if (MovOSD.PPDeinterlace == 0 && MovOSD.PPDeblock == 1) M->setPPValues("hb/vb/dr/al"); + else if (MovOSD.PPDeinterlace >= 1 && MovOSD.PPDeblock == 0) M->setPPValues(PPDeint[MovOSD.PPDeinterlace]); + else { + char *pp = NULL; + asprintf(&pp, "%s/hb/vb/dr/al", PPDeint[MovOSD.PPDeinterlace]); + dsyslog(pp); + M->setPPValues(pp); + FREE(pp); + } + M->saveMovieData(); + Set(); + + } else if (MovOSD.Bpp != MovOSDsave.Bpp) { + M->setBpp(MovOSD.Bpp); + M->saveMovieData(); + Set(); + + } else if (strcmp(MovOSD.Name, MovOSDsaveName) != 0) { + M->setName(MovOSD.Name); + M->saveMovieData(); + } +} + +eOSState cMenuVdrripMovie::ProcessKey(eKeys Key) { + + eOSState state = cOsdMenu::ProcessKey(Key); + + if (HasSubMenu()) { + hadsubmenu = true; + return osContinue; + } + + if (hadsubmenu) { + Set(); + return osContinue; + } + + SetHelpKeys(); + + if (Current() != 0) { + + switch (Key) { + case k0 ... k9: { + OSDupdate = false; + break; + } + + case kRed: { + int p; + Interface->Confirm(tr("<ok> for preview-mode")) ? p = 1 : p = 0; + if (Interface->Confirm(tr("add movie to encoding queue ?"))) { + cQueue *Q; + struct QueueData *q; + Q = new cQueue; + q = (struct QueueData*)malloc(sizeof(struct QueueData)); + + q->Dir = M->getDir(); + q->Name = M->getName(); + q->FileSize = M->getFileSize(); + q->FileNumbers = M->getFileNumbers(); + q->VCodec = M->C->getVCodec(M->getVCodec()); + q->BitrateVideo = M->getBitrateVideo(); + q->MinQuant = MINQUANT; + q->MaxQuant = MAXQUANT; + q->CropWidth = M->getCropWidth(); + q->CropHeight = M->getCropHeight(); + q->CropPosX = M->getCropPosX(); + q->CropPosY = M->getCropPosY(); + q->ScaleWidth = M->getScaleWidth(); + q->ScaleHeight = M->getScaleHeight(); + q->ACodec = M->C->getACodec(M->getACodec()); + q->BitrateAudio = M->getBitrateAudio(); + q->AudioID = M->getAudioID(M->getAudioID()); + q->PPValues = M->getPPValues(); + q->Rename = VdrripSetup.Rename; + q->Container = M->C->getContainer(M->getContainer()); + q->Preview = p; + + if(Q->New(q)) { + FREE(q); + DELETE(Q); + return osBack; + } else {Interface->Error(tr("the queuefile is locked by the queuehandler !"));} + + FREE(q); + DELETE(Q); + + Set(); + } + break; + } + + case kGreen: { + if (MovOSD.ScaleType == 1 | MovOSD.ScaleType == 3) { + if (CropReset) { + if (Interface->Confirm(tr("reset black movie boarders ?"))) { + CropReset = false; + M->initCropValues(); + M->setScale(); + M->saveMovieData(); + } + } else { + if (Interface->Confirm(tr("crop black movie boarders ?"))) { + CropReset = true; + Interface->Status(tr("search for black movie boarders")); + Interface->Flush(); + if (! M->setCropValues()) { + CropReset = false; + Interface->Error(tr("couldn't detect black movie boarders !")); + } + M->saveMovieData(); + } + } + Set(); + } + break; + } + + case kYellow: { + Expert ? Expert = false : Expert = true; + Set(); + break; + } + + case kOk: { + const char *l = Get(Current())->Text(); + if (strstr(l, tr("Audio-Str."))) { + AddSubMenu(new cMenuVdrripMovieAudio(M)); +#ifdef VDRRIP_DVD + } else if (strstr(l, tr("Title*"))) { + AddSubMenu(new cMenuVdrripMovieTitles(M)); +#endif //VDRRIP_DVD + } + break; + } + + default: + OSDupdate = true; + break; + } + } + + if (OSDupdate) {OSDChange();} + + return state; +} + +void cMenuVdrripMovie::AddColItem(cOsdItem *i) { +#ifdef clrScrolLine + i->SetColor(clrScrolLine, clrBackground); +#else + i->SetColor(clrCyan, clrBackground); +#endif + + Add(i); +} + + +// --- cMenuVdrripMovieTitles -------------------------------------------- + +#ifdef VDRRIP_DVD +cMenuVdrripMovieTitles::cMenuVdrripMovieTitles(cMovie *m):cOsdMenu(tr("select dvd title")) { + M = m; + char **s = M->getTitleData(); + for (int i = 0; i < M->getNumDVDTitles(); i++) { + Add(new cOsdItem(s[i])); + } + SetCurrent(Get(M->getDVDTitle() - 1)); + SetHelp(NULL, NULL, NULL, NULL); +} + +cMenuVdrripMovieTitles::~cMenuVdrripMovieTitles() {} + +eOSState cMenuVdrripMovieTitles::ProcessKey(eKeys Key) { + + eOSState state = cOsdMenu::ProcessKey(Key); + + if (Key == kOk) { + Interface->Status(tr("reading audio-data from dvd...")); + Interface->Flush(); + M->setDVDTitle(Current() + 1, true); + M->saveMovieData(); + return osBack; + } + + return state; +} +#endif //VDRRIP_DVD + +// --- cMenuVdrripMovieAudio -------------------------------------------- + +cMenuVdrripMovieAudio::cMenuVdrripMovieAudio(cMovie *m):cOsdMenu(tr("select audio stream(s)")) { + M = m; + char **s = M->getAudioData2(); + for (int i = 0; i < M->getNumAudioID(); i++) { + Add(new cOsdItem(s[i])); + } + SetCurrent(Get(M->getAudioID())); + SetHelp(NULL, NULL, NULL, NULL); +} + +cMenuVdrripMovieAudio::~cMenuVdrripMovieAudio() {} + +eOSState cMenuVdrripMovieAudio::ProcessKey(eKeys Key) { + + eOSState state = cOsdMenu::ProcessKey(Key); + + if (Key == kOk) { + M->setAudioID(Current()); + M->saveMovieData(); + return osBack; + } + + return state; +} + + +// --- cVdrripSetup ----------------------------------------------------------- + +cVdrripSetup VdrripSetup; + +cVdrripSetup::cVdrripSetup(void) +{ + MaxScaleWidth = 704; + MinScaleWidth = 480; + CropMode = 0; + CropLength = 5; + Rename = 0; + OggVorbis = 0; + AC3 = 0; + Ogm = 0; + Matroska = 0; +} + +bool cVdrripSetup::SetupParse(const char *Name, const char *Value) +{ + if (!strcasecmp(Name, "MaxScaleWidth")) MaxScaleWidth = atoi(Value); + else if (!strcasecmp(Name, "MinScaleWidth")) MinScaleWidth = atoi(Value); + else if (!strcasecmp(Name, "CropMode")) CropMode = atoi(Value); + else if (!strcasecmp(Name, "CropLength")) CropLength = atoi(Value); + else if (!strcasecmp(Name, "Rename")) Rename = atoi(Value); + else if (!strcasecmp(Name, "OggVorbis")) OggVorbis = atoi(Value); + else if (!strcasecmp(Name, "AC3")) AC3 = atoi(Value); + else if (!strcasecmp(Name, "Ogm")) Ogm = atoi(Value); + else if (!strcasecmp(Name, "Matroska")) Matroska = atoi(Value); + else + return false; + return true; +} + + +// --- cMenuVdrripSetup -------------------------------------------------------- + +cMenuVdrripSetup::cMenuVdrripSetup() +{ + data = VdrripSetup; + + Add(new cMenuEditIntItem(tr("MaxScaleWidth"), &data.MaxScaleWidth, 1, 9999)); + Add(new cMenuEditIntItem(tr("MinScaleWidth"), &data.MinScaleWidth, 1, 9999)); + Add(new cMenuEditStraItem(tr("Crop Mode"), &data.CropMode, 2, CropModes)); + Add(new cMenuEditIntItem(tr("Crop DetectLength (s)"), &data.CropLength, 1, 999)); + Add(new cMenuEditBoolItem(tr("Rename movie after encoding"), &data.Rename, tr("no"), tr("yes"))); + Add(new cMenuEditBoolItem(tr("Ogg-Vorbis support"), &data.OggVorbis, tr("no"), tr("yes"))); + Add(new cMenuEditBoolItem(tr("AC3 support (MPlayer-patch inst.)"), &data.AC3, tr("no"), tr("yes"))); + Add(new cMenuEditBoolItem(tr("Ogm support"), &data.Ogm, tr("no"), tr("yes"))); + Add(new cMenuEditBoolItem(tr("Matroska support"), &data.Matroska, tr("no"), tr("yes"))); +} + +void cMenuVdrripSetup::Store(void) +{ + // delete unused setup data + SetupStore("FileSize"); + SetupStore("FileNumbers"); + SetupStore("LameAudioBitrate"); + SetupStore("Bpp"); + + + VdrripSetup = data; + SetupStore("MaxScaleWidth", VdrripSetup.MaxScaleWidth); + SetupStore("MinScaleWidth", VdrripSetup.MinScaleWidth); + SetupStore("CropMode", VdrripSetup.CropMode); + SetupStore("CropLength", VdrripSetup.CropLength); + SetupStore("Rename", VdrripSetup.Rename); + SetupStore("OggVorbis", VdrripSetup.OggVorbis); + SetupStore("AC3", VdrripSetup.AC3); + SetupStore("Ogm", VdrripSetup.Ogm); + SetupStore("Matroska", VdrripSetup.Matroska); +} |