| @TEMPLATE encoder_tmpl.c |
| VP8 Set Reference Frame |
| ======================= |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION |
| This is an example demonstrating how to overwrite the VP8 encoder's |
| internal reference frame. In the sample we set the last frame to the |
| current frame. If this is done at a cut scene it will avoid a keyframe. |
| This technique could be used to bounce between two cameras. |
| |
| Note that the decoder would also have to set the reference frame to the |
| same value on the same frame, or the video will become corrupt. |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION |
| |
| |
| Usage |
| ----- |
| This example adds a single argument to the `simple_encoder` example, |
| which specifies the frame number to update the reference frame on. |
| The parameter is parsed as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE |
| if(argc!=6) |
| die("Usage: %s <width> <height> <infile> <outfile> <frame>\n", |
| argv[0]); |
| |
| update_frame_num = atoi(argv[5]); |
| if(!update_frame_num) |
| die("Couldn't parse frame number '%s'\n", argv[5]); |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE |
| |
| |
| Extra Variables |
| --------------- |
| This example maintains the frame number passed on the command line |
| in the `update_frame_num` variable: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_VARS |
| int update_frame_num = 0; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_VARS |
| |
| |
| Configuration |
| ------------- |
| |
| The reference frame is updated on the frame specified on the command |
| line. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENCODE_FRAME |
| frame_avail = read_frame(infile, &raw); |
| |
| if(frame_cnt + 1 == update_frame_num) { |
| vpx_ref_frame_t ref; |
| |
| ref.frame_type = VP8_LAST_FRAME; |
| ref.img = raw; |
| |
| if(vpx_codec_control(&codec, VP8_SET_REFERENCE, &ref)) |
| die_codec(&codec, "Failed to set reference frame"); |
| } |
| |
| if(vpx_codec_encode(&codec, frame_avail? &raw : NULL, frame_cnt, |
| 1, flags, VPX_DL_REALTIME)) |
| die_codec(&codec, "Failed to encode frame"); |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENCODE_FRAME |
| |
| |
| Observing The Effects |
| --------------------- |
| Use the `simple_encoder` example to encode a sample with a cut scene. |
| Determine the frame number of the cut scene by looking for a generated |
| key-frame (indicated by a 'K'). Supply that frame number as an argument |
| to this example, and observe that no key-frame is generated. |