doc/examples/demuxing_decoding: simplify api_mode to refcount

This finalizes the quick cleanup of a753e6c9f5.
This commit is contained in:
Clément Bœsch 2015-09-06 12:35:00 +02:00
parent d74123d03e
commit d9464e9c14
1 changed files with 12 additions and 26 deletions

View File

@ -55,16 +55,11 @@ static AVPacket pkt;
static int video_frame_count = 0; static int video_frame_count = 0;
static int audio_frame_count = 0; static int audio_frame_count = 0;
/* The different ways of decoding and managing data memory. You are not /* Enable or disable frame reference counting. You are not supposed to support
* supposed to support all the modes in your application but pick the one most * both paths in your application but pick the one most appropriate to your
* appropriate to your needs. Look for the use of api_mode in this example to * needs. Look for the use of refcount in this example to see what are the
* see what are the differences of API usage between them */ * differences of API usage between them. */
enum { static int refcount = 0;
API_MODE_NEW_API_REF_COUNT = 1, /* new method, using the frame reference counting */
API_MODE_NEW_API_NO_REF_COUNT = 2, /* new method, without reference counting */
};
static int api_mode = API_MODE_NEW_API_NO_REF_COUNT;
static int decode_packet(int *got_frame, int cached) static int decode_packet(int *got_frame, int cached)
{ {
@ -144,9 +139,9 @@ static int decode_packet(int *got_frame, int cached)
} }
} }
/* If we use the new API with reference counting, we own the data and need /* If we use frame reference counting, we own the data and need
* to de-reference it when we don't use it anymore */ * to de-reference it when we don't use it anymore */
if (*got_frame && api_mode == API_MODE_NEW_API_REF_COUNT) if (*got_frame && refcount)
av_frame_unref(frame); av_frame_unref(frame);
return decoded; return decoded;
@ -180,8 +175,7 @@ static int open_codec_context(int *stream_idx,
} }
/* Init the decoders, with or without reference counting */ /* Init the decoders, with or without reference counting */
if (api_mode == API_MODE_NEW_API_REF_COUNT) av_dict_set(&opts, "refcounted_frames", refcount ? "1" : "0", 0);
av_dict_set(&opts, "refcounted_frames", "1", 0);
if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) { if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
fprintf(stderr, "Failed to open %s codec\n", fprintf(stderr, "Failed to open %s codec\n",
av_get_media_type_string(type)); av_get_media_type_string(type));
@ -227,27 +221,19 @@ int main (int argc, char **argv)
int ret = 0, got_frame; int ret = 0, got_frame;
if (argc != 4 && argc != 5) { if (argc != 4 && argc != 5) {
fprintf(stderr, "usage: %s [-refcount=<old|new_norefcount|new_refcount>] " fprintf(stderr, "usage: %s [-refcount] input_file video_output_file audio_output_file\n"
"input_file video_output_file audio_output_file\n"
"API example program to show how to read frames from an input file.\n" "API example program to show how to read frames from an input file.\n"
"This program reads frames from a file, decodes them, and writes decoded\n" "This program reads frames from a file, decodes them, and writes decoded\n"
"video frames to a rawvideo file named video_output_file, and decoded\n" "video frames to a rawvideo file named video_output_file, and decoded\n"
"audio frames to a rawaudio file named audio_output_file.\n\n" "audio frames to a rawaudio file named audio_output_file.\n\n"
"If the -refcount option is specified, the program use the\n" "If the -refcount option is specified, the program use the\n"
"reference counting frame system which allows keeping a copy of\n" "reference counting frame system which allows keeping a copy of\n"
"the data for longer than one decode call. If unset, it's using\n" "the data for longer than one decode call.\n"
"the classic old method.\n"
"\n", argv[0]); "\n", argv[0]);
exit(1); exit(1);
} }
if (argc == 5) { if (argc == 5 && !strcmp(argv[1], "-refcount")) {
const char *mode = argv[1] + strlen("-refcount="); refcount = 1;
if (!strcmp(mode, "new_norefcount")) api_mode = API_MODE_NEW_API_NO_REF_COUNT;
else if (!strcmp(mode, "new_refcount")) api_mode = API_MODE_NEW_API_REF_COUNT;
else {
fprintf(stderr, "unknow mode '%s'\n", mode);
exit(1);
}
argv++; argv++;
} }
src_filename = argv[1]; src_filename = argv[1];