Multimedia

GStreamer pwg: ch. 19 QoS

Roien 2021. 12. 22.
반응형

 

19.     Quality Of Service (QoS)

실시간 성능의 측정 및 조절기능

 

  • Ÿ   실시간 성능

    n  pipeline clock에 상대적으로 측정됨

    n  보통 sink에서 clock에 대해 buffer의 동기화 시 발생

 

Ÿ   버퍼가 늦게 sink로 도착할 시,

    n  i.e. running time lcock 보다 작을 시 -> QoS에 문제가 있음

 

Ÿ   QoS 문제 이유

    n  high CPU load

    n  network problem

    n  other resource problems (e.g., disk load, memory bottleneck)

 

QOS event

    Ÿ   measurement 결과는 하나 이상의 upstream element datarate 조절에 사용됨

 

adjustment types

    Ÿ   sink 상의 가장 최근의 관측 기반의 short time "emergency" corrections

    Ÿ   sink trend의 관측 기반 long term ratre corrections

 

 

19.1.     Measuring QoS

Ÿ   얼마나 늦게/빨리 오는지 측정

Ÿ   연속적인 두 개 buffer 수신 시간으로 processing time을 측정

Ÿ   보통 running average proportion (통계치를) 유지

Ÿ   QoS event upstream으로 전달

 

 

pipeline clock으로 buffer들을 동기화하는 element는 보통 current QoS를 측정

QOS event를 발생하기 위해 통계치를 유지

 

jitter 측정

    Ÿ   sink로 들어가는 각각의 buffer에 대해 element late, early를 측정함

    Ÿ   negative jitter

        n  early 도착

    Ÿ   positive jitter

        n  late 도착

 

synchronizing element

    Ÿ   processing time

        n  2개의 연속적인 buffer의 수신간의 elapse time을 계산

        n  upstream element에 대해 buffer를 생성/처리하는데 걸리는 시간의 총 량

            s   그래서 processing time이라 부름

    Ÿ   proportion

        n  buffer duration processing time을 비교

        n  얼마나 빠른 upstream data를 생성했는지 측정하기 위해서

        n  ex. upstream 1초 분량을 buffer 0.5초 내 에 생성할 수 있다면,

            s   요구되는 속도의 두 배로 동작하는 것임

            s   반면 2초라면, 너무 느리기에 synchronization을 유지할 수 없음

        n  보통 running average를 가지고 proportion keep

 

    Ÿ   자신의 성능도 측정

        n  성능 문제가 upstream인지 자신인지 알아야 하기 때문

 

    Ÿ   upstream으로 보낼 QOS event 생성을 위해서도 성능 측정

    Ÿ   QoS event sink로 도착하는 각 buffer에 보내짐

 

 

19.2.     Handling QoS

 

source pad QOS event event function으로 받음

QOS event data processing에 사용함

QoS value lock으로 보호해야함

 

[...]
    case GST_EVENT_QOS: {
      GstQOSType type;
      gdouble proportion;
      GstClockTimeDiff diff;
      GstClockTime timestamp;
 
      gst_event_parse_qos (event, &type, &proportion, &diff, &timestamp);
 
      GST_OBJECT_LOCK (decoder);
      priv->qos_proportion = proportion;
      priv->qos_timestamp = timestamp;
      priv->qos_diff = diff;
      GST_OBJECT_UNLOCK (decoder);
 
      res = gst_pad_push_event (decoder->sinkpad, event);
      break;
    }

 

QoS values

    Ÿ   proportion

    Ÿ   timestamp

    Ÿ   diff (= jitter)

 

correction types

    Ÿ   short term correction

    Ÿ   long term correction

 

 

19.2.1.        Short term correction

 

timestamp jitter value를 가지고 shot term correction을 수행

 

Ÿ   jitter > 0 (late)

    n  이전 buffer가 늦게 도착한 것임

    n  timestamp < timestamp + jitter

    n  timestamp + jitter 보다 작은 timestamp를 지닌 버퍼는 drop

        s   현재 timestamp가 늦었으니, 이전것들은 모두 drop

 

buffer duration을 안다면 좀 더 정확히 계산 가능

    Ÿ   timestamp + 2*jitter + duration

 

[...]
 
  GST_OBJECT_LOCK (dec);
  qos_proportion = priv->qos_proportion;
  qos_timestamp = priv->qos_timestamp;
  qos_diff = priv->qos_diff;
  GST_OBJECT_UNLOCK (dec);
 
  /* calculate the earliest valid timestamp */
  if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (qos_timestamp))) {
    if (G_UNLIKELY (qos_diff > 0)) {
      earliest_time = qos_timestamp + 2 * qos_diff + frame_duration;
    } else {
      earliest_time = qos_timestamp + qos_diff;
    }
  } else {
    earliest_time = GST_CLOCK_TIME_NONE;
  }
 
  /* compare earliest_time to running-time of next buffer */
  if (earliest_time > timestamp)
    goto drop_buffer;
 
  [...]

 

19.2.2.        Long term correction

 proportion 값의 의존하여 수행

이 값을 보고 사용하는 자원을 감소 시켜야 함

 

strategies

    Ÿ   영구히 frame dropping 혹은 CPU BW를 감소

        n  어떤 decoder의 경우 B frame들을 skip 할 수 있음

    Ÿ   알고리즘의 복잡도 감소 혹은 lower quality processing 수행

        n  visual 혹은 audible glitches는 발생하지 말아야 함

    Ÿ   lower quality source로 전환

        n  network BW 감소

    Ÿ   특정 부분에 더 많은 CPU cycle 할당

        n  thread priority +

 

proportion ideal 1.0으로 돌아 갈 때 element들은 다시 정상 processing rate로 복귀

 

 

19.3.     Throttling

clock에 동기화 하는 element들은 throttle mode를 설정할 수 있는 property를 노출함

"특정" 시간 내에는 버퍼가 처리 되어야 한다는 것을 강제함

 

throttle mode

    Ÿ   buffer간의 시간차는 설정가능한 throttle interval에 유지됨

        n  효과적으로 buffer rate throttle interval  1 buffer로 제한됨

        n  이를 가지고 framerate를 제한할 수 있음

 

throttling mode

    Ÿ   보통 sink에서만 구현됨

    Ÿ   element throtting mode로 설정되면,

        n  throttle interval에 설정된 jitter를 지닌 QoS event를 upstream으로 전달해야함

        n  이를 통해 upstream은 설정된 throttle interval 내에 남은 buffers skip할지 drop할지를 결정

 

    Ÿ   proportion field

        n  원하는 throttle interval을 얻기 위해 원하는 slowdown에 설정됨

        n  구현은 QoS Throttle type을 사용

            s   QoS Throttle type: proportion jitter가 이들의 구현을 tune

 

default sink base class

    Ÿ   "throttle-time" property를 가짐

 

test 방법

gst-launch-1.0 videotestsrc ! xvimagesink throttle-time=500000000

 

 

19.4.     QoS Messages

QOS event 외에

QOS message가 있음

 

QOS message

    Ÿ   application에게 QoS decision을 알림

    Ÿ   무언가 drop된 시점의 timestamp를 포함

 

QOS message post 시점

    Ÿ   element QoS 이유로 buffer drop한 경우

    Ÿ   element QoS 이유로 processing strategy를 변경한 경우

        n  ex. decoder processing speed를 높이기 위해 모든 B frame drop하기로 결정

 

반응형

'Multimedia' 카테고리의 다른 글

ExoPlayer 지원 codec 및 A/V rendering  (0) 2022.01.05
JPEG  (0) 2021.12.22
정보 이론  (0) 2021.12.22
GStreamer test on Linux (e.g. Ubuntu)  (0) 2015.03.10

댓글