int videoCapturerSetFormat()

in source/T31/T31VideoCapturer.c [180:275]


int videoCapturerSetFormat(VideoCapturerHandle handle, const VideoFormat format, const VideoResolution resolution)
{
    T31_HANDLE_NULL_CHECK(handle);
    T31_HANDLE_GET(handle);

    T31_HANDLE_STATUS_CHECK(t31Handle, VID_CAP_STATUS_STREAM_OFF);

    switch (resolution) {
        case VID_RES_1080P:
            t31Handle->channelNum = T31_VIDEO_STREAM_1080P_CHANNEL_NUM;
            break;
        case VID_RES_720P:
            t31Handle->channelNum = T31_VIDEO_STREAM_720P_CHANNEL_NUM;
            break;

        case VID_RES_480P:
            t31Handle->channelNum = T31_VIDEO_STREAM_LOW_RES_CHANNEL_NUM;
            chn[t31Handle->channelNum].fs_chn_attr.picWidth = 640;
            chn[t31Handle->channelNum].fs_chn_attr.picHeight = 480;
            chn[t31Handle->channelNum].fs_chn_attr.scaler.enable = 1;
            chn[t31Handle->channelNum].fs_chn_attr.scaler.outwidth = chn[t31Handle->channelNum].fs_chn_attr.picWidth;
            chn[t31Handle->channelNum].fs_chn_attr.scaler.outheight = chn[t31Handle->channelNum].fs_chn_attr.picHeight;
            break;

        case VID_RES_360P:
            t31Handle->channelNum = T31_VIDEO_STREAM_LOW_RES_CHANNEL_NUM;
            chn[t31Handle->channelNum].fs_chn_attr.picWidth = 480;
            chn[t31Handle->channelNum].fs_chn_attr.picHeight = 360;
            chn[t31Handle->channelNum].fs_chn_attr.scaler.enable = 1;
            chn[t31Handle->channelNum].fs_chn_attr.scaler.outwidth = chn[t31Handle->channelNum].fs_chn_attr.picWidth;
            chn[t31Handle->channelNum].fs_chn_attr.scaler.outheight = chn[t31Handle->channelNum].fs_chn_attr.picHeight;
            break;
        case VID_RES_320P:
            t31Handle->channelNum = T31_VIDEO_STREAM_LOW_RES_CHANNEL_NUM;
            chn[t31Handle->channelNum].fs_chn_attr.picWidth = 416;
            chn[t31Handle->channelNum].fs_chn_attr.picHeight = 320;
            chn[t31Handle->channelNum].fs_chn_attr.scaler.enable = 1;
            chn[t31Handle->channelNum].fs_chn_attr.scaler.outwidth = chn[t31Handle->channelNum].fs_chn_attr.picWidth;
            chn[t31Handle->channelNum].fs_chn_attr.scaler.outheight = chn[t31Handle->channelNum].fs_chn_attr.picHeight;
            break;

        default:
            LOG("Unsupported resolution %d", resolution);
            return -EINVAL;
    }

    switch (format) {
        case VID_FMT_H264:
            chn[t31Handle->channelNum].payloadType = IMP_ENC_PROFILE_AVC_MAIN;
            break;
        case VID_FMT_RAW:
            break;

        default:
            LOG("Unsupported format %d", format);
            return -EINVAL;
    }
    chn[t31Handle->channelNum].enable = true;

    /* Step.2 FrameSource init */

    if (IMP_FrameSource_CreateChn(chn[t31Handle->channelNum].index, &chn[t31Handle->channelNum].fs_chn_attr)) {
        LOG("IMP_FrameSource_CreateChn(chn%d) error !", chn[t31Handle->channelNum].index);
        return -EAGAIN;
    }

    if (IMP_FrameSource_SetChnAttr(chn[t31Handle->channelNum].index, &chn[t31Handle->channelNum].fs_chn_attr)) {
        LOG("IMP_FrameSource_SetChnAttr(chn%d) error !", chn[t31Handle->channelNum].index);
        return -EAGAIN;
    }

    if (format != VID_FMT_RAW) {
        /* Step.3 Encoder init */

        if (IMP_Encoder_CreateGroup(chn[t31Handle->channelNum].index)) {
            LOG("IMP_Encoder_CreateGroup(%d) error !", chn[t31Handle->channelNum].index);
            return -EAGAIN;
        }

        if (sample_encoder_init()) {
            LOG("Encoder init failed");
            return -EAGAIN;
        }

        /* Step.4 Bind */
        if (IMP_System_Bind(&chn[t31Handle->channelNum].framesource_chn, &chn[t31Handle->channelNum].imp_encoder)) {
            LOG("Bind FrameSource channel%d and Encoder failed", t31Handle->channelNum);
            return -EAGAIN;
        }
    }

    t31Handle->format = format;
    t31Handle->resolution = resolution;

    return 0;
}