int amdisplay_utils_set_scale_mode(int scale_wx, int scale_hx) { int width, height; int ret; int neww, newh; char buf[40]; /*scale mode only support x2,x1*/ if ((scale_wx != 1 && scale_wx != 2) || (scale_hx != 1 && scale_hx != 2)) { LOGI("unsupport scaling mode,x1,x2 only\n", scale_wx, scale_hx); return -1; } if(scale_wx==2) ret = amsysfs_set_sysfs_str(SCALE_REQUEST, "1"); else if(scale_wx==1) ret = amsysfs_set_sysfs_str(SCALE_REQUEST, "2"); if (ret < 0) { LOGI("set [%s]=[%s] failed\n", SCALE_AXIS_PATH, buf); return -2; } return ret; }
/** * \brief start audio dec when receive START command. * \param audec pointer to audec */ static void start_adec(aml_audio_dec_t *audec) { int ret; audio_out_operations_t *aout_ops = &audec->aout_ops; dsp_operations_t *dsp_ops = &audec->adsp_ops; unsigned long vpts,apts; int times=0; char buf[32]; apts = vpts = 0; audec->no_first_apts = 0; if (audec->state == INITTED) { audec->state = ACTIVE; while ((!audiodsp_get_first_pts_flag(dsp_ops)) && (!audec->need_stop) && (!audec->no_first_apts)) { adec_print("wait first pts checkin complete times=%d,!\n",times); times++; if (times>=5) { // read vpts amsysfs_get_sysfs_str(TSYNC_VPTS, buf, sizeof(buf)); if (sscanf(buf, "0x%lx", &vpts) < 1) { adec_print("unable to get vpts from: %s", buf); return -1; } // save vpts to apts adec_print("## can't get first apts, save vpts to apts,vpts=%lx, \n",vpts); sprintf(buf, "0x%lx", vpts); amsysfs_set_sysfs_str(TSYNC_APTS, buf); audec->no_first_apts = 1; } usleep(100000); } /*Since audio_track->start consumed too much time *for the first time after platform restart, *so execute start cmd before adec_pts_start */ aout_ops->start(audec); aout_ops->pause(audec); /*start the the pts scr,...*/ ret = adec_pts_start(audec); //adec_pts_droppcm(audec); if (audec->auto_mute) { avsync_en(0); audiodsp_automute_on(dsp_ops); adec_pts_pause(); while ((!audec->need_stop) && track_switch_pts(audec)) { usleep(1000); } audiodsp_automute_off(dsp_ops); avsync_en(1); adec_pts_resume(); audec->auto_mute = 0; } aout_ops->resume(audec); } }
int vdec_pts_pause(void) { return amsysfs_set_sysfs_str(TSYNC_EVENT, "VIDEO_PAUSE:0x1"); }
/** * \brief start pts manager * \param audec pointer to audec * \return 0 on success otherwise -1 */ int adec_pts_start(aml_audio_dec_t *audec) { unsigned long pts = 0; char *file; char buf[64]; dsp_operations_t *dsp_ops; char value[PROPERTY_VALUE_MAX]={0}; adec_print("adec_pts_start"); dsp_ops = &audec->adsp_ops; memset(buf, 0, sizeof(buf)); if (audec->avsync_threshold <= 0) { if (am_getconfig_bool("media.libplayer.wfd")) { audec->avsync_threshold = SYSTIME_CORRECTION_THRESHOLD * 2 / 3; adec_print("use 2/3 default av sync threshold!\n"); } else { audec->avsync_threshold = SYSTIME_CORRECTION_THRESHOLD; adec_print("use default av sync threshold!\n"); } } adec_print("av sync threshold is %d , no_first_apts=%d,\n", audec->avsync_threshold, audec->no_first_apts); dsp_ops->last_pts_valid = 0; if(property_get("sys.amplayer.drop_pcm",value,NULL) > 0) if(!strcmp(value,"1")) adec_pts_droppcm(audec); // before audio start or pts start if(amsysfs_set_sysfs_str(TSYNC_EVENT, "AUDIO_PRE_START") == -1) { return -1; } usleep(1000); if (audec->no_first_apts) { if (amsysfs_get_sysfs_str(TSYNC_APTS, buf, sizeof(buf)) == -1) { adec_print("unable to open file %s,err: %s", TSYNC_APTS, strerror(errno)); return -1; } if (sscanf(buf, "0x%lx", &pts) < 1) { adec_print("unable to get vpts from: %s", buf); return -1; } } else { pts = adec_calc_pts(audec); if (pts == -1) { adec_print("pts==-1"); if (amsysfs_get_sysfs_str(TSYNC_APTS, buf, sizeof(buf)) == -1) { adec_print("unable to open file %s,err: %s", TSYNC_APTS, strerror(errno)); return -1; } if (sscanf(buf, "0x%lx", &pts) < 1) { adec_print("unable to get apts from: %s", buf); return -1; } } } adec_print("audio pts start from 0x%lx", pts); sprintf(buf, "AUDIO_START:0x%lx", pts); if(amsysfs_set_sysfs_str(TSYNC_EVENT, buf) == -1) { return -1; } return 0; }
int vdec_pts_resume(void) { adec_print("vdec_pts_resume\n"); return amsysfs_set_sysfs_str(TSYNC_EVENT, "VIDEO_PAUSE:0x0"); }
int adec_refresh_pts(aml_audio_dec_t *audec) { unsigned long pts; unsigned long systime; unsigned long last_pts = audec->adsp_ops.last_audio_pts; unsigned long last_kernel_pts = audec->adsp_ops.kernel_audio_pts; char buf[64]; char ret_val = -1; if (audec->auto_mute == 1) { return 0; } memset(buf, 0, sizeof(buf)); systime = audec->adsp_ops.get_cur_pcrscr(&audec->adsp_ops); if (systime == -1) { adec_print("unable to getsystime"); return -1; } /* get audio time stamp */ pts = adec_calc_pts(audec); if (pts == -1 || last_pts == pts) { //close(fd); //if (pts == -1) { return -1; //} } if ((abs(pts - last_pts) > APTS_DISCONTINUE_THRESHOLD) && (audec->adsp_ops.last_pts_valid)) { /* report audio time interruption */ adec_print("pts = %lx, last pts = %lx\n", pts, last_pts); adec_print("audio time interrupt: 0x%lx->0x%lx, 0x%lx\n", last_pts, pts, abs(pts - last_pts)); sprintf(buf, "AUDIO_TSTAMP_DISCONTINUITY:0x%lx", pts); if(amsysfs_set_sysfs_str(TSYNC_EVENT, buf) == -1) { adec_print("unable to open file %s,err: %s", TSYNC_EVENT, strerror(errno)); return -1; } audec->adsp_ops.last_audio_pts = pts; audec->adsp_ops.last_pts_valid = 1; adec_print("set automute!\n"); audec->auto_mute = 1; apts_interrupt=10; return 0; } if (last_kernel_pts == audec->adsp_ops.kernel_audio_pts) { return 0; } audec->adsp_ops.last_audio_pts = pts; audec->adsp_ops.last_pts_valid = 1; if (abs(pts - systime) < audec->avsync_threshold) { apts_interrupt=0; return 0; } else if(apts_interrupt>0){ apts_interrupt --; return 0; } /* report apts-system time difference */ if(audec->adsp_ops.set_cur_apts){ ret_val = audec->adsp_ops.set_cur_apts(&audec->adsp_ops,pts); } else{ sprintf(buf, "0x%lx", pts); ret_val = amsysfs_set_sysfs_str(TSYNC_APTS, buf); } if(ret_val == -1) { adec_print("unable to open file %s,err: %s", TSYNC_APTS, strerror(errno)); return -1; } //adec_print("report apts as %ld,system pts=%ld, difference= %ld\n", pts, systime, (pts - systime)); return 0; }
/** * \brief resume pts manager * \return 0 on success otherwise -1 */ int adec_pts_resume(void) { adec_print("adec_pts_resume"); return amsysfs_set_sysfs_str(TSYNC_EVENT, "AUDIO_RESUME"); }
/** * \brief pause pts manager * \return 0 on success otherwise -1 */ int adec_pts_pause(void) { adec_print("adec_pts_pause"); return amsysfs_set_sysfs_str(TSYNC_EVENT, "AUDIO_PAUSE"); }