| @TEMPLATE encoder_tmpl.c |
| VP8 Scalable Frame Patterns |
| =========================== |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION |
| This is an example demonstrating how to control the VP8 encoder's |
| reference frame selection and update mechanism for video applications |
| that benefit from a scalable bitstream. |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION |
| |
| |
| Configuration |
| ------------- |
| Scalable frame patterns are most useful in an error resilient context, |
| so error resiliency mode is enabled, as in the `error_resilient.c` |
| example. In addition, we want to disable automatic keyframe selection, |
| so we force an interval of 1000 frames. |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG2 |
| |
| /* Enable error resilient mode */ |
| cfg.g_error_resilient = 1; |
| cfg.g_lag_in_frames = 0; |
| cfg.kf_mode = VPX_KF_FIXED; |
| |
| /* Disable automatic keyframe placement */ |
| cfg.kf_min_dist = cfg.kf_max_dist = 1000; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG2 |
| |
| This example uses the following frame pattern (L->last_frame, |
| G->golden_frame, A->alt_ref_frame): |
| |
| * Frame 0 Intra, use none, update L&G&A |
| * Frame 1 Inter, use LGA, update none |
| * Frame 2 Inter, use LGA, update L |
| * Frame 3 Inter, use LGA, update none |
| * Frame 4 Inter, use GA, update L&G |
| * Frame 5 Inter, use LGA, update none |
| * Frame 6 Inter, use LGA, update L |
| * Frame 7 Inter, use LGA, update none |
| * Frame 8 Inter, use A, update L&G&A |
| * Frame 9 Inter, use LGA, update none |
| * Frame 10 Inter, use LGA, update L |
| * Frame 11 Inter, use LGA, update none |
| * Frame 12 Inter, use GA, update L&G |
| * Frame 13 Inter, use LGA, update none |
| * Frame 14 Inter, use LGA, update L |
| * Frame 15 Inter, use LGA, update none |
| * ...Repeats the pattern from frame 0 |
| |
| Change this variable to test the 3 decodable streams case. |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_VARS |
| int num_streams = 5; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_VARS |
| |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PER_FRAME_CFG |
| flags = 0; |
| if(num_streams == 5) |
| { |
| switch(frame_cnt % 16) { |
| case 0: |
| flags |= VPX_EFLAG_FORCE_KF; |
| flags |= VP8_EFLAG_FORCE_GF; |
| flags |= VP8_EFLAG_FORCE_ARF; |
| break; |
| case 1: |
| case 3: |
| case 5: |
| case 7: |
| case 9: |
| case 11: |
| case 13: |
| case 15: |
| flags |= VP8_EFLAG_NO_UPD_LAST; |
| flags |= VP8_EFLAG_NO_UPD_GF; |
| flags |= VP8_EFLAG_NO_UPD_ARF; |
| break; |
| case 2: |
| case 6: |
| case 10: |
| case 14: |
| break; |
| case 4: |
| flags |= VP8_EFLAG_NO_REF_LAST; |
| flags |= VP8_EFLAG_FORCE_GF; |
| break; |
| case 8: |
| flags |= VP8_EFLAG_NO_REF_LAST; |
| flags |= VP8_EFLAG_NO_REF_GF; |
| flags |= VP8_EFLAG_FORCE_GF; |
| flags |= VP8_EFLAG_FORCE_ARF; |
| break; |
| case 12: |
| flags |= VP8_EFLAG_NO_REF_LAST; |
| flags |= VP8_EFLAG_FORCE_GF; |
| break; |
| } |
| } |
| else |
| { |
| switch(frame_cnt % 9) { |
| case 0: |
| if(frame_cnt==0) |
| { |
| flags |= VPX_EFLAG_FORCE_KF; |
| } |
| else |
| { |
| cfg.rc_max_quantizer = 26; |
| cfg.rc_min_quantizer = 0; |
| cfg.rc_target_bitrate = 300; |
| flags |= VP8_EFLAG_NO_REF_LAST; |
| flags |= VP8_EFLAG_NO_REF_ARF; |
| } |
| flags |= VP8_EFLAG_FORCE_GF; |
| flags |= VP8_EFLAG_FORCE_ARF; |
| break; |
| case 1: |
| case 2: |
| case 4: |
| case 5: |
| case 7: |
| case 8: |
| cfg.rc_max_quantizer = 45; |
| cfg.rc_min_quantizer = 0; |
| cfg.rc_target_bitrate = 230; |
| break; |
| case 3: |
| case 6: |
| cfg.rc_max_quantizer = 45; |
| cfg.rc_min_quantizer = 0; |
| cfg.rc_target_bitrate = 215; |
| flags |= VP8_EFLAG_NO_REF_LAST; |
| flags |= VP8_EFLAG_FORCE_ARF; |
| break; |
| } |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PER_FRAME_CFG |
| |
| Observing The Effects |
| --------------------- |
| Use the `decode_with_drops` example to decode with various dropped frame |
| patterns. Good patterns to start with are 1/2, 3/4, 7/8, and 15/16 |
| drops. |