QTSS_Error EasyCameraSource::StartStreaming(Easy_StartStream_Params* inParams)
{
	QTSS_Error theErr = QTSS_NoErr;

	do 
	{
		if (NULL == fPusherHandle)
		{
			if (!cameraLogin())
			{
				theErr = QTSS_RequestFailed;
				break;
			}

			std::map<HI_U32, Easy_U32> mapSDK2This;
			mapSDK2This[HI_NET_DEV_AUDIO_TYPE_G711] = EASY_SDK_AUDIO_CODEC_G711A;
			mapSDK2This[HI_NET_DEV_AUDIO_TYPE_G726] = EASY_SDK_AUDIO_CODEC_G726;

			EASY_MEDIA_INFO_T mediainfo;
			memset(&mediainfo, 0x00, sizeof(EASY_MEDIA_INFO_T));
			mediainfo.u32VideoCodec = EASY_SDK_VIDEO_CODEC_H264;

			HI_S32 s32Ret = HI_FAILURE;
			HI_S_Video sVideo;
			sVideo.u32Channel = HI_NET_DEV_CHANNEL_1;
			sVideo.blFlag = sStreamType ? HI_TRUE : HI_FALSE;

			s32Ret = HI_NET_DEV_GetConfig(m_u32Handle, HI_NET_DEV_CMD_VIDEO_PARAM, &sVideo, sizeof(HI_S_Video));
			if (s32Ret == HI_SUCCESS)
			{
				mediainfo.u32VideoFps = sVideo.u32Frame;
			}
			else
			{
				mediainfo.u32VideoFps = 25;
			}

			HI_S_Audio sAudio;
			sAudio.u32Channel = HI_NET_DEV_CHANNEL_1;
			sAudio.blFlag = sStreamType ? HI_TRUE : HI_FALSE;

			s32Ret = HI_NET_DEV_GetConfig(m_u32Handle, HI_NET_DEV_CMD_AUDIO_PARAM, &sAudio, sizeof(HI_S_Audio));
			if (s32Ret == HI_SUCCESS)
			{
				mediainfo.u32AudioCodec = mapSDK2This[sAudio.u32Type];
				mediainfo.u32AudioChannel = sAudio.u32Channel;
			}
			else
			{
				mediainfo.u32AudioCodec = EASY_SDK_AUDIO_CODEC_G711A;
				mediainfo.u32AudioChannel = 1;
			}

			mediainfo.u32AudioSamplerate = 8000;


			fPusherHandle = EasyPusher_Create();
			if (fPusherHandle == NULL)
			{
				//EasyPusher初始化创建失败,可能是EasyPusher SDK未授权
				theErr = QTSS_Unimplemented;
				break;
			}

			// 注册流推送事件回调
			EasyPusher_SetEventCallback(fPusherHandle, __EasyPusher_Callback, 0, NULL);

			// 根据接收到的命令生成流信息
			char sdpName[128] = { 0 };
			sprintf(sdpName, "%s/%s/%s.sdp", inParams->inStreamID, inParams->inSerial, inParams->inChannel);

			// 开始推送流媒体数据
			EasyPusher_StartStream(fPusherHandle, (char*)inParams->inIP, inParams->inPort, sdpName, "", "", &mediainfo, 1024/* 1M Buffer*/, 0);

			saveStartStreamParams(inParams);
		}

		theErr = netDevStartStream();

	} while (0);


	if (theErr != QTSS_NoErr)
	{	
		// 如果推送不成功,需要释放之前已经开启的资源
		StopStreaming(NULL);
	}
	else
	{
		// 推送成功,将当前正在推送的参数信息回调
		inParams->inChannel = fStartStreamInfo.channel;
		inParams->inIP = fStartStreamInfo.ip;
		inParams->inPort = fStartStreamInfo.port;
		inParams->inProtocol = fStartStreamInfo.protocol;
		inParams->inSerial = fStartStreamInfo.serial;
		inParams->inStreamID = fStartStreamInfo.streamId;
	}

	return theErr;
}
Exemple #2
0
static int 
bsm_get_device_config(struct service *srv, int parm_id, void *parm)
{
    int ret = HI_FAILURE;
    int user_id;

    JDevCap *dev_cap;
    bsm_config_t *config;
    bsm_service_t*bsm_srv;

    NMP_ASSERT(srv && parm);

    bsm_srv = (bsm_service_t*)srv;
    user_id = bsm_get_user_id(&bsm_srv->parm);

    if (BSM_LOGOUT == user_id)
    {
        show_debug("Proxy device logout!!!!!!!!!!!!!!\n");
        return -1;
    }

    switch (parm_id)
    {
        case GET_DEVICE_CONFIG:
            goto GET_CFG;
        case GET_NETWORK_CONFIG:
            goto GET_CFG;
        case GET_FTP_CONFIG:
            goto GET_CFG;
        case GET_SMTP_CONFIG:
            goto GET_CFG;
        case GET_DDNS_CONFIG:
            goto GET_CFG;
        case GET_DISK_LIST:
            goto GET_CFG;
        case GET_ENCODE_CONFIG:
            goto GET_CFG;
        case GET_DISPLAY_CONFIG:
            goto GET_CFG;
        case GET_OSD_CONFIG:
            goto GET_CFG;
        case GET_PTZ_CONFIG:
            goto GET_CFG;
        case GET_MOTION_CONFIG:
            goto GET_CFG;

        case GET_CAPABILITY_SET:
            dev_cap = (JDevCap*)parm;
            dev_cap->cap0 = DEV_CAP_VIDEO_IN | DEV_CAP_AUDIO | DEV_CAP_IRIS | DEV_CAP_PTZ | 
                DEV_CAP_ALARM_IN | DEV_CAP_ALARM_OUT | DEV_CAP_STORAGE | DEV_CAP_WEB | DEV_CAP_PLATFORM | 
                DEV_CAP_INTELLIGENT_ANALYSIS | DEV_CAP_UPDATE | DEV_CAP_VIDEO_OUT;// | DEV_CAP_IR;
            dev_cap->ftp_enable = 1;
            dev_cap->upnp_enable = 0;
            dev_cap->chn_cap.size = sizeof(JChnCap);
            dev_cap->chn_cap.encode = VIDEO_ENCODE_H264_E | VIDEO_ENCODE_MJPEG_E | 
                VIDEO_ENCODE_JPEG_E | VIDEO_ENCODE_MPEG4_E;
            dev_cap->chn_cap.supp_mask = 1;
            dev_cap->chn_cap.mask_count = 4;
            dev_cap->chn_cap.supp_hide_alarm = 1;
            dev_cap->chn_cap.hide_alarm_count = 1;
            dev_cap->chn_cap.supp_move_alarm = 1;
            dev_cap->chn_cap.move_alarm_count = 1;
            dev_cap->chn_cap.supp_video_lost_alarm = 1;
            dev_cap->chn_cap.osd_count = 1;
            dev_cap->chn_cap.stream_count = 2;
            dev_cap->chn_cap.stream_supp_resolution[0] = CAP_VIDEO_QCIF | CAP_VIDEO_CIF | 
                CAP_VIDEO_D1 | CAP_VIDEO_QQVGA | CAP_VIDEO_QVGA | CAP_VIDEO_VGA | CAP_VIDEO_720P;
            dev_cap->chn_cap.stream_supp_resolution[1] = CAP_VIDEO_QCIF | CAP_VIDEO_CIF | 
                CAP_VIDEO_D1 | CAP_VIDEO_QQVGA | CAP_VIDEO_QVGA | CAP_VIDEO_VGA | CAP_VIDEO_720P;
            dev_cap->chn_cap.stream_supp_resolution[2] = CAP_VIDEO_QCIF | CAP_VIDEO_CIF | 
                CAP_VIDEO_D1 | CAP_VIDEO_QQVGA | CAP_VIDEO_QVGA | CAP_VIDEO_VGA | CAP_VIDEO_720P;
            dev_cap->chn_cap.stream_supp_resolution[3] = CAP_VIDEO_QCIF | CAP_VIDEO_CIF | 
                CAP_VIDEO_D1 | CAP_VIDEO_QQVGA | CAP_VIDEO_QVGA | CAP_VIDEO_VGA | CAP_VIDEO_720P;
            dev_cap->chn_cap.stream_max_frate_rate[0] = 25;
            dev_cap->chn_cap.img_cap = IMA_BRIGHTNESS | IMA_CONTRAST | IMA_SATURATION | IMA_HUE;
            ret = HI_SUCCESS;
            break;

        default:
            ret = HI_FAILURE;
            show_warn("parm_id Invalid!!!!!\n");
            break;
    }

    if (HI_SUCCESS == ret)
        return 0;
    else
        return -1;

GET_CFG:
    config = (bsm_config_t*)parm;
    ret = HI_NET_DEV_GetConfig(
            (HI_U32)  user_id, 
            (HI_U32)  config->command, 
            (HI_VOID*)config->buffer, 
            (HI_U32)  config->b_size);
    show_debug("HI_NET_DEV_GetConfig: %s<-------------------------------\n", 
        (ret == HI_SUCCESS) ? "Success" : "Failure");
    if (HI_SUCCESS == ret)
        return 0;
    else
        return -1;
}