static int RebuildSeekTable(ProgramInfo *pginfo, int jobid) { if (!DoesFileExist(pginfo)) return GENERIC_EXIT_PERMISSIONS_ERROR; QString filename = get_filename(pginfo); RingBuffer *tmprbuf = RingBuffer::Create(filename, false); if (!tmprbuf) { LOG(VB_GENERAL, LOG_ERR, QString("Unable to create RingBuffer for %1").arg(filename)); return GENERIC_EXIT_PERMISSIONS_ERROR; } MythCommFlagPlayer *cfp = new MythCommFlagPlayer(); PlayerContext *ctx = new PlayerContext(kFlaggerInUseID); AVSpecialDecode sp = (AVSpecialDecode) (kAVSpecialDecode_LowRes | kAVSpecialDecode_SingleThreaded | kAVSpecialDecode_NoLoopFilter); ctx->SetSpecialDecode(sp); ctx->SetPlayingInfo(pginfo); ctx->SetRingBuffer(tmprbuf); ctx->SetPlayer(cfp); cfp->SetPlayerInfo(NULL, NULL, true, ctx); time_t time_now; if (progress) { time_now = time(NULL); cerr << "Rebuild started at " << ctime(&time_now) << endl; } cfp->RebuildSeekTable(progress); if (progress) { time_now = time(NULL); cerr << "Rebuild completed at " << ctime(&time_now) << endl; } delete ctx; return GENERIC_EXIT_OK; }
static int BuildVideoMarkup(ProgramInfo *program_info, bool useDB) { QString filename; if (program_info->IsMythStream()) filename = program_info->GetPathname(); else filename = get_filename(program_info); RingBuffer *tmprbuf = RingBuffer::Create(filename, false); if (!tmprbuf) { LOG(VB_GENERAL, LOG_ERR, QString("Unable to create RingBuffer for %1").arg(filename)); return GENERIC_EXIT_PERMISSIONS_ERROR; } if (useDB && !MSqlQuery::testDBConnection()) { LOG(VB_GENERAL, LOG_ERR, "Unable to open DB connection for commercial flagging."); delete tmprbuf; return GENERIC_EXIT_DB_ERROR; } MythCommFlagPlayer *cfp = new MythCommFlagPlayer(); PlayerContext *ctx = new PlayerContext("seektable rebuilder"); ctx->SetSpecialDecode(kAVSpecialDecode_NoDecode); ctx->SetPlayingInfo(program_info); ctx->SetRingBuffer(tmprbuf); ctx->SetPlayer(cfp); cfp->SetPlayerInfo(NULL, NULL, true, ctx); cfp->RebuildSeekTable(progress); if (progress) cerr << "Rebuilt" << endl; delete ctx; return GENERIC_EXIT_OK; }
static int FlagCommercials(ProgramInfo *program_info, int jobid, const QString &outputfilename, bool useDB, bool fullSpeed) { global_program_info = program_info; int breaksFound = 0; // configure commercial detection method SkipTypes commDetectMethod = (SkipTypes)gCoreContext->GetNumSetting( "CommercialSkipMethod", COMM_DETECT_ALL); if (cmdline.toBool("commmethod")) { // pull commercial detection method from command line QString commmethod = cmdline.toString("commmethod"); // assume definition as integer value bool ok = true; commDetectMethod = (SkipTypes) commmethod.toInt(&ok); if (!ok) { // not an integer, attempt comma separated list commDetectMethod = COMM_DETECT_UNINIT; QMap<QString, SkipTypes>::const_iterator sit; QStringList list = commmethod.split(",", QString::SkipEmptyParts); QStringList::const_iterator it = list.begin(); for (; it != list.end(); ++it) { QString val = (*it).toLower(); if (val == "off") { commDetectMethod = COMM_DETECT_OFF; break; } if (!skipTypes->contains(val)) { cerr << "Failed to decode --method option '" << val.toLatin1().constData() << "'" << endl; return GENERIC_EXIT_INVALID_CMDLINE; } if (commDetectMethod == COMM_DETECT_UNINIT) { commDetectMethod = (SkipTypes) skipTypes->value(val); } else { commDetectMethod = (SkipTypes) ((int)commDetectMethod | (int)skipTypes->value(val)); } } } if (commDetectMethod == COMM_DETECT_UNINIT) return GENERIC_EXIT_INVALID_CMDLINE; } else if (useDB) { // if not manually specified, and we have a database to access // pull the commflag type from the channel MSqlQuery query(MSqlQuery::InitCon()); query.prepare("SELECT commmethod FROM channel " "WHERE chanid = :CHANID;"); query.bindValue(":CHANID", program_info->GetChanID()); if (!query.exec()) { // if the query fails, return with an error commDetectMethod = COMM_DETECT_UNINIT; MythDB::DBError("FlagCommercials", query); } else if (query.next()) { commDetectMethod = (enum SkipTypes)query.value(0).toInt(); if (commDetectMethod == COMM_DETECT_COMMFREE) { // if the channel is commercial free, drop to the default instead commDetectMethod = (enum SkipTypes)gCoreContext->GetNumSetting( "CommercialSkipMethod", COMM_DETECT_ALL); LOG(VB_COMMFLAG, LOG_INFO, QString("Chanid %1 is marked as being Commercial Free, " "we will use the default commercial detection " "method").arg(program_info->GetChanID())); } else if (commDetectMethod == COMM_DETECT_UNINIT) // no value set, so use the database default commDetectMethod = (enum SkipTypes)gCoreContext->GetNumSetting( "CommercialSkipMethod", COMM_DETECT_ALL); LOG(VB_COMMFLAG, LOG_INFO, QString("Using method: %1 from channel %2") .arg(commDetectMethod).arg(program_info->GetChanID())); } } else if (!useDB) { // default to a cheaper method for debugging purposes commDetectMethod = COMM_DETECT_BLANK; } // if selection has failed, or intentionally disabled, drop out if (commDetectMethod == COMM_DETECT_UNINIT) return GENERIC_EXIT_NOT_OK; else if (commDetectMethod == COMM_DETECT_OFF) return GENERIC_EXIT_OK; frm_dir_map_t blanks; recorder = NULL; /* * is there a purpose to this not fulfilled by --getskiplist? if (onlyDumpDBCommercialBreakList) { frm_dir_map_t commBreakList; program_info->QueryCommBreakList(commBreakList); print_comm_flag_output(program_info, commBreakList, 0, NULL, outputfilename); global_program_info = NULL; return GENERIC_EXIT_OK; } */ if (!DoesFileExist(program_info)) { LOG(VB_GENERAL, LOG_ERR, "Unable to find file in defined storage paths."); return GENERIC_EXIT_PERMISSIONS_ERROR; } QString filename = get_filename(program_info); RingBuffer *tmprbuf = RingBuffer::Create(filename, false); if (!tmprbuf) { LOG(VB_GENERAL, LOG_ERR, QString("Unable to create RingBuffer for %1").arg(filename)); global_program_info = NULL; return GENERIC_EXIT_PERMISSIONS_ERROR; } if (useDB) { if (!MSqlQuery::testDBConnection()) { LOG(VB_GENERAL, LOG_ERR, "Unable to open commflag DB connection"); delete tmprbuf; global_program_info = NULL; return GENERIC_EXIT_DB_ERROR; } } PlayerFlags flags = (PlayerFlags)(kAudioMuted | kVideoIsNull | kDecodeLowRes | kDecodeSingleThreaded | kDecodeNoLoopFilter | kNoITV); /* blank detector needs to be only sample center for this optimization. */ if ((COMM_DETECT_BLANKS == commDetectMethod) || (COMM_DETECT_2_BLANK == commDetectMethod)) { flags = (PlayerFlags) (flags | kDecodeFewBlocks); } MythCommFlagPlayer *cfp = new MythCommFlagPlayer(flags); PlayerContext *ctx = new PlayerContext(kFlaggerInUseID); ctx->SetPlayingInfo(program_info); ctx->SetRingBuffer(tmprbuf); ctx->SetPlayer(cfp); cfp->SetPlayerInfo(NULL, NULL, ctx); if (useDB) { if (program_info->GetRecordingEndTime() > MythDate::current()) { gCoreContext->ConnectToMasterServer(); recorder = RemoteGetExistingRecorder(program_info); if (recorder && (recorder->GetRecorderNumber() != -1)) { recorderNum = recorder->GetRecorderNumber(); watchingRecording = true; ctx->SetRecorder(recorder); LOG(VB_COMMFLAG, LOG_INFO, QString("mythcommflag will flag recording " "currently in progress on cardid %1") .arg(recorderNum)); } else { recorderNum = -1; watchingRecording = false; LOG(VB_GENERAL, LOG_ERR, "Unable to find active recorder for this " "recording, realtime flagging will not be enabled."); } cfp->SetWatchingRecording(watchingRecording); } } // TODO: Add back insertion of job if not in jobqueue breaksFound = DoFlagCommercials( program_info, progress, fullSpeed, jobid, cfp, commDetectMethod, outputfilename, useDB); if (progress) cerr << breaksFound << "\n"; LOG(VB_GENERAL, LOG_NOTICE, QString("Finished, %1 break(s) found.") .arg(breaksFound)); delete ctx; global_program_info = NULL; return breaksFound; }