summaryrefslogtreecommitdiff
path: root/tvapi/libtv/tv/CTvScanner.cpp (plain)
blob: e029b6db18cad9f61468144072ddc17c94bf5270
1//
2//
3// amlogic 2013
4//
5// @ Project : tv
6// @ File Name :
7// @ Date : 2013-11
8// @ Author :
9//
10#define LOG_TAG "CTvScanner"
11
12#include "CTvScanner.h"
13#include "CTvProgram.h"
14#include "CTvRegion.h"
15#include "CFrontEnd.h"
16
17CTvScanner *CTvScanner::m_s_Scanner = NULL;
18//int CTvScanner::getStartPara()
19//{
20//
21//}
22CTvScanner::CTvScanner()
23{
24 mbScanStart = false;
25 mpObserver = NULL;
26 mSource = 0xff;
27 mMinFreq = 1;
28 mMaxFreq = 100;
29 mCurScanStartFreq = 1;
30 mCurScanEndFreq = 100;
31}
32
33CTvScanner::~CTvScanner()
34{
35 AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
36 AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
37}
38
39
40AM_Bool_t CTvScanner::atv_cvbs_lock_check(v4l2_std_id *colorStd)
41{
42 tvafe_cvbs_video_t cvbs_lock_status;
43 int ret, i = 0;
44
45 *colorStd = 0;
46 while (i < 20) {
47 ret = CTvin::getInstance()->AFE_GetCVBSLockStatus(&cvbs_lock_status);
48
49 if (cvbs_lock_status == TVAFE_CVBS_VIDEO_HV_LOCKED)
50 //||cvbs_lock_status == TVAFE_CVBS_VIDEO_V_LOCKED
51 //||cvbs_lock_status == TVAFE_CVBS_VIDEO_H_LOCKED)
52 {
53 usleep(2000 * 1000);
54 tvin_info_t info;
55 CTvin::getInstance()->VDIN_GetSignalInfo(&info);
56 *colorStd = CTvin::CvbsFtmToV4l2ColorStd(info.fmt);
57 LOGD("atv_cvbs_lock_check locked and cvbs fmt = %d std = 0x%p", info.fmt, colorStd);
58 return true;
59 }
60 usleep(50 * 1000);
61 i++;
62 }
63 return false;
64}
65
66AM_Bool_t CTvScanner::s_atv_cvbs_lock_check(void *data)
67{
68 if (data == NULL) return false;
69 AM_SCAN_ATV_LOCK_PARA_t *pAtvPara = (AM_SCAN_ATV_LOCK_PARA_t *)data;
70 CTvScanner *pScan = (CTvScanner *)(pAtvPara->pData);
71 v4l2_std_id std;
72 AM_Bool_t isLock = pScan->atv_cvbs_lock_check(&std);
73 pAtvPara->pOutColorSTD = std;
74 return isLock;
75}
76
77int CTvScanner::ATVManualScan(int min_freq, int max_freq, int std, int store_Type, int channel_num)
78{
79 stopScan();
80 if (min_freq <= 0 || max_freq <= 0 || min_freq == max_freq) {
81 LOGD("atv manual scan freq error start = %d end = %d", min_freq, max_freq);
82 return -1;
83 }
84 int direction = (max_freq >= min_freq) ? 1 : 0;
85
86 if (!mbScanStart) { //not start or stop
87 //
88 mCurScanStartFreq = min_freq;
89 mCurScanEndFreq = max_freq;
90 AM_SCAN_CreatePara_t para;
91 AM_DMX_OpenPara_t dmx_para;
92 AM_SCAN_Handle_t handle = 0, i;
93 LOGD("startScanThread");
94 // Create the scan
95 memset(&para, 0, sizeof(para));
96 para.fend_dev_id = 0;//default
97 para.mode = AM_SCAN_MODE_ATV_DTV;//
98 para.atv_para.mode = AM_SCAN_ATVMODE_MANUAL;
99 para.atv_para.storeMode = store_Type;
100 para.dtv_para.mode = AM_SCAN_DTVMODE_NONE;
101
102 para.atv_para.am_scan_atv_cvbs_lock = s_atv_cvbs_lock_check;
103
104 para.atv_para.fe_cnt = 3;
105 para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)));
106 if (para.atv_para.fe_paras != NULL) {
107 memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
108 para.atv_para.fe_paras[0].m_type = FE_ANALOG;
109 para.atv_para.fe_paras[0].analog.para.frequency = min_freq;
110 para.atv_para.fe_paras[1].m_type = FE_ANALOG;
111 para.atv_para.fe_paras[1].analog.para.frequency = max_freq;
112 para.atv_para.fe_paras[2].m_type = FE_ANALOG;
113 para.atv_para.fe_paras[2].analog.para.frequency = min_freq;
114 }
115 para.atv_para.direction = direction;
116 para.atv_para.default_std = std;
117
118 para.atv_para.channel_id = -1;
119 para.atv_para.cvbs_unlocked_step = 1000000;
120 para.atv_para.cvbs_locked_step = 3000000;
121 para.atv_para.afc_range = 2000000;
122
123 para.dtv_para.resort_all = AM_FALSE;
124 para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
125 para.store_cb = am_scan_atv_store;
126 para.atv_para.channel_num = channel_num;
127
128 memset(&dmx_para, 0, sizeof(dmx_para));
129 AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
130
131 if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) {
132 AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
133 tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
134 }
135
136 LOGD("atv manual scan mode = %d", para.dtv_para.mode);
137 // Start Scan
138 if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
139 LOGD("SCAN CREATE fail");
140 handle = NULL;
141 } else {
142 mScanHandle = handle;
143 AM_SCAN_SetUserData(handle, (void *)this);
144 AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
145 AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
146 if (AM_SCAN_Start(handle) != AM_SUCCESS) {
147 AM_SCAN_Destroy(handle, AM_FALSE);
148 AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
149 AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
150 handle = NULL;
151 }
152 }
153 if (para.atv_para.fe_paras != NULL)
154 free(para.atv_para.fe_paras);
155 if (para.dtv_para.fe_paras != NULL)
156 free(para.dtv_para.fe_paras);
157
158 if (handle == NULL) {
159 return -1;
160 }
161 mbScanStart = true;//start call ok
162 } else {
163 LOGD("scanning and not stop");
164 }
165
166 return 0;
167
168}
169
170void CTvScanner::am_scan_atv_store(AM_SCAN_Result_t *result)
171{
172 AM_SCAN_TS_t *ts;
173 int i, ret, db_sat_id = -1;
174 //AM_SCAN_RecTab_t srv_tab;
175 for (ts = result->tses; ts != NULL; ts = ts->p_next) {
176 //
177 m_s_Scanner->mCurEv.clear();
178 m_s_Scanner->mCurEv.mType = ScannerEvent::EVENT_ATV_PROG_DATA;
179 m_s_Scanner->mCurEv.mVideoStd = CFrontEnd::stdAndColorToVideoEnum(ts->analog.std);
180 m_s_Scanner->mCurEv.mAudioStd = CFrontEnd::stdAndColorToAudioEnum(ts->analog.std);
181 m_s_Scanner->mCurEv.mIsAutoStd = ((ts->analog.std & V4L2_COLOR_STD_AUTO) == V4L2_COLOR_STD_AUTO) ? 1 : 0;
182 m_s_Scanner->mCurEv.mFrequency = ts->analog.freq;
183 //
184 m_s_Scanner->sendEvent(m_s_Scanner->mCurEv);
185 LOGD("ATV: > freq:%d", m_s_Scanner->mCurEv.mFrequency);
186 }
187}
188
189void CTvScanner::setGlobalScanerObject(CTvScanner *s)
190{
191 m_s_Scanner = s;
192}
193
194int CTvScanner::autoAtvScan(int min_freq, int max_freq, int std, int search_type)
195{
196 stopScan();
197 if (min_freq <= 0 || max_freq <= 0 || min_freq > max_freq)
198 return -1;
199 if (!mbScanStart) { //not start or stop
200 mCurScanStartFreq = min_freq;
201 mCurScanEndFreq = max_freq;
202
203 AM_SCAN_CreatePara_t para;
204 AM_DMX_OpenPara_t dmx_para;
205 AM_SCAN_Handle_t handle = 0, i;
206 // Create the scan
207 memset(&para, 0, sizeof(para));
208
209 para.fend_dev_id = 0;//default
210 para.mode = AM_SCAN_MODE_ATV_DTV;//
211 para.atv_para.mode = AM_SCAN_ATVMODE_AUTO;
212 if (search_type == 1)
213 para.atv_para.storeMode = 1;
214 else
215 para.atv_para.storeMode = 0;
216 para.dtv_para.mode = AM_SCAN_DTVMODE_NONE;
217
218 para.atv_para.am_scan_atv_cvbs_lock = s_atv_cvbs_lock_check;
219
220 para.atv_para.fe_cnt = 3;
221 para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)));
222 if (para.atv_para.fe_paras != NULL) {
223 memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
224 para.atv_para.fe_paras[0].m_type = FE_ANALOG;
225 para.atv_para.fe_paras[0].analog.para.frequency = min_freq;
226 para.atv_para.fe_paras[1].m_type = FE_ANALOG;
227 para.atv_para.fe_paras[1].analog.para.frequency = max_freq;
228 para.atv_para.fe_paras[2].m_type = FE_ANALOG;
229 para.atv_para.fe_paras[2].analog.para.frequency = 0;
230 }
231
232 para.atv_para.direction = 0;
233 para.atv_para.default_std = std;
234
235 para.atv_para.channel_id = -1;
236 para.atv_para.afc_unlocked_step = 3000000;
237 para.atv_para.cvbs_unlocked_step = 1500000;
238 para.atv_para.cvbs_locked_step = 6000000;
239 para.atv_para.afc_range = 2000000;
240
241 para.dtv_para.resort_all = AM_FALSE;
242 para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
243 para.store_cb = am_scan_atv_store;
244
245 memset(&dmx_para, 0, sizeof(dmx_para));
246 AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
247
248 if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) {
249 AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
250 tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
251 }
252
253 // prog->dmx_id = para.dtv_para.dmx_dev_id;
254 // prog->fend_id = para.fend_dev_id;
255 // prog->mode = para.dtv_para.mode;
256 LOGD(" mode = %d", para.dtv_para.mode);
257 // Start Scan
258 if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
259 LOGD("SCAN CREATE fail");
260 handle = NULL;
261 } else {
262 mScanHandle = handle;
263 AM_SCAN_SetUserData(handle, (void *)this);
264 //注册搜索事件
265 AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
266 //注册信号质量通知事件
267 AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
268 if (AM_SCAN_Start(handle) != AM_SUCCESS) {
269 AM_SCAN_Destroy(handle, AM_FALSE);
270 AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
271 AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
272 handle = NULL;
273 }
274 }
275 if (para.atv_para.fe_paras != NULL)
276 free(para.atv_para.fe_paras);
277 if (para.dtv_para.fe_paras != NULL)
278 free(para.dtv_para.fe_paras);
279
280 if (handle == NULL) {
281 return -1;
282 }
283 mbScanStart = true;//start call ok
284 } else {
285 LOGD("scanning and not stop");
286 }
287
288 return 0;
289}
290
291/*
292int CTvScanner::manualAtscScan(int channelID, int attennaType, int std)
293{
294 stopScan();
295 if (!mbScanStart) { //not start or stop
296 AM_SCAN_CreatePara_t para;
297 AM_DMX_OpenPara_t dmx_para;
298 AM_SCAN_Handle_t handle = 0;
299 int i;
300 // Create the scan
301 memset(&para, 0, sizeof(para));
302
303 //strcpy(para.default_text_lang,"eng");//config
304 //strcpy(para.text_langs, "local eng zho chi chs first");//config
305 para.fend_dev_id = 0;//default
306 para.mode = AM_SCAN_MODE_ADTV;//DTV
307 para.atv_para.mode = AM_SCAN_ATVMODE_NONE;
308
309 para.atv_para.default_std = std;
310
311 para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL;//DTV_MODE_ALLBAND
312 //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略
313 para.dtv_para.source = FE_ATSC;//fe_type
314 para.dtv_para.dmx_dev_id = 0;//default 0
315 para.dtv_para.resort_all = AM_TRUE;
316 para.dtv_para.clear_source = AM_FALSE;
317 para.dtv_para.mix_tv_radio = AM_FALSE;
318 para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
319 para.store_cb = NULL;
320 //para.dtv_para.attenna = attennaType;
321
322 para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC;
323
324 mSource = para.dtv_para.source;
325
326 Vector<sp<CTvChannel> > vcp;
327
328 //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db
329 getAtscChannelPara(attennaType, vcp);
330 LOGD("ANDESEN test attenna type is %d", attennaType);
331
332 int size = vcp.size();
333 LOGD("channel list size = %d", size);
334 //showboz
335 if (size == 0) {
336 CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml");
337 getAtscChannelPara(attennaType, vcp);
338 size = vcp.size();
339 }
340
341 if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(1, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
342 return -1;
343
344 //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
345
346 for (i = 0; i < size; i++) {
347 if (channelID == vcp[i]->getLogicalChannelNum()) {
348 para.dtv_para.fe_paras[0].m_type = 3;//MODE_ATSC
349 para.dtv_para.fe_paras[0].atsc.para.frequency = vcp[i]->getFrequency();
350 para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation());
351 LOGD("andesen test atsc manual type=%d,num=%d,freq=%d,modu=%d",
352 para.dtv_para.fe_paras[0].m_type, para.dtv_para.fe_paras[0].m_logicalChannelNum,
353 para.dtv_para.fe_paras[0].atsc.para.frequency, para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation);
354 }
355 }
356 //allband
357 para.dtv_para.fe_cnt = 1;
358 memset(&dmx_para, 0, sizeof(dmx_para));
359 AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
360
361 if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) {
362 AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
363 tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
364 }
365
366 // prog->dmx_id = para.dtv_para.dmx_dev_id;
367 // prog->fend_id = para.fend_dev_id;
368 // prog->mode = para.dtv_para.mode;
369 // Start Scan
370 if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
371 LOGD("SCAN CREATE fail");
372 handle = 0;
373 } else {
374 mScanHandle = handle;
375 AM_SCAN_SetUserData(handle, (void *)this);
376 //注册搜索事件
377 AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
378 //注册信号质量通知事件
379 AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
380 if (AM_SCAN_Start(handle) != AM_SUCCESS) {
381 AM_SCAN_Destroy(handle, AM_FALSE);
382 AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
383 AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
384 handle = 0;
385 }
386 }
387 if (para.atv_para.fe_paras != NULL)
388 free(para.atv_para.fe_paras);
389 if (para.dtv_para.fe_paras != NULL)
390 free(para.dtv_para.fe_paras);
391 if (handle == 0) {
392 return -1;
393 }
394 mbScanStart = true;//start call ok
395 } else {
396 LOGD("scanning and not stop");
397 }
398 return 0;
399}
400*/
401
402#define dvb_fend_para(_p) ((struct dvb_frontend_parameters*)(&_p))
403#define IS_DVBT2_TS(_para) (_para.m_type == FE_OFDM && _para.terrestrial.para.u.ofdm.ofdm_mode == OFDM_DVBT2)
404#define IS_ISDBT_TS(_para) (_para.m_type == FE_ISDBT)
405
406dvbpsi_pat_t *CTvScanner::get_valid_pats(AM_SCAN_TS_t *ts)
407{
408 dvbpsi_pat_t *valid_pat = NULL;
409 if (!IS_DVBT2_TS(ts->digital.fend_para)) {
410 valid_pat = ts->digital.pats;
411 } else if (IS_ISDBT_TS(ts->digital.fend_para)) {
412 /* process for isdbt one-seg inserted PAT, which ts_id is 0xffff */
413 valid_pat = ts->digital.pats;
414 while (valid_pat != NULL && valid_pat->i_ts_id == 0xffff) {
415 valid_pat = valid_pat->p_next;
416 }
417
418 if (valid_pat == NULL && ts->digital.pats != NULL) {
419 valid_pat = ts->digital.pats;
420
421 if (ts->digital.sdts != NULL)
422 valid_pat->i_ts_id = ts->digital.sdts->i_ts_id;
423 }
424 } else {
425 int plp;
426
427 for (plp = 0; plp < ts->digital.dvbt2_data_plp_num; plp++) {
428 if (ts->digital.dvbt2_data_plps[plp].pats != NULL) {
429 valid_pat = ts->digital.dvbt2_data_plps[plp].pats;
430 break;
431 }
432 }
433 }
434
435 return valid_pat;
436}
437
438void CTvScanner::scan_process_ts_info(AM_SCAN_Result_t *result __unused, AM_SCAN_TS_t *ts, ScannerEvent *evt)
439{
440 dvbpsi_nit_t *nit;
441 dvbpsi_descriptor_t *descr;
442
443 evt->mONetId = -1;
444 evt->mTsId = -1;
445
446 if (ts->digital.sdts)
447 evt->mONetId = ts->digital.sdts->i_network_id;
448 else if (IS_DVBT2_TS(ts->digital.fend_para) && ts->digital.dvbt2_data_plp_num > 0 && ts->digital.dvbt2_data_plps[0].sdts)
449 evt->mONetId = ts->digital.dvbt2_data_plps[0].sdts->i_network_id;
450 evt->mTsId = get_valid_pats(ts)->i_ts_id;
451
452 evt->mFrequency = (int)dvb_fend_para(ts->digital.fend_para)->frequency;
453 evt->mMode = ts->digital.fend_para.m_type;
454 if (IS_DVBT2_TS(ts->digital.fend_para))
455 evt->mOfdm_mode = (int)dvb_fend_para(ts->digital.fend_para)->u.ofdm.ofdm_mode;
456 else if ((ts->digital.fend_para.m_type == FE_DTMB) || (ts->digital.fend_para.m_type == FE_OFDM))
457 evt->mBandwidth = (int)dvb_fend_para(ts->digital.fend_para)->u.ofdm.bandwidth;
458 else if (ts->digital.fend_para.m_type == FE_QAM) {
459 evt->mSymbolRate = (int)dvb_fend_para(ts->digital.fend_para)->u.qam.symbol_rate;
460 evt->mModulation = (int)dvb_fend_para(ts->digital.fend_para)->u.qam.modulation;
461 }
462}
463void CTvScanner::scan_init_service_info(SCAN_ServiceInfo_t *srv_info)
464{
465 memset(srv_info, 0, sizeof(SCAN_ServiceInfo_t));
466 srv_info->vid = 0x1fff;
467 srv_info->vfmt = -1;
468 srv_info->free_ca = 1;
469 srv_info->srv_id = 0xffff;
470 srv_info->srv_dbid = -1;
471 srv_info->satpara_dbid = -1;
472 srv_info->pmt_pid = 0x1fff;
473 srv_info->plp_id = -1;
474 srv_info->sdt_version = 0xff;
475}
476int CTvScanner::get_pmt_pid(dvbpsi_pat_t *pats, int program_number)
477{
478 dvbpsi_pat_t *pat;
479 dvbpsi_pat_program_t *prog;
480
481 AM_SI_LIST_BEGIN(pats, pat)
482 AM_SI_LIST_BEGIN(pat->p_first_program, prog)
483 if (prog->i_number == program_number)
484 return prog->i_pid;
485 AM_SI_LIST_END()
486 AM_SI_LIST_END()
487
488 return 0x1fff;
489}
490
491void CTvScanner::scan_extract_ca_scrambled_flag(dvbpsi_descriptor_t *p_first_descriptor, int *flag)
492{
493 dvbpsi_descriptor_t *descr;
494
495 AM_SI_LIST_BEGIN(p_first_descriptor, descr)
496 if (descr->i_tag == AM_SI_DESCR_CA && ! *flag) {
497 LOGD( "Found CA descr, set scrambled flag to 1");
498 *flag = 1;
499 break;
500 }
501 AM_SI_LIST_END()
502}
503
504void CTvScanner::scan_extract_srv_info_from_sdt(AM_SCAN_Result_t *result, dvbpsi_sdt_t *sdts, SCAN_ServiceInfo_t *srv_info)
505{
506 dvbpsi_sdt_service_t *srv;
507 dvbpsi_sdt_t *sdt;
508 dvbpsi_descriptor_t *descr;
509 const uint8_t split = 0x80;
510 const int name_size = (int)sizeof(srv_info->name);
511 int curr_name_len = 0, tmp_len;
512 char name[AM_DB_MAX_SRV_NAME_LEN + 1];
513
514 UNUSED(result);
515
516#define COPY_NAME(_s, _slen)\
517 AM_MACRO_BEGIN\
518 int copy_len = ((curr_name_len+_slen)>=name_size) ? (name_size-curr_name_len) : _slen;\
519 if (copy_len > 0) {\
520 memcpy(srv_info->name+curr_name_len, _s, copy_len);\
521 curr_name_len += copy_len;\
522 }\
523 AM_MACRO_END
524
525
526 AM_SI_LIST_BEGIN(sdts, sdt)
527 AM_SI_LIST_BEGIN(sdt->p_first_service, srv)
528 /*从SDT表中查找该service并获取信息*/
529 if (srv->i_service_id == srv_info->srv_id) {
530 LOGD("SDT for service %d found!", srv_info->srv_id);
531 srv_info->eit_sche = (uint8_t)srv->b_eit_schedule;
532 srv_info->eit_pf = (uint8_t)srv->b_eit_present;
533 srv_info->rs = srv->i_running_status;
534 srv_info->free_ca = (uint8_t)srv->b_free_ca;
535 srv_info->sdt_version = sdt->i_version;
536
537 AM_SI_LIST_BEGIN(srv->p_first_descriptor, descr)
538 if (descr->p_decoded && descr->i_tag == AM_SI_DESCR_SERVICE) {
539 dvbpsi_service_dr_t *psd = (dvbpsi_service_dr_t *)descr->p_decoded;
540 if (psd->i_service_name_length > 0) {
541 name[0] = 0;
542 AM_SI_ConvertDVBTextCode((char *)psd->i_service_name, psd->i_service_name_length, \
543 name, AM_DB_MAX_SRV_NAME_LEN);
544 name[AM_DB_MAX_SRV_NAME_LEN] = 0;
545 LOGD("found name [%s]", name);
546
547 /*3bytes language code, using xxx to simulate*/
548 COPY_NAME("xxx", 3);
549 /*following by name text*/
550 tmp_len = strlen(name);
551 COPY_NAME(name, tmp_len);
552 }
553 /*业务类型*/
554 srv_info->srv_type = psd->i_service_type;
555 /*service type 0x16 and 0x19 is user defined, as digital television service*/
556 /*service type 0xc0 is type of partial reception service in ISDBT*/
557 if ((srv_info->srv_type == 0x16) || (srv_info->srv_type == 0x19) || (srv_info->srv_type == 0xc0)) {
558 srv_info->srv_type = 0x1;
559 }
560 break;
561 }
562 AM_SI_LIST_END()
563
564 /* store multilingual service name */
565 AM_SI_LIST_BEGIN(srv->p_first_descriptor, descr)
566 if (descr->p_decoded && descr->i_tag == AM_SI_DESCR_MULTI_SERVICE_NAME) {
567 int i;
568 dvbpsi_multi_service_name_dr_t *pmsnd = (dvbpsi_multi_service_name_dr_t *)descr->p_decoded;
569
570 for (i = 0; i < pmsnd->i_name_count; i++) {
571 name[0] = 0;
572 AM_SI_ConvertDVBTextCode((char *)pmsnd->p_service_name[i].i_service_name,
573 pmsnd->p_service_name[i].i_service_name_length,
574 name, AM_DB_MAX_SRV_NAME_LEN);
575 name[AM_DB_MAX_SRV_NAME_LEN] = 0;
576 LOGD("found name [%s]", name);
577
578 if (curr_name_len > 0) {
579 /*extra split mark*/
580 COPY_NAME(&split, 1);
581 }
582 /*3bytes language code*/
583 COPY_NAME(pmsnd->p_service_name[i].i_iso_639_code, 3);
584 /*following by name text*/
585 tmp_len = strlen(name);
586 COPY_NAME(name, tmp_len);
587 }
588 }
589 AM_SI_LIST_END()
590
591 /* set the ending null byte */
592 if (curr_name_len >= name_size)
593 srv_info->name[name_size - 1] = 0;
594 else
595 srv_info->name[curr_name_len] = 0;
596
597 break;
598 }
599 AM_SI_LIST_END()
600 AM_SI_LIST_END()
601}
602
603void CTvScanner::scan_update_service_info(AM_SCAN_Result_t *result, SCAN_ServiceInfo_t *srv_info)
604{
605#define str(i) (char*)(strings + i)
606
607 static char strings[14][256];
608
609 if (srv_info->src != FE_ANALOG) {
610 int standard = result->start_para->dtv_para.standard;
611 int mode = result->start_para->dtv_para.mode;
612
613 /* Transform service types for different dtv standards */
614 if (standard != AM_SCAN_DTV_STD_ATSC) {
615 if (srv_info->srv_type == 0x1)
616 srv_info->srv_type = AM_SCAN_SRV_DTV;
617 else if (srv_info->srv_type == 0x2)
618 srv_info->srv_type = AM_SCAN_SRV_DRADIO;
619 } else {
620 if (srv_info->srv_type == 0x2)
621 srv_info->srv_type = AM_SCAN_SRV_DTV;
622 else if (srv_info->srv_type == 0x3)
623 srv_info->srv_type = AM_SCAN_SRV_DRADIO;
624 }
625
626 /* if video valid, set this program to tv type,
627 * if audio valid, but video not found, set it to radio type,
628 * if both invalid, but service_type found in SDT/VCT, set to unknown service,
629 * this mechanism is OPTIONAL
630 */
631 if (srv_info->vid < 0x1fff) {
632 srv_info->srv_type = AM_SCAN_SRV_DTV;
633 } else if (srv_info->aud_info.audio_count > 0) {
634 srv_info->srv_type = AM_SCAN_SRV_DRADIO;
635 } else if (srv_info->srv_type == AM_SCAN_SRV_DTV ||
636 srv_info->srv_type == AM_SCAN_SRV_DRADIO) {
637 srv_info->srv_type = AM_SCAN_SRV_UNKNOWN;
638 }
639 /* Skip program for FTA mode */
640 if (srv_info->scrambled_flag && (mode & AM_SCAN_DTVMODE_FTA)) {
641 LOGD( "Skip program '%s' for FTA mode", srv_info->name);
642 return;
643 }
644
645 /* Skip program for service_type mode */
646 if (srv_info->srv_type == AM_SCAN_SRV_DTV && (mode & AM_SCAN_DTVMODE_NOTV)) {
647 LOGD( "Skip program '%s' for NO-TV mode", srv_info->name);
648 return;
649 }
650 if (srv_info->srv_type == AM_SCAN_SRV_DRADIO && (mode & AM_SCAN_DTVMODE_NORADIO)) {
651 LOGD( "Skip program '%s' for NO-RADIO mode", srv_info->name);
652 return;
653 }
654
655 /* Set default name to tv/radio program if no name specified */
656 if (!strcmp(srv_info->name, "") &&
657 (srv_info->srv_type == AM_SCAN_SRV_DTV ||
658 srv_info->srv_type == AM_SCAN_SRV_DRADIO)) {
659 strcpy(srv_info->name, "xxxNo Name");
660 }
661 }
662}
663
664void CTvScanner::scan_store_dvb_ts_evt_service(SCAN_ServiceInfo_t *srv)
665{
666 LOGD("scan_store_dvb_ts_evt_service freq:%d, sid:%d", m_s_Scanner->mCurEv.mFrequency, srv->srv_id);
667 m_s_Scanner->mCurEv.clear();
668 m_s_Scanner->mCurEv.mServiceId = srv->srv_id;
669 strncpy(m_s_Scanner->mCurEv.mProgramName, srv->name, 1024);
670 m_s_Scanner->mCurEv.mprogramType = srv->srv_type;
671 m_s_Scanner->mCurEv.mVid = srv->vid;
672 m_s_Scanner->mCurEv.mVfmt = srv->vfmt;
673 m_s_Scanner->mCurEv.mAcnt = srv->aud_info.audio_count;
674 for (int i = 0; i < srv->aud_info.audio_count; i++) {
675 m_s_Scanner->mCurEv.mAid[i] = srv->aud_info.audios[i].pid;
676 m_s_Scanner->mCurEv.mAfmt[i] = srv->aud_info.audios[i].fmt;
677 strncpy(m_s_Scanner->mCurEv.mAlang[i], srv->aud_info.audios[i].lang, 10);
678 m_s_Scanner->mCurEv.mAtype[i] = srv->aud_info.audios[i].audio_type;
679 }
680 m_s_Scanner->mCurEv.mPcr = srv->pcr_pid;
681 m_s_Scanner->mCurEv.mScnt = srv->sub_info.subtitle_count;
682 for (int i = 0; i < srv->sub_info.subtitle_count; i++) {
683 m_s_Scanner->mCurEv.mStype[i] = TYPE_DVB_SUBTITLE;
684 m_s_Scanner->mCurEv.mSid[i] = srv->sub_info.subtitles[i].pid;
685 m_s_Scanner->mCurEv.mSstype[i] = srv->sub_info.subtitles[i].type;
686 m_s_Scanner->mCurEv.mSid1[i] = srv->sub_info.subtitles[i].comp_page_id;
687 m_s_Scanner->mCurEv.mSid2[i] = srv->sub_info.subtitles[i].anci_page_id;
688 strncpy(m_s_Scanner->mCurEv.mSlang[i], srv->sub_info.subtitles[i].lang, 10);
689 }
690 int scnt = m_s_Scanner->mCurEv.mScnt;
691 for (int i = 0; i < srv->ttx_info.teletext_count; i++) {
692 if (srv->ttx_info.teletexts[i].type == 0x2 ||
693 srv->ttx_info.teletexts[i].type == 0x5) {
694 if (scnt >= (int)(sizeof(m_s_Scanner->mCurEv.mStype) / sizeof(int)))
695 break;
696 m_s_Scanner->mCurEv.mStype[scnt] = TYPE_DTV_TELETEXT;
697 m_s_Scanner->mCurEv.mSid[scnt] = srv->ttx_info.teletexts[i].pid;
698 m_s_Scanner->mCurEv.mSstype[scnt] = srv->ttx_info.teletexts[i].type;
699 m_s_Scanner->mCurEv.mSid1[scnt] = srv->ttx_info.teletexts[i].magazine_no;
700 m_s_Scanner->mCurEv.mSid2[scnt] = srv->ttx_info.teletexts[i].page_no;
701 strncpy(m_s_Scanner->mCurEv.mSlang[scnt], srv->ttx_info.teletexts[i].lang, 10);
702 scnt++;
703 }
704 }
705 m_s_Scanner->mCurEv.mScnt = scnt;
706
707 m_s_Scanner->mCurEv.mMSG[0] = '\0';
708
709 m_s_Scanner->mCurEv.mType = ScannerEvent::EVENT_DTV_PROG_DATA;
710 m_s_Scanner->sendEvent(m_s_Scanner->mCurEv);
711}
712
713void CTvScanner::scan_store_dvb_ts(AM_SCAN_Result_t *result, AM_SCAN_TS_t *ts)
714{
715 dvbpsi_pmt_t *pmt;
716 dvbpsi_pmt_es_t *es;
717 dvbpsi_descriptor_t *descr;
718 int src = result->start_para->dtv_para.source;
719 int mode = result->start_para->dtv_para.mode;
720 int net_dbid = -1, dbid = -1, orig_net_id = -1, satpara_dbid = -1;
721 char selbuf[256];
722 char insbuf[400];
723 AM_Bool_t store = AM_TRUE;
724 dvbpsi_pat_t *valid_pat = NULL;
725 uint8_t plp_id;
726 SCAN_ServiceInfo_t srv_info;
727
728 valid_pat = get_valid_pats(ts);
729 if (valid_pat == NULL) {
730 LOGD("No PAT found in ts, will not store to dbase");
731 return;
732 }
733
734 LOGD("@@ TS: src %d @@", src);
735
736 scan_process_ts_info(result, ts, &m_s_Scanner->mCurEv);
737
738 if (ts->digital.pmts || (IS_DVBT2_TS(ts->digital.fend_para) && ts->digital.dvbt2_data_plp_num > 0)) {
739 int loop_count, lc;
740 dvbpsi_sdt_t *sdt_list;
741 dvbpsi_pmt_t *pmt_list;
742 dvbpsi_pat_t *pat_list;
743
744 /* For DVB-T2, search for each PLP, else search in current TS*/
745 loop_count = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plp_num : 1;
746 LOGD("plp num %d", loop_count);
747
748 for (lc = 0; lc < loop_count; lc++) {
749 pat_list = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plps[lc].pats : ts->digital.pats;
750 pmt_list = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plps[lc].pmts : ts->digital.pmts;
751 sdt_list = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plps[lc].sdts : ts->digital.sdts;
752 plp_id = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plps[lc].id : -1;
753 LOGD("plp_id %d", plp_id);
754
755 AM_SI_LIST_BEGIN(pmt_list, pmt) {
756 scan_init_service_info(&srv_info);
757 srv_info.satpara_dbid = satpara_dbid;
758 srv_info.srv_id = pmt->i_program_number;
759 srv_info.src = src;
760 srv_info.pmt_pid = get_pmt_pid(pat_list, pmt->i_program_number);
761 srv_info.pcr_pid = pmt->i_pcr_pid;
762 srv_info.plp_id = plp_id;
763
764 /* looking for CA descr */
765 if (! srv_info.scrambled_flag) {
766 scan_extract_ca_scrambled_flag(pmt->p_first_descriptor, &srv_info.scrambled_flag);
767 }
768
769 AM_SI_LIST_BEGIN(pmt->p_first_es, es) {
770 AM_SI_ExtractAVFromES(es, &srv_info.vid, &srv_info.vfmt, &srv_info.aud_info);
771
772 if (store) {
773 AM_SI_ExtractDVBSubtitleFromES(es, &srv_info.sub_info);
774 AM_SI_ExtractDVBTeletextFromES(es, &srv_info.ttx_info);
775 }
776
777 if (! srv_info.scrambled_flag)
778 scan_extract_ca_scrambled_flag(es->p_first_descriptor, &srv_info.scrambled_flag);
779 }
780 AM_SI_LIST_END()
781
782 scan_extract_srv_info_from_sdt(result, sdt_list, &srv_info);
783
784 /*Store this service*/
785 scan_update_service_info(result, &srv_info);
786
787 scan_store_dvb_ts_evt_service(&srv_info);
788
789 }
790 AM_SI_LIST_END()
791
792 /* All programs in PMTs added, now trying the programs in SDT but NOT in PMT */
793 dvbpsi_sdt_service_t *srv;
794 dvbpsi_sdt_t *sdt;
795
796 AM_SI_LIST_BEGIN(ts->digital.sdts, sdt) {
797 AM_SI_LIST_BEGIN(sdt->p_first_service, srv) {
798 AM_Bool_t found_in_pmt = AM_FALSE;
799
800 /* Is already added in PMT? */
801 AM_SI_LIST_BEGIN(ts->digital.pmts, pmt)
802 if (srv->i_service_id == pmt->i_program_number) {
803 found_in_pmt = AM_TRUE;
804 break;
805 }
806 AM_SI_LIST_END()
807
808 if (found_in_pmt)
809 continue;
810
811 scan_init_service_info(&srv_info);
812 srv_info.satpara_dbid = satpara_dbid;
813 srv_info.srv_id = srv->i_service_id;
814 srv_info.src = src;
815
816 scan_extract_srv_info_from_sdt(result, sdt_list, &srv_info);
817
818 scan_update_service_info(result, &srv_info);
819
820 /*as no pmt for this srv, set type to data for invisible*/
821 srv_info.srv_type = 0;
822
823 scan_store_dvb_ts_evt_service(&srv_info);
824
825 }
826 AM_SI_LIST_END()
827 }
828 AM_SI_LIST_END()
829
830 }
831 }
832}
833
834void CTvScanner::dtv_scan_store(AM_SCAN_Result_t *result)
835{
836 AM_SCAN_TS_t *ts;
837
838 LOGD("Storing tses ...");
839
840 AM_SI_LIST_BEGIN(result->tses, ts) {
841 scan_store_dvb_ts(result, ts);
842 }
843 AM_SI_LIST_END()
844}
845
846int CTvScanner::manualDtmbScan(int beginFreq, int endFreq, int modulation)
847{
848 stopScan();
849
850 if (!mbScanStart) { //not start or stop
851 AM_SCAN_CreatePara_t para;
852 AM_DMX_OpenPara_t dmx_para;
853 AM_SCAN_Handle_t handle = 0;
854 int i;
855 // Create the scan
856 memset(&para, 0, sizeof(para));
857
858 para.fend_dev_id = 0;//default
859 para.mode = AM_SCAN_MODE_DTV_ATV;//DTV
860 para.atv_para.mode = AM_SCAN_ATVMODE_NONE;
861 para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL;
862 para.dtv_para.source = FE_DTMB;//fe_type
863 para.dtv_para.dmx_dev_id = 0;//default 0
864
865 Vector<sp<CTvChannel> > vcp;
866 CTvRegion::getChannelListByNameAndFreqRange((char *)"CHINA,Default DTMB ALL", beginFreq, endFreq, vcp);
867 int size = vcp.size();
868
869 //@author:hao.fu
870 if (size == 0) {
871 return -1;
872 }
873
874 if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
875 return -1;
876
877 for (i = 0; i < size; i++) {
878 para.dtv_para.fe_paras[i].m_type = 5;//MODE_DTMB
879 para.dtv_para.fe_paras[i].dtmb.para.frequency = vcp[i]->getFrequency();
880 para.dtv_para.fe_paras[i].dtmb.para.inversion = INVERSION_OFF;
881 para.dtv_para.fe_paras[i].dtmb.para.u.ofdm.bandwidth = (fe_bandwidth_t)(vcp[i]->getBandwidth());
882 if (modulation == -1)
883 para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation());
884 else
885 para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)modulation;
886 }
887
888 para.dtv_para.fe_cnt = size;
889 para.dtv_para.resort_all = AM_FALSE;
890 para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
891 para.store_cb = dtv_scan_store;
892
893
894 memset(&dmx_para, 0, sizeof(dmx_para));
895 AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
896
897 if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) {
898 AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
899 tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
900 }
901
902 // Start Scan
903 if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
904 LOGD("SCAN CREATE fail");
905 handle = NULL;
906 } else {
907 mScanHandle = handle;
908 AM_SCAN_SetUserData(handle, (void *)this);
909 AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
910 AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
911 if (AM_SCAN_Start(handle) != AM_SUCCESS) {
912 AM_SCAN_Destroy(handle, AM_FALSE);
913 AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
914 AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
915 handle = NULL;
916 }
917 }
918 if (para.atv_para.fe_paras != NULL)
919 free(para.atv_para.fe_paras);
920 if (para.dtv_para.fe_paras != NULL)
921 free(para.dtv_para.fe_paras);
922
923 if (handle == NULL) {
924 return -1;
925 }
926 mbScanStart = true;//start call ok
927 } else {
928 LOGD("scanning and not stop");
929 }
930 return 0;
931}
932
933
934/*int CTvScanner::autoTvScan()
935{
936 stopScan();
937
938 if(!mbScanStart) { //not start or stop
939 AM_SCAN_CreatePara_t para;
940 AM_DMX_OpenPara_t dmx_para;
941 int handle = 0,i;
942 // Create the scan
943 memset(&para, 0, sizeof(para));
944
945 //strcpy(para.default_text_lang,"eng");//config
946 //strcpy(para.text_langs, "eng zho chi");//config
947 para.fend_dev_id = 0;//default
948 para.mode = AM_SCAN_MODE_DTV_ATV;//DTV
949 para.atv_para.mode = AM_SCAN_ATVMODE_NONE;
950 para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND
951 //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略
952 para.dtv_para.source = 1;//QAM
953 para.dtv_para.dmx_dev_id = 0;//default 0
954 Vector<sp<CTvChannel> > vcp;
955 //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db
956 CTvRegion::getChannelListByName("China,DVB-C allband", vcp);
957
958 int size = vcp.size();
959 LOGD("channel list size = %d", size);
960 if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
961 return -1;
962
963 //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
964
965 for (i = 0; i < size; i++) {
966 para.dtv_para.fe_paras[i].m_type = FE_QAM;
967 para.dtv_para.fe_paras[i].cable.para.frequency = vcp[i]->getFrequency();
968 para.dtv_para.fe_paras[i].cable.para.inversion = INVERSION_OFF;
969 para.dtv_para.fe_paras[i].cable.para.u.qam.symbol_rate = vcp[i]->getSymbolRate();
970 para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation());
971 }
972 //allband
973 para.dtv_para.fe_cnt = size;
974
975 para.dtv_para.resort_all = AM_FALSE;
976 para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
977 para.store_cb = NULL;
978 memset(&dmx_para, 0, sizeof(dmx_para));
979 AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
980
981 if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) {
982 AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
983 tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
984 }
985
986 // prog->dmx_id = para.dtv_para.dmx_dev_id;
987 // prog->fend_id = para.fend_dev_id;
988 // prog->mode = para.dtv_para.mode;
989 // Start Scan
990 if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
991 LOGD("SCAN CREATE fail");
992 handle = 0;
993 } else {
994 LOGD("SCAN CREATE handle = %d", handle);
995 mScanHandle = handle;
996 AM_SCAN_SetUserData(handle, (void*)this);
997 //注册搜索事件
998 AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
999 //注册信号质量通知事件
1000 //AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
1001 if (AM_SCAN_Start(handle) != AM_SUCCESS) {
1002 AM_SCAN_Destroy(handle, AM_FALSE);
1003 AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
1004 // AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
1005 handle = 0;
1006 }
1007 }
1008 if (para.atv_para.fe_paras != NULL)
1009 free(para.atv_para.fe_paras);
1010 if (para.dtv_para.fe_paras != NULL)
1011 free(para.dtv_para.fe_paras);
1012
1013 if (handle == 0) {
1014 return -1;
1015 }
1016 mbScanStart = true;//start call ok
1017 } else {
1018 LOGD("scanning and not stop");
1019 }
1020 return 0;
1021}*/
1022//only test for dtv allbland auto
1023/*int CTvScanner::startScan()
1024{
1025 stopScan();
1026
1027 if(!mbScanStart) { //not start or stop
1028 AM_SCAN_CreatePara_t para;
1029 AM_DMX_OpenPara_t dmx_para;
1030 int handle = 0,i;
1031 // Create the scan
1032 memset(&para, 0, sizeof(para));
1033
1034 //strcpy(para.default_text_lang,"eng");//config
1035 //strcpy(para.text_langs, "eng zho chi");//config
1036 para.fend_dev_id = 0;//default
1037 para.mode = AM_SCAN_MODE_DTV_ATV;//DTV
1038 para.atv_para.mode = AM_SCAN_ATVMODE_NONE;
1039 para.dtv_para.mode = 3;//DTV_MODE_ALLBAND
1040 //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略
1041 para.dtv_para.source = 1;//QAM
1042 para.dtv_para.dmx_dev_id = 0;//default 0
1043 Vector<sp<CTvChannel> > vcp;
1044 //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db
1045 CTvRegion::getChannelListByName("China,DVB-C allband", vcp);
1046
1047 int size = vcp.size();
1048 LOGD("channel list size = %d", size);
1049 if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
1050 return -1;
1051
1052 //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
1053
1054 for (i = 0; i < size; i++) {
1055 para.dtv_para.fe_paras[i].m_type = FE_QAM;
1056 para.dtv_para.fe_paras[i].cable.para.frequency = vcp[i]->getFrequency();
1057 para.dtv_para.fe_paras[i].cable.para.inversion = INVERSION_OFF;
1058 para.dtv_para.fe_paras[i].cable.para.u.qam.symbol_rate = vcp[i]->getSymbolRate();
1059 para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation());
1060 }
1061 //allband
1062 para.dtv_para.fe_cnt = size;
1063
1064 para.dtv_para.resort_all = AM_FALSE;
1065 para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
1066 para.store_cb = NULL;
1067
1068 memset(&dmx_para, 0, sizeof(dmx_para));
1069 AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
1070
1071 if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) {
1072 AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
1073 tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
1074 }
1075
1076 // prog->dmx_id = para.dtv_para.dmx_dev_id;
1077 // prog->fend_id = para.fend_dev_id;
1078 // prog->mode = para.dtv_para.mode;
1079 // Start Scan
1080 if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
1081 LOGD("SCAN CREATE fail");
1082 handle = 0;
1083 } else {
1084 mScanHandle = handle;
1085 AM_SCAN_SetUserData(handle, (void*)this);
1086 //注册搜索事件
1087 AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
1088 //注册信号质量通知事件
1089 //AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
1090 if (AM_SCAN_Start(handle) != AM_SUCCESS) {
1091 AM_SCAN_Destroy(handle, AM_FALSE);
1092 AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
1093 // AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
1094 handle = 0;
1095 }
1096 }
1097 if (para.atv_para.fe_paras != NULL)
1098 free(para.atv_para.fe_paras);
1099 if (para.dtv_para.fe_paras != NULL)
1100 free(para.dtv_para.fe_paras);
1101
1102 if (handle == 0) {
1103 return -1;
1104 }
1105 mbScanStart = true;//start call ok
1106 } else {
1107 LOGD("scanning and not stop");
1108 }
1109 return 0;
1110}*/
1111
1112
1113//only test for dtv allbland auto
1114int CTvScanner::autoDtmbScan()
1115{
1116 stopScan();
1117
1118 if (!mbScanStart) { //not start or stop
1119 AM_SCAN_CreatePara_t para;
1120 AM_DMX_OpenPara_t dmx_para;
1121 AM_SCAN_Handle_t handle = 0;
1122 // Create the scan
1123 memset(&para, 0, sizeof(para));
1124
1125 //strcpy(para.default_text_lang,"eng");//config
1126 //strcpy(para.text_langs, "local eng zho chi chs first");//config
1127 para.fend_dev_id = 0;//default
1128 para.mode = AM_SCAN_MODE_DTV_ATV;//DTV
1129 para.atv_para.mode = AM_SCAN_ATVMODE_NONE;
1130 para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND
1131 //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略
1132 para.dtv_para.source = FE_DTMB;//fe_type
1133 para.dtv_para.dmx_dev_id = 0;//default 0
1134 Vector<sp<CTvChannel> > vcp;
1135 //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db
1136 CTvRegion::getChannelListByName((char *)"CHINA,Default DTMB ALL", vcp);
1137
1138 int size = vcp.size();
1139 LOGD("channel list size = %d", size);
1140 //showboz
1141 if (size == 0) {
1142 CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml");
1143 CTvRegion::getChannelListByName((char *)"CHINA,Default DTMB ALL", vcp);
1144 size = vcp.size();
1145 }
1146
1147 if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
1148 return -1;
1149
1150 //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
1151
1152 for (int i = 0; i < size; i++) {
1153 para.dtv_para.fe_paras[i].m_type = 5;//MODE_DTMB
1154 para.dtv_para.fe_paras[i].dtmb.para.frequency = vcp[i]->getFrequency();
1155 para.dtv_para.fe_paras[i].dtmb.para.inversion = INVERSION_OFF;
1156 para.dtv_para.fe_paras[i].dtmb.para.u.ofdm.bandwidth = (fe_bandwidth_t)(vcp[i]->getBandwidth());
1157 }
1158 //allband
1159 para.dtv_para.fe_cnt = size;
1160
1161 para.dtv_para.resort_all = AM_FALSE;
1162 para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
1163 para.store_cb = dtv_scan_store;
1164
1165 memset(&dmx_para, 0, sizeof(dmx_para));
1166 AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
1167
1168 if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) {
1169 AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
1170 tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
1171 }
1172
1173 // prog->dmx_id = para.dtv_para.dmx_dev_id;
1174 // prog->fend_id = para.fend_dev_id;
1175 // prog->mode = para.dtv_para.mode;
1176 // Start Scan
1177 if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
1178 LOGD("SCAN CREATE fail");
1179 handle = NULL;
1180 } else {
1181 mScanHandle = handle;
1182 AM_SCAN_SetUserData(handle, (void *)this);
1183 //注册搜索事件
1184 AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
1185 //注册信号质量通知事件
1186 AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
1187 if (AM_SCAN_Start(handle) != AM_SUCCESS) {
1188 AM_SCAN_Destroy(handle, AM_FALSE);
1189 AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
1190 AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
1191 handle = NULL;
1192 }
1193 }
1194 if (para.atv_para.fe_paras != NULL)
1195 free(para.atv_para.fe_paras);
1196 if (para.dtv_para.fe_paras != NULL)
1197 free(para.dtv_para.fe_paras);
1198
1199 if (handle == NULL) {
1200 return -1;
1201 }
1202 mbScanStart = true;//start call ok
1203 } else {
1204 LOGD("scanning and not stop");
1205 }
1206 return 0;
1207}
1208
1209/*int CTvScanner::autoAtscScan(int attennaType,int std)
1210{
1211 stopScan();
1212
1213 if(!mbScanStart) { //not start or stop
1214 AM_SCAN_CreatePara_t para;
1215 AM_DMX_OpenPara_t dmx_para;
1216 int handle = 0,i;
1217 // Create the scan
1218 memset(&para, 0, sizeof(para));
1219
1220 //strcpy(para.default_text_lang,"eng");//config
1221 //strcpy(para.text_langs, "local eng zho chi chs first");//config
1222 para.fend_dev_id = 0;//default
1223 para.mode = AM_SCAN_MODE_ADTV;//DTV
1224 para.atv_para.mode = AM_SCAN_ATVMODE_NONE;
1225
1226
1227 para.atv_para.default_std= std;
1228
1229
1230 para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND
1231 //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略
1232 para.dtv_para.source = FE_ATSC;//fe_type
1233 para.dtv_para.dmx_dev_id = 0;//default 0
1234 para.dtv_para.resort_all = AM_TRUE;
1235 para.dtv_para.clear_source = AM_TRUE;
1236 para.dtv_para.mix_tv_radio = AM_FALSE;
1237 para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
1238 para.store_cb = NULL;
1239 //para.dtv_para.attenna = attennaType;//see dvb atsc-cnc
1240
1241 para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC;
1242
1243 mSource = para.dtv_para.source;
1244
1245 Vector<sp<CTvChannel> > vcp;
1246 //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db
1247 getAtscChannelPara(attennaType,vcp);
1248 LOGD("ANDESEN test attenna type is %d",attennaType);
1249
1250 int size = vcp.size();
1251 LOGD("channel list size = %d", size);
1252 //showboz
1253 if(size == 0) {
1254 CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml");
1255 getAtscChannelPara(attennaType,vcp);
1256 size = vcp.size();
1257 }
1258
1259 if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
1260 return -1;
1261
1262 //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
1263
1264 for (i = 0; i < size; i++) {
1265 para.dtv_para.fe_paras[i].m_type = 3;//MODE_ATSC
1266 para.dtv_para.fe_paras[i].m_logicalChannelNum = vcp[i]->getLogicalChannelNum();
1267 para.dtv_para.fe_paras[i].atsc.para.frequency = vcp[i]->getFrequency();
1268 para.dtv_para.fe_paras[i].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation());
1269 }
1270 //allband
1271 para.dtv_para.fe_cnt = size;
1272
1273 memset(&dmx_para, 0, sizeof(dmx_para));
1274 AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
1275
1276 if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) {
1277 AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
1278 tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
1279 }
1280
1281 // prog->dmx_id = para.dtv_para.dmx_dev_id;
1282 // prog->fend_id = para.fend_dev_id;
1283 // prog->mode = para.dtv_para.mode;
1284 // Start Scan
1285 if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
1286 LOGD("SCAN CREATE fail");
1287 handle = 0;
1288 } else {
1289 mScanHandle = handle;
1290 AM_SCAN_SetUserData(handle, (void*)this);
1291 //注册搜索事件
1292 AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
1293 AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
1294 //注册信号质量通知事件
1295 AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
1296 if (AM_SCAN_Start(handle) != AM_SUCCESS) {
1297 AM_SCAN_Destroy(handle, AM_FALSE);
1298 AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
1299 AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
1300 handle = 0;
1301 }
1302 }
1303 if (para.atv_para.fe_paras != NULL)
1304 free(para.atv_para.fe_paras);
1305 if (para.dtv_para.fe_paras != NULL)
1306 free(para.dtv_para.fe_paras);
1307
1308 if (handle == 0) {
1309 return -1;
1310 }
1311 mbScanStart = true;//start call ok
1312 } else {
1313 LOGD("scanning and not stop");
1314 }
1315 return 0;
1316}*/
1317
1318
1319int CTvScanner::stopScan()
1320{
1321 LOGD("StopScan");
1322 //requestExit();
1323 if (mbScanStart) { //if start ok and not stop
1324 int ret = AM_SCAN_Destroy(mScanHandle, AM_TRUE);
1325 AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
1326 AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
1327 AM_SEC_Cache_Reset(0);
1328 //stop loop
1329 LOGD("StopScan , ret=%d", ret);
1330 mbScanStart = false;//stop ok
1331 } else {
1332 LOGD("not start scan or scan stoped");
1333 }
1334 return 0;
1335}
1336
1337void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param, void *data __unused)
1338{
1339 CTvScanner *pT = NULL;
1340 long long tmpFreq = 0;
1341
1342 LOGD("evt evt:%d", event_type);
1343 AM_SCAN_GetUserData((AM_SCAN_Handle_t)dev_no, (void **)&pT);
1344 if (pT == NULL) {
1345 return;
1346 }
1347 pT->mCurEv.clear();
1348 memset(pT->mCurEv.mProgramName, '\0', sizeof(pT->mCurEv.mProgramName));
1349 memset(pT->mCurEv.mMSG, '\0', sizeof(pT->mCurEv.mMSG));
1350 if (event_type == AM_SCAN_EVT_PROGRESS) {
1351 AM_SCAN_Progress_t *evt = (AM_SCAN_Progress_t *)param;
1352 LOGD("progress evt:%d", evt->evt);
1353 switch (evt->evt) {
1354 case AM_SCAN_PROGRESS_SCAN_BEGIN:
1355 pT->mCurEv.mPercent = 0;
1356 break;
1357 case AM_SCAN_PROGRESS_NIT_BEGIN:
1358
1359 break;
1360 case AM_SCAN_PROGRESS_NIT_END:
1361
1362 break;
1363 case AM_SCAN_PROGRESS_TS_BEGIN: {
1364 AM_SCAN_TSProgress_t *tp = (AM_SCAN_TSProgress_t *)evt->data;
1365 if (tp == NULL)
1366 break;
1367 pT->mCurEv.mChannelNumber = tp->index;
1368 pT->mCurEv.mMode = tp->fend_para.m_type;
1369 pT->mCurEv.mFrequency = ((struct dvb_frontend_parameters *)(&tp->fend_para))->frequency;
1370 pT->mCurEv.mSymbolRate = tp->fend_para.cable.para.u.qam.symbol_rate;
1371 pT->mCurEv.mModulation = tp->fend_para.cable.para.u.qam.modulation;
1372 pT->mCurEv.mBandwidth = tp->fend_para.terrestrial.para.u.ofdm.bandwidth;
1373 pT->mCurEv.mOfdm_mode = tp->fend_para.terrestrial.para.u.ofdm.ofdm_mode;
1374 pT->mCurEv.mAudio = tp->fend_para.analog.para.u.analog.audmode;
1375 pT->mCurEv.mStandard = tp->fend_para.analog.para.u.analog.std;
1376 pT->mCurEv.mSat_polarisation = tp->fend_para.sat.polarisation;
1377 if (pT->mCurEv.mMode == FE_ANALOG) {
1378 if (pT->mSource == FE_ATSC) {
1379 pT->mCurEv.mPercent = (tp->index * 100) / tp->total;
1380 } else {
1381 pT->mCurEv.mPercent = 0;
1382 }
1383 } else {
1384 pT->mCurEv.mPercent = (tp->index * 100) / tp->total;
1385 }
1386
1387 if (pT->mCurEv.mTotalChannelCount == 0)
1388 pT->mCurEv.mTotalChannelCount = tp->total;
1389 if (pT->mCurEv.mPercent >= 100)
1390 pT->mCurEv.mPercent = 99;
1391
1392 pT->mCurEv.mLockedStatus = 0;
1393 pT->mCurEv.mStrength = 0;
1394 pT->mCurEv.mSnr = 0;
1395 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1396
1397 pT->sendEvent(pT->mCurEv);
1398 }
1399 break;
1400 case AM_SCAN_PROGRESS_TS_END: {
1401 /*pT->mCurEv.mLockedStatus = 0;
1402 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1403 pT->sendEvent(pT->mCurEv);*/
1404 }
1405 break;
1406
1407 case AM_SCAN_PROGRESS_PAT_DONE: /*{
1408 if(pT->mCurEv.mTotalChannelCount == 1) {
1409 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1410 pT->sendEvent(pT->mCurEv);
1411 }
1412 }*/
1413 break;
1414 case AM_SCAN_PROGRESS_SDT_DONE: /*{
1415 dvbpsi_sdt_t *sdts = (dvbpsi_sdt_t *)evt->data;
1416 dvbpsi_sdt_t *sdt;
1417
1418 if (pT->mCurEv.mTotalChannelCount == 1) {
1419 pT->mCurEv.mPercent += 25;
1420 if (pT->mCurEv.mPercent >= 100)
1421 pT->mCurEv.mPercent = 99;
1422 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1423
1424 pT->sendEvent(pT->mCurEv);
1425 }
1426 }*/
1427 break;
1428 case AM_SCAN_PROGRESS_CAT_DONE: /*{
1429 dvbpsi_cat_t *cat = (dvbpsi_cat_t *)evt->data;
1430 if (pT->mCurEv.mTotalChannelCount == 1) {
1431 pT->mCurEv.mPercent += 25;
1432 if (pT->mCurEv.mPercent >= 100)
1433 pT->mCurEv.mPercent = 99;
1434
1435 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1436
1437 pT->sendEvent(pT->mCurEv);
1438 }
1439 }*/
1440 break;
1441 case AM_SCAN_PROGRESS_PMT_DONE: /*{
1442 dvbpsi_pmt_t *pmt = (dvbpsi_pmt_t *)evt->data;
1443 if (pT->mCurEv.mTotalChannelCount == 1) {
1444 pT->mCurEv.mPercent += 25;
1445 if (pT->mCurEv.mPercent >= 100)
1446 pT->mCurEv.mPercent = 99;
1447
1448 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1449 pT->sendEvent(pT->mCurEv);
1450 }
1451 }*/
1452 break;
1453 case AM_SCAN_PROGRESS_MGT_DONE: {
1454 mgt_section_info_t *mgt = (mgt_section_info_t *)evt->data;
1455
1456 if (pT->mCurEv.mTotalChannelCount == 1) {
1457 pT->mCurEv.mPercent += 10;
1458 if (pT->mCurEv.mPercent >= 100)
1459 pT->mCurEv.mPercent = 99;
1460
1461 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1462
1463 pT->sendEvent(pT->mCurEv);
1464 }
1465 }
1466 break;
1467 case AM_SCAN_PROGRESS_VCT_DONE: {
1468 /*ATSC TVCT*/
1469 if (pT->mCurEv.mTotalChannelCount == 1) {
1470 pT->mCurEv.mPercent += 30;
1471 if (pT->mCurEv.mPercent >= 100)
1472 pT->mCurEv.mPercent = 99;
1473 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1474
1475 pT->sendEvent(pT->mCurEv);
1476 }
1477 }
1478 break;
1479 case AM_SCAN_PROGRESS_NEW_PROGRAM: {
1480 /* Notify the new searched programs */
1481 AM_SCAN_ProgramProgress_t *pp = (AM_SCAN_ProgramProgress_t *)evt->data;
1482 if (pp != NULL) {
1483 pT->mCurEv.mprogramType = pp->service_type;
1484 snprintf(pT->mCurEv.mProgramName, sizeof(pT->mCurEv.mProgramName), "%s", pp->name);
1485
1486 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1487
1488 pT->sendEvent(pT->mCurEv);
1489 }
1490 }
1491 break;
1492 case AM_SCAN_PROGRESS_BLIND_SCAN: {
1493 AM_SCAN_DTVBlindScanProgress_t *bs_prog = (AM_SCAN_DTVBlindScanProgress_t *)evt->data;
1494
1495 if (bs_prog) {
1496 pT->mCurEv.mPercent = bs_prog->progress;
1497
1498 snprintf(pT->mCurEv.mMSG, sizeof(pT->mCurEv.mMSG), "%s/%s %dMHz",
1499 bs_prog->polar == AM_FEND_POLARISATION_H ? "H" : "V",
1500 bs_prog->lo == AM_FEND_LOCALOSCILLATORFREQ_L ? "L-LOF" : "H-LOF",
1501 bs_prog->freq / 1000);
1502
1503 pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_PROGRESS;
1504
1505 pT->sendEvent(pT->mCurEv);
1506
1507 if (bs_prog->new_tp_cnt > 0) {
1508 int i = 0;
1509 for (i = 0; i < bs_prog->new_tp_cnt; i++) {
1510 LOGD("====New tp: %dkS/s %d====", bs_prog->new_tps[i].frequency,
1511 bs_prog->new_tps[i].u.qpsk.symbol_rate);
1512
1513 pT->mCurEv.mFrequency = bs_prog->new_tps[i].frequency;
1514 pT->mCurEv.mSymbolRate = bs_prog->new_tps[i].u.qpsk.symbol_rate;
1515 pT->mCurEv.mSat_polarisation = bs_prog->polar;
1516
1517 pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_NEWCHANNEL;
1518
1519 pT->sendEvent(pT->mCurEv);
1520 }
1521 }
1522 if (bs_prog->progress >= 100) {
1523
1524 pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_END;
1525
1526 pT->sendEvent(pT->mCurEv);
1527
1528 pT->mCurEv.mPercent = 0;
1529 }
1530 }
1531 }
1532 break;
1533 case AM_SCAN_PROGRESS_STORE_BEGIN: {
1534 pT->mCurEv.mType = ScannerEvent::EVENT_STORE_BEGIN;
1535 pT->mCurEv.mLockedStatus = 0;
1536 pT->sendEvent(pT->mCurEv);
1537 }
1538 break;
1539 case AM_SCAN_PROGRESS_STORE_END: {
1540 pT->mCurEv.mLockedStatus = 0;
1541 pT->mCurEv.mType = ScannerEvent::EVENT_STORE_END;
1542 pT->sendEvent(pT->mCurEv);
1543 }
1544 break;
1545 case AM_SCAN_PROGRESS_SCAN_END: {
1546 pT->mCurEv.mPercent = 100;
1547 pT->mCurEv.mLockedStatus = 0;
1548 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_END;
1549 pT->sendEvent(pT->mCurEv);
1550 }
1551 break;
1552 case AM_SCAN_PROGRESS_SCAN_EXIT: {
1553 pT->mCurEv.mLockedStatus = 0;
1554 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_EXIT;
1555 pT->sendEvent(pT->mCurEv);
1556 }
1557 break;
1558 case AM_SCAN_PROGRESS_ATV_TUNING: {
1559 pT->mCurEv.mFrequency = (int)evt->data;
1560 pT->mCurEv.mLockedStatus = 0;
1561 tmpFreq = (pT->mCurEv.mFrequency - pT->mCurScanStartFreq) / 1000000;
1562 pT->mCurEv.mPercent = tmpFreq * 100UL / ((pT->mCurScanEndFreq - pT->mCurScanStartFreq) / 1000000);
1563 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1564 pT->sendEvent(pT->mCurEv);
1565 }
1566 break;
1567
1568 default:
1569 break;
1570 }
1571 } else if (event_type == AM_SCAN_EVT_SIGNAL) {
1572 AM_SCAN_DTVSignalInfo_t *evt = (AM_SCAN_DTVSignalInfo_t *)param;
1573 //pT->mCurEv.mprogramType = 0xff;
1574 pT->mCurEv.mFrequency = (int)evt->frequency;
1575 pT->mCurEv.mLockedStatus = (evt->locked ? 1 : 0);
1576
1577 if (pT->mCurEv.mMode == FE_ANALOG && evt->locked)//trick here for atv new prog
1578 pT->mCurEv.mLockedStatus |= 0x10;
1579
1580 pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
1581 if (pT->mCurEv.mMode != FE_ANALOG && evt->locked) {
1582 pT->mCurEv.mStrength = evt->strength;
1583 pT->mCurEv.mSnr = evt->snr;
1584 } else {
1585 pT->mCurEv.mStrength = 0;
1586 pT->mCurEv.mSnr = 0;
1587 }
1588
1589 //if (pT->mCurEv.mMode == FE_ANALOG)
1590 pT->sendEvent(pT->mCurEv);
1591
1592 pT->mCurEv.mLockedStatus &= ~0x10;
1593 }
1594}
1595
1596void CTvScanner::tv_scan_reconnect_dmx_to_fend(int dmx_no, int fend_no)
1597{
1598 AM_DMX_Source_t src;
1599
1600 if (AM_FEND_GetTSSource(fend_no, &src) == AM_SUCCESS) {
1601 LOGD("Set demux%d source to %d", dmx_no, src);
1602 AM_DMX_SetSource(dmx_no, src);
1603 } else {
1604 LOGD("Cannot get frontend ts source!!");
1605 }
1606}
1607
1608int CTvScanner::getAtscChannelPara(int attennaType, Vector<sp<CTvChannel> > &vcp)
1609{
1610 switch (attennaType) { //region name should be remove to config file and read here
1611 case 1:
1612 CTvRegion::getChannelListByName((char *)"U.S.,ATSC Air", vcp);
1613 break;
1614 case 2:
1615 CTvRegion::getChannelListByName((char *)"U.S.,ATSC Cable Standard", vcp);
1616 break;
1617 case 3:
1618 CTvRegion::getChannelListByName((char *)"U.S.,ATSC Cable IRC", vcp);
1619 break;
1620 case 4:
1621 CTvRegion::getChannelListByName((char *)"U.S.,ATSC Cable HRC", vcp);
1622 break;
1623 default:
1624 return -1;
1625 }
1626
1627 return 0;
1628}
1629
1630void CTvScanner::sendEvent(ScannerEvent &evt)
1631{
1632 if (mpObserver) {
1633 if (evt.mType != ScannerEvent::EVENT_DTV_PROG_DATA) {
1634 evt.mAcnt = 0;//avoid invalid count confused the array.
1635 evt.mScnt = 0;
1636 }
1637 mpObserver->onEvent(evt);
1638 }
1639}
1640
1641