예제 #1
0
파일: p1203Pv.py 프로젝트: gmj93/itu-p1203
    def video_model_function_mode0(coding_res, display_res, bitrate_kbps_segment_size, framerate):
        """
        Mode 0 model

        Arguments:
            coding_res {int} -- number of pixels in coding resolution
            display_res {int} -- number of display resolution pixels
            bitrate_kbps_segment_size {float} -- bitrate in kBit/s
            framerate {float} -- frame rate

        Returns:
            float -- O22 score
        """

        # compression degradation
        a1 = 11.9983519
        a2 = -2.99991847
        a3 = 41.2475074001
        a4 = 0.13183165961
        q1 = 4.66
        q2 = -0.07
        q3 = 4.06
        quant = a1 + a2 * np.log(a3 + np.log(bitrate_kbps_segment_size) + np.log(bitrate_kbps_segment_size * bitrate_kbps_segment_size / (coding_res * framerate) + a4))
        mos_cod_v = q1 + q2 * np.exp(q3 * quant)
        mos_cod_v = utils.constrain(mos_cod_v, 1.0, 5.0)
        deg_cod_v = 100.0 - utils.r_from_mos(mos_cod_v)
        deg_cod_v = utils.constrain(deg_cod_v, 0.0, 100.0)

        # scaling, framerate degradation
        deg_scal_v = P1203Pv.degradation_due_to_upscaling(coding_res, display_res)
        deg_frame_rate_v = P1203Pv.degradation_due_to_frame_rate_reduction(deg_cod_v, deg_scal_v, framerate)

        # degradation integration
        score = P1203Pv.degradation_integration(mos_cod_v, deg_cod_v, deg_scal_v, deg_frame_rate_v)

        logger.debug(json.dumps({
            'coding_res': round(coding_res, 2),
            'display_res': round(display_res, 2),
            'bitrate_kbps_segment_size': round(bitrate_kbps_segment_size, 2),
            'framerate': round(framerate, 2),
            'mos_cod_v': round(mos_cod_v, 2),
            'deg_cod_v': round(deg_cod_v, 2),
            'deg_scal_v': round(deg_scal_v, 2),
            'deg_frame_rate_v': round(deg_frame_rate_v, 2),
            'score': round(score, 2)
        }, indent=True))

        return score
예제 #2
0
파일: p1203Pv.py 프로젝트: gmj93/itu-p1203
 def degradation_integration(mos_cod_v, deg_cod_v, deg_scal_v, deg_frame_rate_v):
     """
     Integrate the three degradations
     """
     deg_all = utils.constrain(deg_cod_v + deg_scal_v + deg_frame_rate_v, 0.0, 100.0)
     qv = 100 - deg_all
     return utils.mos_from_r(qv)
예제 #3
0
 def degradation_due_to_upscaling(self, coding_res, display_res):
     """
     Degradation due to upscaling
     """
     scale_factor = display_res / coding_res
     scale_factor = max(scale_factor, 1)
     u1 = self.coeffs["u1"]
     u2 = self.coeffs["u2"]
     deg_scal_v = u1 * np.log10(u2 * (scale_factor - 1.0) + 1.0)
     deg_scal_v = utils.constrain(deg_scal_v, 0.0, 100.0)
     return deg_scal_v
예제 #4
0
파일: p1203Pv.py 프로젝트: gmj93/itu-p1203
 def degradation_due_to_upscaling(coding_res, display_res):
     """
     Degradation due to upscaling
     """
     scale_factor = display_res / coding_res
     scale_factor = max(scale_factor, 1)
     u1 = 72.61
     u2 = 0.32
     deg_scal_v = u1 * np.log10(u2 * (scale_factor - 1.0) + 1.0)
     deg_scal_v = utils.constrain(deg_scal_v, 0.0, 100.0)
     return deg_scal_v
예제 #5
0
파일: p1203Pv.py 프로젝트: gmj93/itu-p1203
 def degradation_due_to_frame_rate_reduction(deg_cod_v, deg_scal_v, framerate):
     """
     Degradation due to frame rate reduction
     """
     t1 = 30.98
     t2 = 1.29
     t3 = 64.65
     deg_frame_rate_v = 0
     if framerate < 24:
         deg_frame_rate_v = (100 - deg_cod_v - deg_scal_v) * (t1 - t2 * framerate) / (t3 + framerate)
     deg_frame_rate_v = utils.constrain(deg_frame_rate_v, 0.0, 100.0)
     return deg_frame_rate_v
예제 #6
0
 def degradation_due_to_frame_rate_reduction(self, deg_cod_v, deg_scal_v,
                                             framerate):
     """
     Degradation due to frame rate reduction
     """
     t1 = self.coeffs["t1"]
     t2 = self.coeffs["t2"]
     t3 = self.coeffs["t3"]
     deg_frame_rate_v = 0
     if framerate < 24:
         deg_frame_rate_v = (100 - deg_cod_v - deg_scal_v) * (
             t1 - t2 * framerate) / (t3 + framerate)
     deg_frame_rate_v = utils.constrain(deg_frame_rate_v, 0.0, 100.0)
     return deg_frame_rate_v
예제 #7
0
    def video_model_function_mode1(self,
                                   coding_res,
                                   display_res,
                                   bitrate_kbps_segment_size,
                                   framerate,
                                   frames,
                                   iframe_ratio=None):
        """
        Mode 1 model

        Arguments:
            coding_res {int} -- number of pixels in coding resolution
            display_res {int} -- number of display resolution pixels
            bitrate_kbps_segment_size {float} -- bitrate in kBit/s
            framerate {float} -- frame rate
            frames {list} -- frames
            iframe_ratio {float} -- iframe ratio, only for debugging

        Returns:
            float -- O22 score
        """
        # compression degradation
        a1 = self.coeffs["mode1"]["a1"]
        a2 = self.coeffs["mode1"]["a2"]
        a3 = self.coeffs["mode1"]["a3"]
        a4 = self.coeffs["mode1"]["a4"]
        q1 = self.coeffs["q1"]
        q2 = self.coeffs["q2"]
        q3 = self.coeffs["q3"]
        quant = a1 + a2 * np.log(
            a3 + np.log(bitrate_kbps_segment_size) +
            np.log(bitrate_kbps_segment_size * bitrate_kbps_segment_size /
                   (coding_res * framerate) + a4))
        mos_cod_v = q1 + q2 * np.exp(q3 * quant)
        mos_cod_v = utils.constrain(mos_cod_v, 1.0, 5.0)

        # if iframe ratio is already set (debug mode)

        # complexity correction
        c0 = self.coeffs["mode1"]["c0"]
        c1 = self.coeffs["mode1"]["c1"]
        c2 = self.coeffs["mode1"]["c2"]
        c3 = self.coeffs["mode1"]["c3"]
        if not iframe_ratio:
            i_sizes = []
            noni_sizes = []
            for frame in frames:
                frame_size = utils.calculate_compensated_size(
                    frame["type"], frame["size"], frame["dts"])
                if frame["type"] == "I":
                    i_sizes.append(int(frame_size))
                else:
                    noni_sizes.append(int(frame_size))

            # only compute ratio when there are frames of both types
            if i_sizes and noni_sizes:
                iframe_ratio = np.mean(i_sizes) / np.mean(noni_sizes)
            else:
                iframe_ratio = 0
        complexity = utils.sigmoid(c0, c1, c2, c3, iframe_ratio)
        mos_cod_v += complexity

        deg_cod_v = 100.0 - utils.r_from_mos(mos_cod_v)
        deg_cod_v = utils.constrain(deg_cod_v, 0.0, 100.0)

        # scaling, framerate degradation
        deg_scal_v = self.degradation_due_to_upscaling(coding_res, display_res)
        deg_frame_rate_v = self.degradation_due_to_frame_rate_reduction(
            deg_cod_v, deg_scal_v, framerate)

        # degradation integration
        score = self.degradation_integration(mos_cod_v, deg_cod_v, deg_scal_v,
                                             deg_frame_rate_v)

        logger.debug(
            json.dumps(
                {
                    'coding_res':
                    round(coding_res, 2),
                    'display_res':
                    round(display_res, 2),
                    'bitrate_kbps_segment_size':
                    round(bitrate_kbps_segment_size, 2),
                    'framerate':
                    round(framerate, 2),
                    'mos_cod_v':
                    round(mos_cod_v, 2),
                    'deg_cod_v':
                    round(deg_cod_v, 2),
                    'iframe_ratio':
                    round(iframe_ratio, 2),
                    'complexity':
                    round(complexity, 2),
                    'deg_scal_v':
                    round(deg_scal_v, 2),
                    'deg_frame_rate_v':
                    round(deg_frame_rate_v, 2),
                    'score':
                    round(score, 2)
                },
                indent=True))

        return score
예제 #8
0
    def video_model_function_mode0(self, coding_res, display_res,
                                   bitrate_kbps_segment_size, framerate):
        """
        Mode 0 model

        Arguments:
            coding_res {int} -- number of pixels in coding resolution
            display_res {int} -- number of display resolution pixels
            bitrate_kbps_segment_size {float} -- bitrate in kBit/s
            framerate {float} -- frame rate

        Returns:
            float -- O22 score
        """

        # compression degradation
        a1 = self.coeffs["mode0"]["a1"]
        a2 = self.coeffs["mode0"]["a2"]
        a3 = self.coeffs["mode0"]["a3"]
        a4 = self.coeffs["mode0"]["a4"]
        q1 = self.coeffs["q1"]
        q2 = self.coeffs["q2"]
        q3 = self.coeffs["q3"]
        quant = a1 + a2 * np.log(
            a3 + np.log(bitrate_kbps_segment_size) +
            np.log(bitrate_kbps_segment_size * bitrate_kbps_segment_size /
                   (coding_res * framerate) + a4))
        mos_cod_v = q1 + q2 * np.exp(q3 * quant)
        mos_cod_v = utils.constrain(mos_cod_v, 1.0, 5.0)
        deg_cod_v = 100.0 - utils.r_from_mos(mos_cod_v)
        deg_cod_v = utils.constrain(deg_cod_v, 0.0, 100.0)

        # scaling, framerate degradation
        deg_scal_v = self.degradation_due_to_upscaling(coding_res, display_res)
        deg_frame_rate_v = self.degradation_due_to_frame_rate_reduction(
            deg_cod_v, deg_scal_v, framerate)

        # degradation integration
        score = self.degradation_integration(mos_cod_v, deg_cod_v, deg_scal_v,
                                             deg_frame_rate_v)

        logger.debug(
            json.dumps(
                {
                    'coding_res':
                    round(coding_res, 2),
                    'display_res':
                    round(display_res, 2),
                    'bitrate_kbps_segment_size':
                    round(bitrate_kbps_segment_size, 2),
                    'framerate':
                    round(framerate, 2),
                    'mos_cod_v':
                    round(mos_cod_v, 2),
                    'deg_cod_v':
                    round(deg_cod_v, 2),
                    'deg_scal_v':
                    round(deg_scal_v, 2),
                    'deg_frame_rate_v':
                    round(deg_frame_rate_v, 2),
                    'score':
                    round(score, 2)
                },
                indent=True))

        return score