예제 #1
0
void SetDefaultSourceParameters(const VideoFormat &vf, SourceParams& sparams) 
{
    std::ostringstream errstr;
    sparams.SetVideoFormat(vf);
    sparams.SetCFormat(format420);
    sparams.SetSourceSampling(0);
    sparams.SetTopFieldFirst(true);
    sparams.SetPixelAspectRatio(PIXEL_ASPECT_RATIO_1_1);
    sparams.SetSignalRange(SIGNAL_RANGE_8BIT_FULL);
    sparams.SetLeftOffset(0);
    sparams.SetTopOffset(0);
    sparams.SetColourSpecification(1);
    
    switch (vf)
    {
    case VIDEO_FORMAT_CUSTOM:
        sparams.SetXl(640);
        sparams.SetYl(480);
        sparams.SetTopFieldFirst(false);
        sparams.SetFrameRate(FRAMERATE_23p97_FPS);
        sparams.SetCleanWidth(640);
        sparams.SetCleanHeight(480);
        sparams.SetColourSpecification(0);
        break;
    case VIDEO_FORMAT_QSIF525:
        sparams.SetXl(176);
        sparams.SetYl(120);
        sparams.SetTopFieldFirst(false);
        sparams.SetFrameRate(FRAMERATE_14p98_FPS);
        sparams.SetPixelAspectRatio(PIXEL_ASPECT_RATIO_10_11);
        sparams.SetCleanWidth(176);
        sparams.SetCleanHeight(120);
        sparams.SetColourSpecification(1);
        break;
    case VIDEO_FORMAT_QCIF:
        sparams.SetXl(176);
        sparams.SetYl(144);
        sparams.SetFrameRate(FRAMERATE_12p5_FPS);
        sparams.SetPixelAspectRatio(PIXEL_ASPECT_RATIO_12_11);
        sparams.SetCleanWidth(176);
        sparams.SetCleanHeight(144);
        sparams.SetColourSpecification(2);
        break;
    case VIDEO_FORMAT_SIF525:
        sparams.SetXl(352);
        sparams.SetYl(240);
        sparams.SetTopFieldFirst(false);
        sparams.SetFrameRate(FRAMERATE_14p98_FPS);
        sparams.SetPixelAspectRatio(PIXEL_ASPECT_RATIO_10_11);
        sparams.SetCleanWidth(352);
        sparams.SetCleanHeight(240);
        sparams.SetColourSpecification(1);
        break;
    case VIDEO_FORMAT_CIF:
        sparams.SetXl(352);
        sparams.SetYl(288);
        sparams.SetFrameRate(FRAMERATE_12p5_FPS);
        sparams.SetPixelAspectRatio(PIXEL_ASPECT_RATIO_12_11);
        sparams.SetCleanWidth(352);
        sparams.SetCleanHeight(288);
        sparams.SetColourSpecification(2);
        break;
    case VIDEO_FORMAT_4SIF525:
        sparams.SetXl(704);
        sparams.SetYl(480);
        sparams.SetTopFieldFirst(false);
        sparams.SetFrameRate(FRAMERATE_14p98_FPS);
        sparams.SetPixelAspectRatio(PIXEL_ASPECT_RATIO_10_11);
        sparams.SetCleanWidth(704);
        sparams.SetCleanHeight(480);
        sparams.SetColourSpecification(1);
        break;
    case VIDEO_FORMAT_4CIF:
        sparams.SetXl(704);
        sparams.SetYl(576);
        sparams.SetFrameRate(FRAMERATE_12p5_FPS);
        sparams.SetPixelAspectRatio(PIXEL_ASPECT_RATIO_12_11);
        sparams.SetCleanWidth(704);
        sparams.SetCleanHeight(576);
        sparams.SetColourSpecification(2);
        break;
    case VIDEO_FORMAT_SD_480I60:
        sparams.SetXl(720);
        sparams.SetYl(480);
        sparams.SetCFormat(format422);
        sparams.SetSourceSampling(1);
        sparams.SetTopFieldFirst(false);
        sparams.SetFrameRate(FRAMERATE_29p97_FPS);
        sparams.SetPixelAspectRatio(PIXEL_ASPECT_RATIO_10_11);
        sparams.SetCleanWidth(704);
        sparams.SetCleanHeight(480);
        sparams.SetLeftOffset(8);
        sparams.SetSignalRange(SIGNAL_RANGE_10BIT_VIDEO);
        sparams.SetColourSpecification(1);
        break;
    case VIDEO_FORMAT_SD_576I50:
        sparams.SetXl(720);
        sparams.SetYl(576);
        sparams.SetCFormat(format422);
        sparams.SetSourceSampling(1);
        sparams.SetFrameRate(FRAMERATE_25_FPS);
        sparams.SetPixelAspectRatio(PIXEL_ASPECT_RATIO_12_11);
        sparams.SetCleanWidth(704);
        sparams.SetCleanHeight(576);
        sparams.SetLeftOffset(8);
        sparams.SetSignalRange(SIGNAL_RANGE_10BIT_VIDEO);
        sparams.SetColourSpecification(2);
        break;
    case VIDEO_FORMAT_HD_720P50:
    case VIDEO_FORMAT_HD_720P60:
        sparams.SetXl(1280);
        sparams.SetYl(720);
        sparams.SetCFormat(format422);
        if (vf == VIDEO_FORMAT_HD_720P50)
            sparams.SetFrameRate(FRAMERATE_50_FPS);
        else
            sparams.SetFrameRate(FRAMERATE_59p94_FPS);
        sparams.SetCleanWidth(1280);
        sparams.SetCleanHeight(720);
        sparams.SetSignalRange(SIGNAL_RANGE_10BIT_VIDEO);
        sparams.SetColourSpecification(3);
        break;
    case VIDEO_FORMAT_HD_1080I60:
    case VIDEO_FORMAT_HD_1080I50:
    case VIDEO_FORMAT_HD_1080P60:
    case VIDEO_FORMAT_HD_1080P50:
        sparams.SetXl(1920);
        sparams.SetYl(1080);
        sparams.SetCFormat(format422);
        switch (vf)
        {
        case VIDEO_FORMAT_HD_1080I60:
            sparams.SetSourceSampling(1);
            sparams.SetFrameRate(FRAMERATE_29p97_FPS);
            break;
        case VIDEO_FORMAT_HD_1080I50:
            sparams.SetSourceSampling(1);
            sparams.SetFrameRate(FRAMERATE_25_FPS);
            break;
        case VIDEO_FORMAT_HD_1080P60:
            sparams.SetFrameRate(FRAMERATE_59p94_FPS);
            break;
        case VIDEO_FORMAT_HD_1080P50:
            sparams.SetFrameRate(FRAMERATE_50_FPS);
            break;
        default:
            break;
        }
        sparams.SetSignalRange(SIGNAL_RANGE_10BIT_VIDEO);
        sparams.SetCleanWidth(1920);
        sparams.SetCleanHeight(1080);
        sparams.SetColourSpecification(3);
        break;
    case VIDEO_FORMAT_DIGI_CINEMA_2K24:
        sparams.SetXl(2048);
        sparams.SetYl(1080);
        sparams.SetCFormat(format444);
        sparams.SetFrameRate(FRAMERATE_24_FPS);
        sparams.SetCleanWidth(2048);
        sparams.SetCleanHeight(1080);
        sparams.SetSignalRange(SIGNAL_RANGE_12BIT_VIDEO);
        sparams.SetColourSpecification(4);
        break;
    case VIDEO_FORMAT_DIGI_CINEMA_4K24:
        sparams.SetXl(4096);
        sparams.SetYl(2160);
        sparams.SetCFormat(format444);
        sparams.SetFrameRate(FRAMERATE_24_FPS);
        sparams.SetCleanWidth(4096);
        sparams.SetCleanHeight(2160);
        sparams.SetSignalRange(SIGNAL_RANGE_12BIT_VIDEO);
        sparams.SetColourSpecification(4);
        break;
    default:
        errstr << "Unsupported video format " << sparams.GetVideoFormat()
               << std::endl;
        DIRAC_THROW_EXCEPTION(
            ERR_INVALID_VIDEO_FORMAT,
            errstr.str(),
            SEVERITY_FRAME_ERROR);
        break;
    }
}
void SetDefaultCodecParameters(CodecParams &cparams,
                               PictureType ptype,
                               unsigned int num_refs)
{
    std::ostringstream errstr;
    // Transform parameters
    cparams.SetZeroTransform(false);
    cparams.SetTransformDepth(4);
    WltFilter wf;
    SetDefaultTransformFilter(ptype, cparams.GetVideoFormat(), wf);
    cparams.SetTransformFilter(wf);
    cparams.SetCodeBlockMode(QUANT_SINGLE);
    cparams.SetSpatialPartition(false);

    // Default is set to progressive specified irrespective
    // of whether the source material is interlaced or progressive.
    // Overridden from command line of encoder or in bytestream for decoder.
    cparams.SetPictureCodingMode(0);
    cparams.SetTopFieldFirst(true);
    switch (cparams.GetVideoFormat())
    {
    case VIDEO_FORMAT_QSIF525:
    case VIDEO_FORMAT_QCIF:
    case VIDEO_FORMAT_CUSTOM:
    case VIDEO_FORMAT_SIF525:
    case VIDEO_FORMAT_CIF:
    case VIDEO_FORMAT_4CIF:
    case VIDEO_FORMAT_4SIF525:
    case VIDEO_FORMAT_SD_480I60:
    case VIDEO_FORMAT_SD_576I50:
    case VIDEO_FORMAT_HD_720P60:
    case VIDEO_FORMAT_HD_720P50:
    case VIDEO_FORMAT_HD_1080I60:
    case VIDEO_FORMAT_HD_1080I50:
    case VIDEO_FORMAT_HD_1080P60:
    case VIDEO_FORMAT_HD_1080P50:
    case VIDEO_FORMAT_DIGI_CINEMA_2K24:
    case VIDEO_FORMAT_DIGI_CINEMA_4K24:
    case VIDEO_FORMAT_UHDTV_4K60:
    case VIDEO_FORMAT_UHDTV_4K50:
    case VIDEO_FORMAT_UHDTV_8K60:
    case VIDEO_FORMAT_UHDTV_8K50:
        cparams.SetSpatialPartition(true);
        break;
    default:
        errstr << "Unsupported video format " << cparams.GetVideoFormat()
               << std::endl;
        DIRAC_THROW_EXCEPTION(
            ERR_INVALID_VIDEO_FORMAT,
            errstr.str(),
            SEVERITY_PICTURE_ERROR);
        break;
    }

    if (ptype == INTER_PICTURE)
    {
        ASSERTM (num_refs > 0 && num_refs < 3, "Number of reference frames should be 1 or 2 fo INTER frames" );
        OLBParams bparams;
	PicturePredParams& predparams = cparams.GetPicPredParams();
        predparams.SetUsingGlobalMotion(false);
        SetDefaultBlockParameters(bparams, cparams.GetVideoFormat());
        predparams.SetLumaBlockParams(bparams);
        predparams.SetMVPrecision(MV_PRECISION_HALF_PIXEL);
        // NOTE: FIXME - need to add global motion params here
        predparams.SetPictureWeightsPrecision(1);
        predparams.SetRef1Weight(1);
        predparams.SetRef2Weight(1);
        cparams.SetPictureCodingMode(0);
    }
}