From 179a5c37e070f619f14289bdc0fa66a08219eed9 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Thu, 1 Nov 2012 14:03:04 +0100 Subject: [PATCH] rtpdec: factorize identical code used in several handlers --- libavformat/rtpdec.c | 11 +++++++++++ libavformat/rtpdec.h | 5 +++++ libavformat/rtpdec_h263_rfc2190.c | 12 +++++------- libavformat/rtpdec_jpeg.c | 13 +++---------- libavformat/rtpdec_svq3.c | 9 ++++----- libavformat/rtpdec_vp8.c | 13 +++---------- libavformat/rtpdec_xiph.c | 13 +++---------- 7 files changed, 34 insertions(+), 42 deletions(-) diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c index d16122d40d..a305dd6957 100644 --- a/libavformat/rtpdec.c +++ b/libavformat/rtpdec.c @@ -803,3 +803,14 @@ int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, av_free(value); return 0; } + +int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx) +{ + av_init_packet(pkt); + + pkt->size = avio_close_dyn_buf(*dyn_buf, &pkt->data); + pkt->stream_index = stream_idx; + pkt->destruct = av_destruct_packet; + *dyn_buf = NULL; + return pkt->size; +} diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h index 7f14aa2d68..da3680d6ab 100644 --- a/libavformat/rtpdec.h +++ b/libavformat/rtpdec.h @@ -202,4 +202,9 @@ int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, void av_register_rtp_dynamic_payload_handlers(void); +/** + * Close the dynamic buffer and make a packet from it. + */ +int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx); + #endif /* AVFORMAT_RTPDEC_H */ diff --git a/libavformat/rtpdec_h263_rfc2190.c b/libavformat/rtpdec_h263_rfc2190.c index 163d4eaba7..4957b337c7 100644 --- a/libavformat/rtpdec_h263_rfc2190.c +++ b/libavformat/rtpdec_h263_rfc2190.c @@ -61,7 +61,7 @@ static int h263_handle_packet(AVFormatContext *ctx, PayloadContext *data, { /* Corresponding to header fields in the RFC */ int f, p, i, sbit, ebit, src, r; - int header_size; + int header_size, ret; if (data->newformat) return ff_h263_handle_packet(ctx, data, st, pkt, timestamp, buf, len, @@ -133,7 +133,7 @@ static int h263_handle_packet(AVFormatContext *ctx, PayloadContext *data, /* Check the picture start code, only start buffering a new frame * if this is correct */ if (len > 4 && AV_RB32(buf) >> 10 == 0x20) { - int ret = avio_open_dyn_buf(&data->buf); + ret = avio_open_dyn_buf(&data->buf); if (ret < 0) return ret; data->timestamp = *timestamp; @@ -185,13 +185,11 @@ static int h263_handle_packet(AVFormatContext *ctx, PayloadContext *data, avio_w8(data->buf, data->endbyte); data->endbyte_bits = 0; - av_init_packet(pkt); - pkt->size = avio_close_dyn_buf(data->buf, &pkt->data); - pkt->destruct = av_destruct_packet; - pkt->stream_index = st->index; + ret = ff_rtp_finalize_packet(pkt, &data->buf, st->index); + if (ret < 0) + return ret; if (!i) pkt->flags |= AV_PKT_FLAG_KEY; - data->buf = NULL; return 0; } diff --git a/libavformat/rtpdec_jpeg.c b/libavformat/rtpdec_jpeg.c index 944758d4fc..9f73f7d5dc 100644 --- a/libavformat/rtpdec_jpeg.c +++ b/libavformat/rtpdec_jpeg.c @@ -20,6 +20,7 @@ */ #include "avformat.h" +#include "rtpdec.h" #include "rtpdec_formats.h" #include "libavutil/intreadwrite.h" #include "libavcodec/mjpeg.h" @@ -367,19 +368,11 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, avio_write(jpeg->frame, buf, sizeof(buf)); /* Prepare the JPEG packet. */ - av_init_packet(pkt); - pkt->size = avio_close_dyn_buf(jpeg->frame, &pkt->data); - if (pkt->size < 0) { + if ((ret = ff_rtp_finalize_packet(pkt, &jpeg->frame, st->index)) < 0) { av_log(ctx, AV_LOG_ERROR, "Error occured when getting frame buffer.\n"); - jpeg->frame = NULL; - return pkt->size; + return ret; } - pkt->stream_index = st->index; - pkt->destruct = av_destruct_packet; - - /* Re-init the frame buffer. */ - jpeg->frame = NULL; return 0; } diff --git a/libavformat/rtpdec_svq3.c b/libavformat/rtpdec_svq3.c index bfc602ebb2..087a1e3346 100644 --- a/libavformat/rtpdec_svq3.c +++ b/libavformat/rtpdec_svq3.c @@ -97,12 +97,11 @@ static int svq3_parse_packet (AVFormatContext *s, PayloadContext *sv, avio_write(sv->pktbuf, buf, len); if (end_packet) { - av_init_packet(pkt); - pkt->stream_index = st->index; + int ret = ff_rtp_finalize_packet(pkt, &sv->pktbuf, st->index); + if (ret < 0) + return ret; + *timestamp = sv->timestamp; - pkt->size = avio_close_dyn_buf(sv->pktbuf, &pkt->data); - pkt->destruct = av_destruct_packet; - sv->pktbuf = NULL; return 0; } diff --git a/libavformat/rtpdec_vp8.c b/libavformat/rtpdec_vp8.c index a52be4b644..541a1bcd96 100644 --- a/libavformat/rtpdec_vp8.c +++ b/libavformat/rtpdec_vp8.c @@ -36,15 +36,6 @@ struct PayloadContext { uint32_t timestamp; }; -static void prepare_packet(AVPacket *pkt, PayloadContext *vp8, int stream) -{ - av_init_packet(pkt); - pkt->stream_index = stream; - pkt->size = avio_close_dyn_buf(vp8->data, &pkt->data); - pkt->destruct = av_destruct_packet; - vp8->data = NULL; -} - static int vp8_handle_packet(AVFormatContext *ctx, PayloadContext *vp8, AVStream *st, @@ -133,7 +124,9 @@ static int vp8_handle_packet(AVFormatContext *ctx, avio_write(vp8->data, buf, len); if (end_packet) { - prepare_packet(pkt, vp8, st->index); + int ret = ff_rtp_finalize_packet(pkt, &vp8->data, st->index); + if (ret < 0) + return ret; return 0; } diff --git a/libavformat/rtpdec_xiph.c b/libavformat/rtpdec_xiph.c index 38f12bbc39..40415d8f2f 100644 --- a/libavformat/rtpdec_xiph.c +++ b/libavformat/rtpdec_xiph.c @@ -202,20 +202,13 @@ static int xiph_handle_packet(AVFormatContext * ctx, if (fragmented == 3) { // end of xiph data packet - av_init_packet(pkt); - pkt->size = avio_close_dyn_buf(data->fragment, &pkt->data); - - if (pkt->size < 0) { + int ret = ff_rtp_finalize_packet(pkt, &data->fragment, st->index); + if (ret < 0) { av_log(ctx, AV_LOG_ERROR, "Error occurred when getting fragment buffer."); - return pkt->size; + return ret; } - pkt->stream_index = st->index; - pkt->destruct = av_destruct_packet; - - data->fragment = NULL; - return 0; } }