[FFmpeg-devel] [PATCH 2/2] ffprobe: refactor frames decoding.
Stefano Sabatini
stefasab at gmail.com
Wed Jul 25 00:57:55 CEST 2012
On date Tuesday 2012-07-24 16:01:35 +0200, Nicolas George encoded:
>
> Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
> ---
> ffprobe.c | 49 ++++++++++++++++++++++---------------------------
> 1 file changed, 22 insertions(+), 27 deletions(-)
>
>
> Slightly less code duplication, and easier to extend for what I want to do.
>
> The output is unchanged for all FATE samples that can be decoded without
> additional options.
>
>
> diff --git a/ffprobe.c b/ffprobe.c
> index 9de0d59..531cea2 100644
> --- a/ffprobe.c
> +++ b/ffprobe.c
> @@ -1653,36 +1653,45 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream)
> fflush(stdout);
> }
>
> -static av_always_inline int get_decoded_frame(AVFormatContext *fmt_ctx,
> - AVFrame *frame, int *got_frame,
> - AVPacket *pkt)
> +static av_always_inline int process_decoded_frame(WriterContext *w,
> + AVFormatContext *fmt_ctx,
> + AVFrame *frame, AVPacket *pkt)
process_decoded_frame -> process_frame
the latter is simpler and seems less misleading (since the frame is
not yet decoded)
> {
> AVCodecContext *dec_ctx = fmt_ctx->streams[pkt->stream_index]->codec;
> - int ret = 0;
> + int ret = 0, got_frame = 0;
>
> - *got_frame = 0;
> + avcodec_get_frame_defaults(frame);
> if (dec_ctx->codec) {
> switch (dec_ctx->codec_type) {
> case AVMEDIA_TYPE_VIDEO:
> - ret = avcodec_decode_video2(dec_ctx, frame, got_frame, pkt);
> + ret = avcodec_decode_video2(dec_ctx, frame, &got_frame, pkt);
> if (!ret)
> ret = pkt->size;
> break;
>
> case AVMEDIA_TYPE_AUDIO:
> - ret = avcodec_decode_audio4(dec_ctx, frame, got_frame, pkt);
> + ret = avcodec_decode_audio4(dec_ctx, frame, &got_frame, pkt);
> break;
> }
> }
>
> - return ret;
> + if (ret < 0)
> + return ret;
> + pkt->data += ret;
> + pkt->size -= ret;
> + if (got_frame) {
> + nb_streams_frames[pkt->stream_index]++;
> + if (do_show_frames)
> + show_frame(w, frame, fmt_ctx->streams[pkt->stream_index]);
> + }
> + return got_frame;
> }
>
> static void read_packets(WriterContext *w, AVFormatContext *fmt_ctx)
> {
> AVPacket pkt, pkt1;
> AVFrame frame;
> - int i = 0, ret, got_frame;
> + int i = 0;
>
> av_init_packet(&pkt);
>
> @@ -1694,17 +1703,8 @@ static void read_packets(WriterContext *w, AVFormatContext *fmt_ctx)
> }
> if (do_read_frames) {
> pkt1 = pkt;
> - while (pkt1.size) {
> - avcodec_get_frame_defaults(&frame);
> - ret = get_decoded_frame(fmt_ctx, &frame, &got_frame, &pkt1);
> - if (ret < 0 || !got_frame)
> - break;
> - if (do_show_frames)
> - show_frame(w, &frame, fmt_ctx->streams[pkt.stream_index]);
> - pkt1.data += ret;
> - pkt1.size -= ret;
> - nb_streams_frames[pkt.stream_index]++;
> - }
> + while (pkt1.size &&
> + process_decoded_frame(w, fmt_ctx, &frame, &pkt1) > 0);
nit: maybe drop "> 0".
> }
> av_free_packet(&pkt);
> }
> @@ -1714,13 +1714,8 @@ static void read_packets(WriterContext *w, AVFormatContext *fmt_ctx)
> //Flush remaining frames that are cached in the decoder
> for (i = 0; i < fmt_ctx->nb_streams; i++) {
> pkt.stream_index = i;
> - while (get_decoded_frame(fmt_ctx, &frame, &got_frame, &pkt) >= 0 && got_frame) {
> - if (do_read_frames) {
> - if (do_show_frames)
> - show_frame(w, &frame, fmt_ctx->streams[pkt.stream_index]);
> - nb_streams_frames[pkt.stream_index]++;
> - }
> - }
> + if (do_read_frames)
> + while (process_decoded_frame(w, fmt_ctx, &frame, &pkt) > 0);
Now this is doing:
pkt->data += ret;
pkt->size -= ret;
and pkt->data is NULL.
Verify that the decoder is returning 0 when the data is flushed (as I
suppose it does).
Looks good otherwise, thanks.
--
FFmpeg = Fierce and Fundamental Mysterious Pure Enchanting Gangster
More information about the ffmpeg-devel
mailing list