@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.