我們已經知道,要找一個在上下限之間的排程,但要怎麼找才是 最好的呢?最理想的情況是能找出一個 CBR 的傳輸速率,但是實際上 很 難 做 到 整 個 影 片 的 長 度 只 有 一 個 CBR 來 傳 ; 所 以 我 們 採 用 piecewise CBR 的方式,也就是由許多段 CBR 所組成的排程。選取的 方式是以可以延伸最長的片段為主,一直到了會發生 underflow 或 overflow 的情況時,才做一次轉折(改變速率)。轉折點(Critical point)都會放在上限或是下限的角角處,在後面的圖例中可以觀察 到。圖 2.4 是 MVBA 的 block diagram 圖。
cmin' > cmax 決定初始
cmax' < cmin yes
No
yes
No
MVBA 的 pseudo-code 列出如下:
B D
//set inital values
1 ts = 0, te =1, t 1, t 1
be underflow) 6 { output a segment(ts~t ); let next ts = t , te=ts+1 }
MVBA optimal smoothing algorithm pseudo-codes
接著我們敘述一下其運算過程。一開始我們以時間 0 為起點,然 後先給定一些預設值,如 cmax=b; cmin=d(1),td=tb=1;cmax 代表從 起點到 te 為止,可以合法選擇的斜率中,最大的值。一般情況的計
+ ≤ ≤ 是在 index165 時發生,td=165,以藍色實線表示;cmax 在 index168 發生,tb=168,以紅色虛線表示。而從 ts 到 te'的最小斜率,即 B(164) 到 D(170)連線的斜率,比紅色虛線還大,此即為 case1 的情況,所
的下一段 CBR 是下一個迴圈決定的。
圖 2.5 不定轉折點就會 underflow 的情形
Case2: 起點到 te'的最大斜率小於目前的 cmin,表示之前合法能選 的斜率不夠小,再往下就會 overflow 如圖 2.6。這種情況就定出一 條 CBR,意即從起始點到 D(td)畫條線,並選 td 當起始點,重新開始。
圖 2.6 以 frame index 300 為起點,預設 td 和 tb 都是 index 301,
預設 te' 為 index 302,而此時就找不到可行的斜率了。因為從 ts 到 te'的最大斜率,即圖中黑色實線的斜率,比可行的最小斜率 cmin(藍色實線)還小;此即為 case2 的情況,所以我們定 D(td)為轉 折點,並定出一段 CBR(ts 到 td 這段)。
圖 2.6 不定轉折點就會 overflow 的情形
Case3:不是 case1 或 case2 的情況。我們令起點到 te'的最大/最小 斜率為 cmax'/cmin', 比較 cmin 和 cmin',取較大的當新的 cmin,
並且令 td 等於較大那個斜率對應到的 t;同理,比較 cmax 和 cmax',
取小的當新的 cmax。並且令 tb 等於較大那個斜率對應到的 t,以圖 2.7 為例,ts=246,紅色虛線和藍色實線表示 te'=251 時的 cmax 和 cmin,而 tb=251,td=248。當 te'前進到 252 時,我們會維持紅色 虛線的斜率為 cmax, tb 依舊是 251;綠色實線之斜率為新的 cmin,
而 td 由 248 更新成 252。最後令 te=te+1。
圖 2.7 case 3 的一個例子
下一次迴圈一開始會讓 te'=te+1,並重新計算從起始點 ts 到時 間 te'的最大和最小斜率。然後再和目前的 cmax 及 cmin 比較,又 會有三種情況…這個迴圈會一直持續到 ts == N 為止。
簡言之,演算法會想找出一條在上下限之間且能延伸最遠的線 段,也就是 case 3 不斷往推進 te 的情況,一直到會有 overflow 或 underflow 才決定線段的終點(即 case 1 和 case 2 的狀況),並以終 點為新的起始點,再次重複延伸線段的動作,一直重複到整段影片結
束為止。