blob: e8421c7657c0f56a6ba2e1afa6e7f3de87301b0b
1 | #define LOG_TAG "CAv" |
2 | |
3 | #include "CAv.h" |
4 | #include "../tvutils/tvutils.h" |
5 | #include "../tvconfig/tvconfig.h" |
6 | #include <stdio.h> |
7 | #include <unistd.h> |
8 | #include <sys/types.h> |
9 | #include <sys/stat.h> |
10 | #include <sys/ioctl.h> |
11 | #include <fcntl.h> |
12 | #include <amstream.h> |
13 | |
14 | CAv::CAv() |
15 | { |
16 | mpObserver = NULL; |
17 | mTvPlayDevId = 0; |
18 | mCurVideoLayerMuteState = -1; |
19 | mCurDisableVideoColor = -1; |
20 | mFdAmVideo = -1; |
21 | } |
22 | CAv::~CAv() |
23 | { |
24 | |
25 | } |
26 | int CAv::SetVideoWindow(int x, int y, int w, int h) |
27 | { |
28 | return AM_AV_SetVideoWindow (mTvPlayDevId, x, y, w, h ); |
29 | } |
30 | |
31 | int CAv::Open() |
32 | { |
33 | AM_AV_OpenPara_t para_av; |
34 | memset ( ¶_av, 0, sizeof ( AM_AV_OpenPara_t ) ); |
35 | int rt = AM_AV_Open ( mTvPlayDevId, ¶_av ); |
36 | if ( rt != AM_SUCCESS ) { |
37 | LOGD ( "%s, dvbplayer_open fail %d %d\n!" , __FUNCTION__, mTvPlayDevId, rt ); |
38 | return -1; |
39 | } |
40 | |
41 | //open audio channle output |
42 | AM_AOUT_OpenPara_t aout_para; |
43 | memset ( &aout_para, 0, sizeof ( AM_AOUT_OpenPara_t ) ); |
44 | rt = AM_AOUT_Open ( 0, &aout_para ); |
45 | |
46 | if ( AM_SUCCESS != rt ) { |
47 | LOGD ( "%s, BUG: CANN'T OPEN AOUT\n", __FUNCTION__); |
48 | } |
49 | // |
50 | mFdAmVideo = open ( PATH_VIDEO_AMVIDEO, O_RDWR ); |
51 | if ( mFdAmVideo < 0 ) { |
52 | LOGE ( "mFdAmVideo < 0, error(%s)!\n", strerror ( errno ) ); |
53 | return -1; |
54 | } |
55 | /*Register events*/ |
56 | AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_AV_NO_DATA, av_evt_callback, this ); |
57 | AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_AV_DATA_RESUME, av_evt_callback, this ); |
58 | AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_VIDEO_SCAMBLED, av_evt_callback, this ); |
59 | AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_AUDIO_SCAMBLED, av_evt_callback, this ); |
60 | AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_VIDEO_NOT_SUPPORT, av_evt_callback, this ); |
61 | |
62 | return rt; |
63 | } |
64 | |
65 | int CAv::Close() |
66 | { |
67 | int iRet; |
68 | iRet = AM_AV_Close ( mTvPlayDevId ); |
69 | iRet = AM_AOUT_Close ( mTvPlayDevId ); |
70 | if (mFdAmVideo > 0) { |
71 | close(mFdAmVideo); |
72 | mFdAmVideo = -1; |
73 | } |
74 | return iRet; |
75 | } |
76 | |
77 | |
78 | int CAv::GetVideoStatus(AM_AV_VideoStatus_t *status) |
79 | { |
80 | return AM_AV_GetVideoStatus(mTvPlayDevId, status); |
81 | } |
82 | |
83 | int CAv::SwitchTSAudio(int apid, AM_AV_AFormat_t afmt) |
84 | { |
85 | return AM_AV_SwitchTSAudio (mTvPlayDevId, ( uint16_t ) apid, ( AM_AV_AFormat_t ) afmt ); |
86 | } |
87 | |
88 | int CAv::ResetAudioDecoder() |
89 | { |
90 | return AM_AV_ResetAudioDecoder ( mTvPlayDevId ); |
91 | } |
92 | |
93 | int CAv::SetTSSource(AM_AV_TSSource_t ts_source) |
94 | { |
95 | return AM_AV_SetTSSource ( mTvPlayDevId, ts_source ); |
96 | } |
97 | |
98 | int CAv::StartTS(uint16_t vpid, uint16_t apid, AM_AV_VFormat_t vfmt, AM_AV_AFormat_t afmt) |
99 | { |
100 | return AM_AV_StartTS ( mTvPlayDevId, vpid, apid, ( AM_AV_VFormat_t ) vfmt, ( AM_AV_AFormat_t ) afmt ); |
101 | } |
102 | |
103 | int CAv::StopTS() |
104 | { |
105 | return AM_AV_StopTS (mTvPlayDevId); |
106 | } |
107 | |
108 | int CAv::AudioGetOutputMode(AM_AOUT_OutputMode_t *mode) |
109 | { |
110 | return AM_AOUT_GetOutputMode ( 0, mode ); |
111 | } |
112 | |
113 | int CAv::AudioSetOutputMode(AM_AOUT_OutputMode_t mode) |
114 | { |
115 | return AM_AOUT_SetOutputMode ( 0, mode ); |
116 | } |
117 | |
118 | int CAv::EnableVideoBlackout() |
119 | { |
120 | return AM_AV_EnableVideoBlackout(mTvPlayDevId); |
121 | } |
122 | |
123 | int CAv::DisableVideoBlackout() |
124 | { |
125 | return AM_AV_DisableVideoBlackout(mTvPlayDevId); |
126 | } |
127 | |
128 | int CAv::DisableVideoWithBlueColor() |
129 | { |
130 | LOGD("DisableVideoWithBlueColor"); |
131 | if (mCurVideoLayerMuteState == 1 && mCurDisableVideoColor == DISABLE_VIDEO_COLOR_BLUE) { |
132 | LOGD("video is disable with blue, return"); |
133 | return 0; |
134 | } |
135 | mCurVideoLayerMuteState = 1; |
136 | mCurDisableVideoColor = DISABLE_VIDEO_COLOR_BLUE; |
137 | SetVideoScreenColor ( 0, 41, 240, 110 ); // Show blue with vdin0, postblending disabled |
138 | return AM_AV_DisableVideo(mTvPlayDevId); |
139 | } |
140 | |
141 | int CAv::DisableVideoWithBlackColor() |
142 | { |
143 | LOGD("DisableVideoWithBlackColor"); |
144 | if (mCurVideoLayerMuteState == 1 && mCurDisableVideoColor == DISABLE_VIDEO_COLOR_BLACK) { |
145 | LOGD("video is disable with black, return"); |
146 | return 0; |
147 | } |
148 | mCurDisableVideoColor = DISABLE_VIDEO_COLOR_BLACK; |
149 | mCurVideoLayerMuteState = 1; |
150 | SetVideoScreenColor ( 0, 16, 128, 128 ); // Show blue with vdin0, postblending disabled |
151 | return AM_AV_DisableVideo(mTvPlayDevId); |
152 | } |
153 | //auto enable, |
154 | int CAv::EnableVideoAuto() |
155 | { |
156 | LOGD("EnableVideo"); |
157 | if (mCurVideoLayerMuteState == 0) { |
158 | LOGD("video is enable, return"); |
159 | return 0; |
160 | } |
161 | mCurVideoLayerMuteState = 0; |
162 | SetVideoScreenColor ( 0, 16, 128, 128 ); // Show black with vdin0, postblending disabled |
163 | ClearVideoBuffer();//disable video 2 |
164 | return 0; |
165 | } |
166 | |
167 | //just enable video |
168 | int CAv::EnableVideoNow() |
169 | { |
170 | LOGD("EnableVideoNow"); |
171 | const char *config_value = NULL; |
172 | if (mCurVideoLayerMuteState == 0) { |
173 | LOGD("video is enable, return"); |
174 | return 0; |
175 | } |
176 | mCurVideoLayerMuteState = 0; |
177 | config_value = config_get_str ( CFG_SECTION_TV, CFG_BLUE_SCREEN_COLOR, "null" ); |
178 | if ( strcmp ( config_value, "black" ) == 0 ) { |
179 | } else { |
180 | SetVideoScreenColor ( 0, 16, 128, 128 ); // Show blue with vdin0, postblending disabled |
181 | } |
182 | return AM_AV_EnableVideo(mTvPlayDevId); |
183 | } |
184 | |
185 | int CAv::WaittingVideoPlaying(int minFrameCount , int waitTime ) |
186 | { |
187 | //EnableVideoNow(); |
188 | static const int COUNT_FOR_TIME = 20; |
189 | int times = waitTime / COUNT_FOR_TIME; |
190 | int ret = -1; |
191 | int i = 0; |
192 | for (i = 0; i < times; i++) { |
193 | if (videoIsPlaying(minFrameCount)) { |
194 | ret = 0; |
195 | break; |
196 | } |
197 | } |
198 | if (i == times) { |
199 | LOGD("EnableVideoWhenVideoPlaying time out!!!!!!!!!!!!!"); |
200 | ret = -2; |
201 | } |
202 | return ret; |
203 | } |
204 | |
205 | int CAv::EnableVideoWhenVideoPlaying(int minFrameCount, int waitTime) |
206 | { |
207 | int ret = WaittingVideoPlaying(minFrameCount, waitTime); |
208 | if (ret == 0) { //ok to playing |
209 | EnableVideoNow(); |
210 | } |
211 | return ret; |
212 | } |
213 | |
214 | bool CAv::videoIsPlaying(int minFrameCount) |
215 | { |
216 | int value[3] = {0}; |
217 | value[0] = getVideoFrameCount(); |
218 | usleep(20 * 1000); |
219 | value[1] = getVideoFrameCount(); |
220 | //usleep(20*1000); |
221 | //value[2] = getVideoFrameCount(); |
222 | LOGD("---videoIsPlaying framecount =%d = %d = %d", value[0], value[1], value[2]); |
223 | if (value[1] >= minFrameCount && (value[1] > value[0])) return true; |
224 | else return false; |
225 | } |
226 | |
227 | int CAv::getVideoFrameCount() |
228 | { |
229 | char buf[32]; |
230 | int fd = -1; |
231 | fd = open(PATH_FRAME_COUNT, O_RDWR); |
232 | if (fd < 0) { |
233 | LOGW("Open %s error(%s)!\n", PATH_FRAME_COUNT, strerror(errno)); |
234 | return -1; |
235 | } |
236 | read(fd, buf, sizeof(buf)); |
237 | int value = 0; |
238 | sscanf ( buf, "%d", &value ); |
239 | close ( fd ); |
240 | return value; |
241 | } |
242 | |
243 | tvin_sig_fmt_t CAv::getVideoResolutionToFmt() |
244 | { |
245 | tvin_sig_fmt_e sig_fmt = TVIN_SIG_FMT_HDMI_1920X1080P_60HZ; |
246 | int height = CFile::getFileAttrValue(SYS_VIDEO_FRAME_HEIGHT); |
247 | LOGD("---------getVideoResolutionToFmt -------- height = %d", height); |
248 | if (height <= 576) { |
249 | sig_fmt = TVIN_SIG_FMT_HDMI_720X480P_60HZ; |
250 | } else if (height > 576 && height <= 1088) { |
251 | sig_fmt = TVIN_SIG_FMT_HDMI_1920X1080P_60HZ; |
252 | } else { |
253 | sig_fmt = TVIN_SIG_FMT_HDMI_3840_2160_00HZ; |
254 | } |
255 | return sig_fmt; |
256 | } |
257 | //call disable video 2 |
258 | int CAv::ClearVideoBuffer() |
259 | { |
260 | LOGD("ClearVideoBuffer"); |
261 | return AM_AV_ClearVideoBuffer(mTvPlayDevId); |
262 | } |
263 | int CAv::SetVideoScreenColor ( int vdin_blending_mask, int y, int u, int v ) |
264 | { |
265 | FILE *fp = NULL; |
266 | unsigned long value = 0; |
267 | |
268 | value = vdin_blending_mask << 24; |
269 | |
270 | value |= ( unsigned int ) ( y << 16 ) | ( unsigned int ) ( u << 8 ) | ( unsigned int ) ( v ); |
271 | |
272 | fp = fopen ( "/sys/class/video/test_screen", "w" ); |
273 | LOGD ( "~~~fopen~~~##VPP_SetVideoScreenColor##%s : vdin_blending_mask:%d,y:%d,u:%d,v:%d ##" , "/sys/class/video/test_screen", vdin_blending_mask, y, u, v); |
274 | |
275 | |
276 | if ( fp == NULL ) { |
277 | LOGE ( "Open /sys/class/video/test_screen error(%s)!\n", strerror ( errno ) ); |
278 | return -1; |
279 | } |
280 | |
281 | fprintf ( fp, "0x%lx", ( unsigned long ) value ); |
282 | |
283 | fclose ( fp ); |
284 | fp = NULL; |
285 | |
286 | return 0; |
287 | } |
288 | |
289 | int CAv::getVideoDisableValue() |
290 | { |
291 | LOGD("this fun is empty!!!!!!!!"); |
292 | return 0; |
293 | } |
294 | |
295 | int CAv::SetVideoLayerDisable ( int value ) |
296 | { |
297 | FILE *fp = NULL; |
298 | |
299 | fp = fopen ( "/sys/class/video/disable_video", "w" ); |
300 | LOGD ( "~~~fopen~~~##VPP_SetVideoLayerDisable##%s : %d ##" , "/sys/class/video/disable_video", value); |
301 | |
302 | if ( fp == NULL ) { |
303 | LOGE ( "Open /sys/class/video/disable_video error(%s)!\n", strerror ( errno ) ); |
304 | return -1; |
305 | } |
306 | |
307 | fprintf ( fp, "%d", value ); |
308 | |
309 | fclose ( fp ); |
310 | fp = NULL; |
311 | |
312 | return 0; |
313 | } |
314 | |
315 | |
316 | int CAv::setVideoScreenMode ( int value ) |
317 | { |
318 | FILE *fp = fopen ( "/sys/class/video/screen_mode", "w" ); |
319 | LOGD ( "setVideoScreenMode %d ##" , value); |
320 | if ( fp == NULL ) { |
321 | LOGE ( "Open /sys/class/video/screen_mode error(%s)!\n", strerror ( errno ) ); |
322 | return -1; |
323 | } |
324 | fprintf ( fp, "%d", value ); |
325 | fclose ( fp ); |
326 | return 0; |
327 | } |
328 | |
329 | int CAv::setVideoAxis ( int h, int v, int width, int height ) |
330 | { |
331 | FILE *fp = NULL; |
332 | fp = fopen ( "/sys/class/video/axis", "w" ); |
333 | LOGD ( "setVideoAxis##%s : %d %d %d %d ##" , "/sys/class/video/axis", h, v, width, height); |
334 | |
335 | if ( fp == NULL ) { |
336 | LOGE ( "Open /sys/class/video/axis ERROR(%s)!!\n", strerror ( errno ) ); |
337 | return -1; |
338 | } |
339 | fprintf ( fp, "%d %d %d %d", h, v, width, height ); |
340 | fclose ( fp ); |
341 | return 0; |
342 | } |
343 | |
344 | int CAv::getVideoScreenMode() |
345 | { |
346 | int value; |
347 | FILE *fp = fopen ( "/sys/class/video/screen_mode", "r+" ); |
348 | |
349 | if ( fp == NULL ) { |
350 | LOGE ( "Open /sys/class/video/screen_mode error(%s)!\n", strerror ( errno ) ); |
351 | return -1; |
352 | } |
353 | fscanf ( fp, "%d", &value ); |
354 | fclose ( fp ); |
355 | return value; |
356 | } |
357 | |
358 | video_display_resolution_t CAv::getVideoDisplayResolution() |
359 | { |
360 | char attrV[64]; |
361 | memset (attrV, 0x0, 64); |
362 | Tv_Utils_GetFileAttrStr ( "/sys/class/video/device_resolution", 64, attrV ); |
363 | video_display_resolution_t resolution; |
364 | if (strncasecmp(attrV, "1366x768", strlen ("1366x768")) == 0) { |
365 | resolution = VPP_DISPLAY_RESOLUTION_1366X768; |
366 | } else if (strncasecmp(attrV, "3840x2160", strlen ("3840x2160")) == 0) { |
367 | resolution = VPP_DISPLAY_RESOLUTION_3840X2160; |
368 | } else if (strncasecmp(attrV, "1920x1080", strlen ("1920x1080")) == 0) { |
369 | resolution = VPP_DISPLAY_RESOLUTION_1920X1080; |
370 | } else { |
371 | LOGW("video display resolution is = (%s) not define , default it", attrV); |
372 | resolution = VPP_DISPLAY_RESOLUTION_1920X1080; |
373 | } |
374 | |
375 | return resolution; |
376 | } |
377 | |
378 | void CAv::av_evt_callback ( long dev_no, int event_type, void *param, void *user_data ) |
379 | { |
380 | CAv *pAv = ( CAv * ) user_data; |
381 | if (NULL == pAv ) { |
382 | LOGD ( "%s, ERROR : av_evt_callback NULL == pTv\n", __FUNCTION__ ); |
383 | return ; |
384 | } |
385 | if ( pAv->mpObserver == NULL ) { |
386 | LOGD ( "%s, ERROR : mpObserver NULL == mpObserver\n", __FUNCTION__ ); |
387 | return; |
388 | } |
389 | switch ( event_type ) { |
390 | case AM_AV_EVT_AV_NO_DATA: |
391 | pAv->mCurAvEvent.type = AVEvent::EVENT_AV_STOP; |
392 | pAv->mCurAvEvent.param = ( int )param; |
393 | pAv->mpObserver->onEvent(pAv->mCurAvEvent); |
394 | break; |
395 | case AM_AV_EVT_AV_DATA_RESUME: |
396 | pAv->mCurAvEvent.type = AVEvent::EVENT_AV_RESUEM; |
397 | pAv->mCurAvEvent.param = ( int )param; |
398 | pAv->mpObserver->onEvent(pAv->mCurAvEvent); |
399 | break; |
400 | case AM_AV_EVT_VIDEO_SCAMBLED: |
401 | case AM_AV_EVT_AUDIO_SCAMBLED: |
402 | pAv->mCurAvEvent.type = AVEvent::EVENT_AV_SCAMBLED; |
403 | pAv->mCurAvEvent.param = ( int )param; |
404 | pAv->mpObserver->onEvent(pAv->mCurAvEvent); |
405 | break; |
406 | case AM_AV_EVT_VIDEO_NOT_SUPPORT: { |
407 | pAv->mCurAvEvent.type = AVEvent::EVENT_AV_UNSUPPORT; |
408 | pAv->mCurAvEvent.param = ( int )param; |
409 | pAv->mpObserver->onEvent(pAv->mCurAvEvent); |
410 | break; |
411 | } |
412 | default: |
413 | break; |
414 | } |
415 | LOGD ( "%s, av_evt_callback : dev_no %ld type %d param = %d\n", |
416 | __FUNCTION__, dev_no, pAv->mCurAvEvent.type , (int)param); |
417 | } |
418 | |
419 | int CAv::set3DMode(VIDEO_3D_MODE_T mode, int LR_switch, int mode_3D_TO_2D) |
420 | { |
421 | unsigned int cmd = MODE_3D_DISABLE; |
422 | switch (mode) { |
423 | case VIDEO_3D_MODE_DISABLE: |
424 | cmd = MODE_3D_DISABLE; |
425 | break; |
426 | case VIDEO_3D_MODE_AUTO: |
427 | cmd = MODE_3D_ENABLE | MODE_3D_AUTO; |
428 | break; |
429 | case VIDEO_3D_MODE_LR: |
430 | cmd = MODE_3D_ENABLE | MODE_3D_LR; |
431 | break; |
432 | case VIDEO_3D_MODE_TB: |
433 | cmd = MODE_3D_ENABLE | MODE_3D_TB; |
434 | break; |
435 | case VIDEO_3D_MODE_LA: |
436 | cmd = MODE_3D_ENABLE | MODE_3D_LA; |
437 | break; |
438 | case VIDEO_3D_MODE_FA: |
439 | cmd = MODE_3D_ENABLE | MODE_3D_FA; |
440 | break; |
441 | default: |
442 | cmd = MODE_3D_DISABLE; |
443 | break; |
444 | } |
445 | |
446 | if (LR_switch == 1) { |
447 | cmd = cmd | MODE_3D_LR_SWITCH; |
448 | } |
449 | |
450 | if (mode_3D_TO_2D == 1) { |
451 | cmd = cmd | MODE_3D_TO_2D_L; |
452 | } |
453 | |
454 | if (mode_3D_TO_2D == 2) { |
455 | cmd = cmd | MODE_3D_TO_2D_R; |
456 | } |
457 | LOGD("set 3d mode fd = %d cmd = 0x%x", mFdAmVideo, cmd); |
458 | int ret = ioctl(mFdAmVideo, AMSTREAM_IOC_SET_3D_TYPE , cmd); |
459 | if (ret < 0) { |
460 | LOGE("set3DMode error ( %s )", strerror ( errno )); |
461 | } |
462 | return 0; |
463 | } |
464 | |
465 | int CAv::setLookupPtsForDtmb(int enable) |
466 | { |
467 | FILE *fp = fopen ( PATH_MEPG_DTMB_LOOKUP_PTS_FLAG, "w" ); |
468 | LOGD ( "setLookupPtsForDtmb %d ##" , enable); |
469 | if ( fp == NULL ) { |
470 | LOGE ( "Open %s error(%s)!\n", PATH_MEPG_DTMB_LOOKUP_PTS_FLAG, strerror ( errno ) ); |
471 | return -1; |
472 | } |
473 | fprintf ( fp, "%d", enable ); |
474 | fclose ( fp ); |
475 | return 0; |
476 | } |
477 |