From 0dd704dbd4d77614952c2aebf631451d2ed830c5 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 30 Nov 2011 17:28:48 -0500 Subject: [PATCH 01/25] vble: remove unused variable len. Signed-off-by: Michael Niedermayer Signed-off-by: Ronald S. Bultje --- libavcodec/vble.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/libavcodec/vble.c b/libavcodec/vble.c index 9589b535ec..839af2bfdc 100644 --- a/libavcodec/vble.c +++ b/libavcodec/vble.c @@ -91,7 +91,6 @@ static void vble_restore_plane(VBLEContext *ctx, int plane, int offset, AVFrame *pic = ctx->avctx->coded_frame; uint8_t *dst = pic->data[plane]; uint8_t *val = ctx->val + offset; - uint8_t *len = ctx->len + offset; uint8_t a, b, c; int stride = pic->linesize[plane]; int i, j; @@ -116,7 +115,6 @@ static void vble_restore_plane(VBLEContext *ctx, int plane, int offset, } dst += stride; val += width; - len += width; } } From e46abbcf77141a33ac21bbe1b71bdf934a658fb9 Mon Sep 17 00:00:00 2001 From: Derek Buitenhuis Date: Wed, 30 Nov 2011 17:28:49 -0500 Subject: [PATCH 02/25] vble: merge len and val arrays There's no reason to use two arrays for this. Based off commit 2fea60c60084c4e70d7cef128ea3bca5690ce465 to FFmpeg by Michael Niedermayer. Signed-off-by: Derek Buitenhuis Signed-off-by: Ronald S. Bultje --- libavcodec/vble.c | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/libavcodec/vble.c b/libavcodec/vble.c index 839af2bfdc..09a9499361 100644 --- a/libavcodec/vble.c +++ b/libavcodec/vble.c @@ -34,8 +34,7 @@ typedef struct { int size; int flags; - uint8_t *len; - uint8_t *val; + uint8_t *val; /* First holds the lengths of vlc symbols and then their values */ } VBLEContext; static uint8_t vble_read_reverse_unary(GetBitContext *gb) @@ -63,23 +62,20 @@ static int vble_unpack(VBLEContext *ctx, GetBitContext *gb) /* Read all the lengths in first */ for (i = 0; i < ctx->size; i++) { - ctx->len[i] = vble_read_reverse_unary(gb); + ctx->val[i] = vble_read_reverse_unary(gb); - if (ctx->len[i] == UINT8_MAX) + if (ctx->val[i] == UINT8_MAX) return -1; } - /* For any values that have length 0 */ - memset(ctx->val, 0, ctx->size); - for (i = 0; i < ctx->size; i++) { /* Check we have enough bits left */ - if (get_bits_left(gb) < ctx->len[i]) + if (get_bits_left(gb) < ctx->val[i]) return -1; /* get_bits can't take a length of 0 */ - if (ctx->len[i]) - ctx->val[i] = (1 << ctx->len[i]) + get_bits(gb, ctx->len[i]) - 1; + if (ctx->val[i]) + ctx->val[i] = (1 << ctx->val[i]) + get_bits(gb, ctx->val[i]) - 1; } return 0; @@ -188,7 +184,6 @@ static av_cold int vble_decode_close(AVCodecContext *avctx) avctx->release_buffer(avctx, pic); av_freep(&avctx->coded_frame); - av_freep(&ctx->len); av_freep(&ctx->val); return 0; @@ -214,14 +209,6 @@ static av_cold int vble_decode_init(AVCodecContext *avctx) ctx->size = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height); - ctx->len = av_malloc(ctx->size * sizeof(*ctx->len)); - - if (!ctx->len) { - av_log(avctx, AV_LOG_ERROR, "Could not allocate lengths buffer.\n"); - vble_decode_close(avctx); - return AVERROR(ENOMEM); - } - ctx->val = av_malloc(ctx->size * sizeof(*ctx->val)); if (!ctx->val) { From 317ea97bff5135666369570c35f1ea6ef06103fb Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 30 Nov 2011 17:28:50 -0500 Subject: [PATCH 03/25] vble: remove flags copy, its not used in any speed relevant code. Signed-off-by: Michael Niedermayer Signed-off-by: Ronald S. Bultje --- libavcodec/vble.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libavcodec/vble.c b/libavcodec/vble.c index 09a9499361..b510b6c313 100644 --- a/libavcodec/vble.c +++ b/libavcodec/vble.c @@ -33,7 +33,6 @@ typedef struct { AVCodecContext *avctx; int size; - int flags; uint8_t *val; /* First holds the lengths of vlc symbols and then their values */ } VBLEContext; @@ -161,7 +160,7 @@ static int vble_decode_frame(AVCodecContext *avctx, void *data, int *data_size, vble_restore_plane(ctx, 0, offset, avctx->width, avctx->height); /* Chroma */ - if (!(ctx->flags & CODEC_FLAG_GRAY)) { + if (!(ctx->avctx->flags & CODEC_FLAG_GRAY)) { offset += avctx->width * avctx->height; vble_restore_plane(ctx, 1, offset, width_uv, height_uv); @@ -195,7 +194,6 @@ static av_cold int vble_decode_init(AVCodecContext *avctx) /* Stash for later use */ ctx->avctx = avctx; - ctx->flags = avctx->flags; avctx->pix_fmt = PIX_FMT_YUV420P; avctx->bits_per_raw_sample = 8; From adfdcf87b15d70ae5fcf9ddf28e400fb2ba5c8fe Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 30 Nov 2011 17:28:51 -0500 Subject: [PATCH 04/25] vble: use dsp.add_hfyu_median_prediction() this allows asm optimizations to be used. Signed-off-by: Michael Niedermayer Signed-off-by: Ronald S. Bultje --- libavcodec/vble.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/libavcodec/vble.c b/libavcodec/vble.c index b510b6c313..a13bcf8c5f 100644 --- a/libavcodec/vble.c +++ b/libavcodec/vble.c @@ -27,10 +27,12 @@ #define ALT_BITSTREAM_READER_LE #include "avcodec.h" +#include "dsputil.h" #include "get_bits.h" typedef struct { AVCodecContext *avctx; + DSPContext dsp; int size; uint8_t *val; /* First holds the lengths of vlc symbols and then their values */ @@ -86,27 +88,22 @@ static void vble_restore_plane(VBLEContext *ctx, int plane, int offset, AVFrame *pic = ctx->avctx->coded_frame; uint8_t *dst = pic->data[plane]; uint8_t *val = ctx->val + offset; - uint8_t a, b, c; int stride = pic->linesize[plane]; - int i, j; + int i, j, left, left_top; for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) { - dst[j] = (val[j] >> 1) ^ -(val[j] & 1); - - /* Top line and left column are not predicted */ - if (!j) - continue; - - if (!i) { - dst[j] += dst[j - 1]; - continue; - } - - a = dst[j - 1]; - b = dst[j - stride]; - c = a + b - dst[j - 1 - stride]; - dst[j] += mid_pred(a, b, c); + for (j = 0; j < width; j++) + val[j] = (val[j] >> 1) ^ -(val[j] & 1); + + if (i) { + left = 0; + left_top = dst[-stride]; + ctx->dsp.add_hfyu_median_prediction(dst, dst-stride, val, + width, &left, &left_top); + } else { + dst[0] = val[0]; + for (j = 1; j < width; j++) + dst[j] = val[j] + dst[j - 1]; } dst += stride; val += width; @@ -194,6 +191,7 @@ static av_cold int vble_decode_init(AVCodecContext *avctx) /* Stash for later use */ ctx->avctx = avctx; + dsputil_init(&ctx->dsp, avctx); avctx->pix_fmt = PIX_FMT_YUV420P; avctx->bits_per_raw_sample = 8; From abe20c59b93426958624e16e89b24e0c0b43f370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 1 Dec 2011 11:24:23 +0200 Subject: [PATCH 05/25] http: Make sure proxyauth is initialized MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This string will be passed to ff_http_auth_create_response even if no proxy is used, resulting in reading uninitialized memory. The other auth string is always initialized by av_url_split. Signed-off-by: Martin Storsjö --- libavformat/http.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/http.c b/libavformat/http.c index 63cfecd332..a9b4d5a573 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -90,7 +90,7 @@ static int http_open_cnx(URLContext *h) { const char *path, *proxy_path, *lower_proto = "tcp", *local_path; char hostname[1024], hoststr[1024], proto[10]; - char auth[1024], proxyauth[1024]; + char auth[1024], proxyauth[1024] = ""; char path1[1024]; char buf[1024], urlbuf[1024]; int port, use_proxy, err, location_changed = 0, redirects = 0; From 1ca87d600bc069fe4cf497c410b4f794e88a122d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 1 Dec 2011 11:07:35 +0200 Subject: [PATCH 06/25] applehttpproto: Use the close function if the open function fails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This should clean up leaked memory. Signed-off-by: Martin Storsjö --- libavformat/applehttpproto.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/libavformat/applehttpproto.c b/libavformat/applehttpproto.c index 0e64dadb39..8dbcf2d394 100644 --- a/libavformat/applehttpproto.c +++ b/libavformat/applehttpproto.c @@ -174,6 +174,17 @@ fail: return ret; } +static int applehttp_close(URLContext *h) +{ + AppleHTTPContext *s = h->priv_data; + + free_segment_list(s); + free_variant_list(s); + ffurl_close(s->seg_hd); + av_free(s); + return 0; +} + static int applehttp_open(URLContext *h, const char *uri, int flags) { AppleHTTPContext *s; @@ -229,7 +240,7 @@ static int applehttp_open(URLContext *h, const char *uri, int flags) return 0; fail: - av_free(s); + applehttp_close(h); return ret; } @@ -287,17 +298,6 @@ retry: goto start; } -static int applehttp_close(URLContext *h) -{ - AppleHTTPContext *s = h->priv_data; - - free_segment_list(s); - free_variant_list(s); - ffurl_close(s->seg_hd); - av_free(s); - return 0; -} - URLProtocol ff_applehttp_protocol = { .name = "applehttp", .url_open = applehttp_open, From 6af354436ca99324b6d35e8a7a24c1abf6667595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 1 Dec 2011 11:30:03 +0200 Subject: [PATCH 07/25] md5proto: Remove the get_file_handle function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The private data pointer isn't a file handle, this protocol doesn't have any file handle to return. Signed-off-by: Martin Storsjö --- libavformat/md5proto.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libavformat/md5proto.c b/libavformat/md5proto.c index c580bfde80..796b4ea682 100644 --- a/libavformat/md5proto.c +++ b/libavformat/md5proto.c @@ -79,16 +79,11 @@ static int md5_close(URLContext *h) return err; } -static int md5_get_handle(URLContext *h) -{ - return (intptr_t)h->priv_data; -} URLProtocol ff_md5_protocol = { .name = "md5", .url_open = md5_open, .url_write = md5_write, .url_close = md5_close, - .url_get_file_handle = md5_get_handle, .priv_data_size = PRIV_SIZE, }; From 02490bf3587d86a730e0de12572026504e2cb942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 1 Dec 2011 11:34:06 +0200 Subject: [PATCH 08/25] rtmp: Clean up properly if the handshake failed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This prevents memory leaks if this function returns an error. Signed-off-by: Martin Storsjö --- libavformat/rtmpproto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index 37c3d95aca..979c5b6562 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -826,7 +826,7 @@ static int rtmp_open(URLContext *s, const char *uri, int flags) rt->state = STATE_START; if (rtmp_handshake(s, rt)) - return -1; + goto fail; rt->chunk_size = 128; rt->state = STATE_HANDSHAKED; From 9c6777bd9367e8680bb7ada9852f5760dc8a8594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 1 Dec 2011 11:48:03 +0200 Subject: [PATCH 09/25] mmsh: Properly clean up if the second ffurl_alloc failed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/mmsh.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libavformat/mmsh.c b/libavformat/mmsh.c index 8a6de322cf..3761016f81 100644 --- a/libavformat/mmsh.c +++ b/libavformat/mmsh.c @@ -262,9 +262,9 @@ static int mmsh_open(URLContext *h, const char *uri, int flags) // close the socket and then reopen it for sending the second play request. ffurl_close(mms->mms_hd); memset(headers, 0, sizeof(headers)); - if (ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ, - &h->interrupt_callback) < 0) { - return AVERROR(EIO); + if ((err = ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ, + &h->interrupt_callback)) < 0) { + goto fail; } stream_selection = av_mallocz(mms->stream_num * 19 + 1); if (!stream_selection) From 7e58050590c556643869a1cc57215026ff88b0db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 1 Dec 2011 11:44:21 +0200 Subject: [PATCH 10/25] proto: Use .priv_data_size to allocate the private context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This simplifies the open functions by avoiding one function call that needs error checking, reducing the amount of extra bulk code. Signed-off-by: Martin Storsjö --- libavformat/applehttpproto.c | 8 ++------ libavformat/concat.c | 10 ++-------- libavformat/gopher.c | 10 ++-------- libavformat/librtmp.c | 24 +++++++++++------------- libavformat/mmsh.c | 7 ++----- libavformat/mmst.c | 7 ++----- libavformat/rtmpproto.c | 8 ++------ libavformat/rtpproto.c | 10 ++-------- libavformat/tcp.c | 10 ++-------- libavformat/udp.c | 10 ++-------- 10 files changed, 29 insertions(+), 75 deletions(-) diff --git a/libavformat/applehttpproto.c b/libavformat/applehttpproto.c index 8dbcf2d394..245422be40 100644 --- a/libavformat/applehttpproto.c +++ b/libavformat/applehttpproto.c @@ -181,23 +181,18 @@ static int applehttp_close(URLContext *h) free_segment_list(s); free_variant_list(s); ffurl_close(s->seg_hd); - av_free(s); return 0; } static int applehttp_open(URLContext *h, const char *uri, int flags) { - AppleHTTPContext *s; + AppleHTTPContext *s = h->priv_data; int ret, i; const char *nested_url; if (flags & AVIO_FLAG_WRITE) return AVERROR(ENOSYS); - s = av_mallocz(sizeof(AppleHTTPContext)); - if (!s) - return AVERROR(ENOMEM); - h->priv_data = s; h->is_streamed = 1; if (av_strstart(uri, "applehttp+", &nested_url)) { @@ -304,4 +299,5 @@ URLProtocol ff_applehttp_protocol = { .url_read = applehttp_read, .url_close = applehttp_close, .flags = URL_PROTOCOL_FLAG_NESTED_SCHEME, + .priv_data_size = sizeof(AppleHTTPContext), }; diff --git a/libavformat/concat.c b/libavformat/concat.c index 1501cbcba4..4bfa6288ba 100644 --- a/libavformat/concat.c +++ b/libavformat/concat.c @@ -50,7 +50,6 @@ static av_cold int concat_close(URLContext *h) err |= ffurl_close(nodes[i].uc); av_freep(&data->nodes); - av_freep(&h->priv_data); return err < 0 ? -1 : 0; } @@ -62,16 +61,11 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags) int64_t size; size_t len, i; URLContext *uc; - struct concat_data *data; + struct concat_data *data = h->priv_data; struct concat_nodes *nodes; av_strstart(uri, "concat:", &uri); - /* creating data */ - if (!(data = av_mallocz(sizeof(*data)))) - return AVERROR(ENOMEM); - h->priv_data = data; - for (i = 0, len = 1; uri[i]; i++) if (uri[i] == *AV_CAT_SEPARATOR) /* integer overflow */ @@ -81,7 +75,6 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags) } if (!(nodes = av_malloc(sizeof(*nodes) * len))) { - av_freep(&h->priv_data); return AVERROR(ENOMEM); } else data->nodes = nodes; @@ -196,4 +189,5 @@ URLProtocol ff_concat_protocol = { .url_read = concat_read, .url_seek = concat_seek, .url_close = concat_close, + .priv_data_size = sizeof(struct concat_data), }; diff --git a/libavformat/gopher.c b/libavformat/gopher.c index 5f8c320f10..0543878ba8 100644 --- a/libavformat/gopher.c +++ b/libavformat/gopher.c @@ -72,24 +72,17 @@ static int gopher_close(URLContext *h) ffurl_close(s->hd); s->hd = NULL; } - av_freep(&h->priv_data); return 0; } static int gopher_open(URLContext *h, const char *uri, int flags) { - GopherContext *s; + GopherContext *s = h->priv_data; char hostname[1024], auth[1024], path[1024], buf[1024]; int port, err; h->is_streamed = 1; - s = av_malloc(sizeof(GopherContext)); - if (!s) { - return AVERROR(ENOMEM); - } - h->priv_data = s; - /* needed in any case to build the host string */ av_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port, path, sizeof(path), uri); @@ -127,4 +120,5 @@ URLProtocol ff_gopher_protocol = { .url_read = gopher_read, .url_write = gopher_write, .url_close = gopher_close, + .priv_data_size = sizeof(GopherContext), }; diff --git a/libavformat/librtmp.c b/libavformat/librtmp.c index 6ccb66bd8c..c04c833c01 100644 --- a/libavformat/librtmp.c +++ b/libavformat/librtmp.c @@ -52,7 +52,6 @@ static int rtmp_close(URLContext *s) RTMP *r = s->priv_data; RTMP_Close(r); - av_free(r); return 0; } @@ -70,13 +69,9 @@ static int rtmp_close(URLContext *s) */ static int rtmp_open(URLContext *s, const char *uri, int flags) { - RTMP *r; + RTMP *r = s->priv_data; int rc; - r = av_mallocz(sizeof(RTMP)); - if (!r) - return AVERROR(ENOMEM); - switch (av_log_get_level()) { default: case AV_LOG_FATAL: rc = RTMP_LOGCRIT; break; @@ -103,11 +98,9 @@ static int rtmp_open(URLContext *s, const char *uri, int flags) goto fail; } - s->priv_data = r; s->is_streamed = 1; return 0; fail: - av_free(r); return rc; } @@ -167,7 +160,8 @@ URLProtocol ff_rtmp_protocol = { .url_close = rtmp_close, .url_read_pause = rtmp_read_pause, .url_read_seek = rtmp_read_seek, - .url_get_file_handle = rtmp_get_file_handle + .url_get_file_handle = rtmp_get_file_handle, + .priv_data_size = sizeof(RTMP), }; URLProtocol ff_rtmpt_protocol = { @@ -178,7 +172,8 @@ URLProtocol ff_rtmpt_protocol = { .url_close = rtmp_close, .url_read_pause = rtmp_read_pause, .url_read_seek = rtmp_read_seek, - .url_get_file_handle = rtmp_get_file_handle + .url_get_file_handle = rtmp_get_file_handle, + .priv_data_size = sizeof(RTMP), }; URLProtocol ff_rtmpe_protocol = { @@ -189,7 +184,8 @@ URLProtocol ff_rtmpe_protocol = { .url_close = rtmp_close, .url_read_pause = rtmp_read_pause, .url_read_seek = rtmp_read_seek, - .url_get_file_handle = rtmp_get_file_handle + .url_get_file_handle = rtmp_get_file_handle, + .priv_data_size = sizeof(RTMP), }; URLProtocol ff_rtmpte_protocol = { @@ -200,7 +196,8 @@ URLProtocol ff_rtmpte_protocol = { .url_close = rtmp_close, .url_read_pause = rtmp_read_pause, .url_read_seek = rtmp_read_seek, - .url_get_file_handle = rtmp_get_file_handle + .url_get_file_handle = rtmp_get_file_handle, + .priv_data_size = sizeof(RTMP), }; URLProtocol ff_rtmps_protocol = { @@ -211,5 +208,6 @@ URLProtocol ff_rtmps_protocol = { .url_close = rtmp_close, .url_read_pause = rtmp_read_pause, .url_read_seek = rtmp_read_seek, - .url_get_file_handle = rtmp_get_file_handle + .url_get_file_handle = rtmp_get_file_handle, + .priv_data_size = sizeof(RTMP), }; diff --git a/libavformat/mmsh.c b/libavformat/mmsh.c index 3761016f81..a1ae894c6e 100644 --- a/libavformat/mmsh.c +++ b/libavformat/mmsh.c @@ -68,7 +68,6 @@ static int mmsh_close(URLContext *h) ffurl_close(mms->mms_hd); av_free(mms->streams); av_free(mms->asf_header); - av_freep(&h->priv_data); return 0; } @@ -217,12 +216,9 @@ static int mmsh_open(URLContext *h, const char *uri, int flags) char httpname[256], path[256], host[128], location[1024]; char *stream_selection = NULL; char headers[1024]; - MMSHContext *mmsh; + MMSHContext *mmsh = h->priv_data; MMSContext *mms; - mmsh = h->priv_data = av_mallocz(sizeof(MMSHContext)); - if (!h->priv_data) - return AVERROR(ENOMEM); mmsh->request_seq = h->is_streamed = 1; mms = &mmsh->mms; av_strlcpy(location, uri, sizeof(location)); @@ -367,4 +363,5 @@ URLProtocol ff_mmsh_protocol = { .url_open = mmsh_open, .url_read = mmsh_read, .url_close = mmsh_close, + .priv_data_size = sizeof(MMSHContext), }; diff --git a/libavformat/mmst.c b/libavformat/mmst.c index 7bb4358060..9d7fd7471c 100644 --- a/libavformat/mmst.c +++ b/libavformat/mmst.c @@ -470,7 +470,6 @@ static int mms_close(URLContext *h) /* free all separately allocated pointers in mms */ av_free(mms->streams); av_free(mms->asf_header); - av_freep(&h->priv_data); return 0; } @@ -502,15 +501,12 @@ static void clear_stream_buffers(MMSContext *mms) static int mms_open(URLContext *h, const char *uri, int flags) { - MMSTContext *mmst; + MMSTContext *mmst = h->priv_data; MMSContext *mms; int port, err; char tcpname[256]; h->is_streamed = 1; - mmst = h->priv_data = av_mallocz(sizeof(MMSTContext)); - if (!h->priv_data) - return AVERROR(ENOMEM); mms = &mmst->mms; // only for MMS over TCP, so set proto = NULL @@ -628,4 +624,5 @@ URLProtocol ff_mmst_protocol = { .url_open = mms_open, .url_read = mms_read, .url_close = mms_close, + .priv_data_size = sizeof(MMSTContext), }; diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index 979c5b6562..f47733814e 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -784,7 +784,6 @@ static int rtmp_close(URLContext *h) av_freep(&rt->flv_data); ffurl_close(rt->stream); - av_free(rt); return 0; } @@ -799,16 +798,12 @@ static int rtmp_close(URLContext *h) */ static int rtmp_open(URLContext *s, const char *uri, int flags) { - RTMPContext *rt; + RTMPContext *rt = s->priv_data; char proto[8], hostname[256], path[1024], *fname; uint8_t buf[2048]; int port; int ret; - rt = av_mallocz(sizeof(RTMPContext)); - if (!rt) - return AVERROR(ENOMEM); - s->priv_data = rt; rt->is_input = !(flags & AVIO_FLAG_WRITE); av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname), &port, @@ -1002,4 +997,5 @@ URLProtocol ff_rtmp_protocol = { .url_read = rtmp_read, .url_write = rtmp_write, .url_close = rtmp_close, + .priv_data_size = sizeof(RTMPContext), }; diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c index 9707bdcec7..93cad3c8e6 100644 --- a/libavformat/rtpproto.c +++ b/libavformat/rtpproto.c @@ -136,7 +136,7 @@ static void build_udp_url(char *buf, int buf_size, static int rtp_open(URLContext *h, const char *uri, int flags) { - RTPContext *s; + RTPContext *s = h->priv_data; int rtp_port, rtcp_port, ttl, connect, local_rtp_port, local_rtcp_port, max_packet_size; @@ -145,11 +145,6 @@ static int rtp_open(URLContext *h, const char *uri, int flags) char path[1024]; const char *p; - s = av_mallocz(sizeof(RTPContext)); - if (!s) - return AVERROR(ENOMEM); - h->priv_data = s; - av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &rtp_port, path, sizeof(path), uri); /* extract parameters */ @@ -213,7 +208,6 @@ static int rtp_open(URLContext *h, const char *uri, int flags) ffurl_close(s->rtp_hd); if (s->rtcp_hd) ffurl_close(s->rtcp_hd); - av_free(s); return AVERROR(EIO); } @@ -290,7 +284,6 @@ static int rtp_close(URLContext *h) ffurl_close(s->rtp_hd); ffurl_close(s->rtcp_hd); - av_free(s); return 0; } @@ -336,4 +329,5 @@ URLProtocol ff_rtp_protocol = { .url_write = rtp_write, .url_close = rtp_close, .url_get_file_handle = rtp_get_file_handle, + .priv_data_size = sizeof(RTPContext), }; diff --git a/libavformat/tcp.c b/libavformat/tcp.c index fda34a368d..0d3aeaf48c 100644 --- a/libavformat/tcp.c +++ b/libavformat/tcp.c @@ -39,7 +39,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags) { struct addrinfo hints, *ai, *cur_ai; int port, fd = -1; - TCPContext *s = NULL; + TCPContext *s = h->priv_data; int listen_socket = 0; const char *p; char buf[256]; @@ -135,12 +135,6 @@ static int tcp_open(URLContext *h, const char *uri, int flags) goto fail; } } - s = av_malloc(sizeof(TCPContext)); - if (!s) { - freeaddrinfo(ai); - return AVERROR(ENOMEM); - } - h->priv_data = s; h->is_streamed = 1; s->fd = fd; freeaddrinfo(ai); @@ -193,7 +187,6 @@ static int tcp_close(URLContext *h) { TCPContext *s = h->priv_data; closesocket(s->fd); - av_free(s); return 0; } @@ -210,4 +203,5 @@ URLProtocol ff_tcp_protocol = { .url_write = tcp_write, .url_close = tcp_close, .url_get_file_handle = tcp_get_file_handle, + .priv_data_size = sizeof(TCPContext), }; diff --git a/libavformat/udp.c b/libavformat/udp.c index 178cef477a..529114a860 100644 --- a/libavformat/udp.c +++ b/libavformat/udp.c @@ -306,7 +306,7 @@ static int udp_open(URLContext *h, const char *uri, int flags) { char hostname[1024], localaddr[1024] = ""; int port, udp_fd = -1, tmp, bind_ret = -1; - UDPContext *s = NULL; + UDPContext *s = h->priv_data; int is_output; const char *p; char buf[256]; @@ -319,11 +319,6 @@ static int udp_open(URLContext *h, const char *uri, int flags) is_output = !(flags & AVIO_FLAG_READ); - s = av_mallocz(sizeof(UDPContext)); - if (!s) - return AVERROR(ENOMEM); - - h->priv_data = s; s->ttl = 16; s->buffer_size = is_output ? UDP_TX_BUF_SIZE : UDP_MAX_PKT_SIZE; @@ -440,7 +435,6 @@ static int udp_open(URLContext *h, const char *uri, int flags) fail: if (udp_fd >= 0) closesocket(udp_fd); - av_free(s); return AVERROR(EIO); } @@ -486,7 +480,6 @@ static int udp_close(URLContext *h) if (s->is_multicast && (h->flags & AVIO_FLAG_READ)) udp_leave_multicast_group(s->udp_fd, (struct sockaddr *)&s->dest_addr); closesocket(s->udp_fd); - av_free(s); return 0; } @@ -497,4 +490,5 @@ URLProtocol ff_udp_protocol = { .url_write = udp_write, .url_close = udp_close, .url_get_file_handle = udp_get_file_handle, + .priv_data_size = sizeof(UDPContext), }; From c3b05d2159e9c2d78c62ef79c2cfcb90d766556d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 1 Dec 2011 11:53:57 +0200 Subject: [PATCH 11/25] proto: Realign struct initializers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/applehttpproto.c | 10 +++++----- libavformat/concat.c | 10 +++++----- libavformat/gopher.c | 10 +++++----- libavformat/mmsh.c | 8 ++++---- libavformat/mmst.c | 8 ++++---- libavformat/rtmpproto.c | 10 +++++----- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/libavformat/applehttpproto.c b/libavformat/applehttpproto.c index 245422be40..2b157095f0 100644 --- a/libavformat/applehttpproto.c +++ b/libavformat/applehttpproto.c @@ -294,10 +294,10 @@ retry: } URLProtocol ff_applehttp_protocol = { - .name = "applehttp", - .url_open = applehttp_open, - .url_read = applehttp_read, - .url_close = applehttp_close, - .flags = URL_PROTOCOL_FLAG_NESTED_SCHEME, + .name = "applehttp", + .url_open = applehttp_open, + .url_read = applehttp_read, + .url_close = applehttp_close, + .flags = URL_PROTOCOL_FLAG_NESTED_SCHEME, .priv_data_size = sizeof(AppleHTTPContext), }; diff --git a/libavformat/concat.c b/libavformat/concat.c index 4bfa6288ba..24c50c1e4e 100644 --- a/libavformat/concat.c +++ b/libavformat/concat.c @@ -184,10 +184,10 @@ static int64_t concat_seek(URLContext *h, int64_t pos, int whence) } URLProtocol ff_concat_protocol = { - .name = "concat", - .url_open = concat_open, - .url_read = concat_read, - .url_seek = concat_seek, - .url_close = concat_close, + .name = "concat", + .url_open = concat_open, + .url_read = concat_read, + .url_seek = concat_seek, + .url_close = concat_close, .priv_data_size = sizeof(struct concat_data), }; diff --git a/libavformat/gopher.c b/libavformat/gopher.c index 0543878ba8..c0338619b3 100644 --- a/libavformat/gopher.c +++ b/libavformat/gopher.c @@ -115,10 +115,10 @@ static int gopher_read(URLContext *h, uint8_t *buf, int size) URLProtocol ff_gopher_protocol = { - .name = "gopher", - .url_open = gopher_open, - .url_read = gopher_read, - .url_write = gopher_write, - .url_close = gopher_close, + .name = "gopher", + .url_open = gopher_open, + .url_read = gopher_read, + .url_write = gopher_write, + .url_close = gopher_close, .priv_data_size = sizeof(GopherContext), }; diff --git a/libavformat/mmsh.c b/libavformat/mmsh.c index a1ae894c6e..fa1a467223 100644 --- a/libavformat/mmsh.c +++ b/libavformat/mmsh.c @@ -359,9 +359,9 @@ static int mmsh_read(URLContext *h, uint8_t *buf, int size) } URLProtocol ff_mmsh_protocol = { - .name = "mmsh", - .url_open = mmsh_open, - .url_read = mmsh_read, - .url_close = mmsh_close, + .name = "mmsh", + .url_open = mmsh_open, + .url_read = mmsh_read, + .url_close = mmsh_close, .priv_data_size = sizeof(MMSHContext), }; diff --git a/libavformat/mmst.c b/libavformat/mmst.c index 9d7fd7471c..753b05cceb 100644 --- a/libavformat/mmst.c +++ b/libavformat/mmst.c @@ -620,9 +620,9 @@ static int mms_read(URLContext *h, uint8_t *buf, int size) } URLProtocol ff_mmst_protocol = { - .name = "mmst", - .url_open = mms_open, - .url_read = mms_read, - .url_close = mms_close, + .name = "mmst", + .url_open = mms_open, + .url_read = mms_read, + .url_close = mms_close, .priv_data_size = sizeof(MMSTContext), }; diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index f47733814e..54213b1dd0 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -992,10 +992,10 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size) } URLProtocol ff_rtmp_protocol = { - .name = "rtmp", - .url_open = rtmp_open, - .url_read = rtmp_read, - .url_write = rtmp_write, - .url_close = rtmp_close, + .name = "rtmp", + .url_open = rtmp_open, + .url_read = rtmp_read, + .url_write = rtmp_write, + .url_close = rtmp_close, .priv_data_size = sizeof(RTMPContext), }; From f28070a123ffae9d3e58e65ef33a3fb69bfe9c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= Date: Sat, 26 Mar 2011 16:25:10 +0100 Subject: [PATCH 12/25] Add PlayStation Portable PMP format demuxer Not yet complete, for demuxing AAC the AAC header must be generated manually. Possibly the decoder could accept the header as extradata to simplify this. Signed-off-by: Anton Khirnov --- Changelog | 1 + doc/general.texi | 1 + libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/pmpdec.c | 179 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 183 insertions(+) create mode 100644 libavformat/pmpdec.c diff --git a/Changelog b/Changelog index e5c4993dbe..ff37020bdb 100644 --- a/Changelog +++ b/Changelog @@ -103,6 +103,7 @@ easier to use. The changes are: - VBLE Decoder - OS X Video Decoder Acceleration (VDA) support - CRI ADX audio format demuxer +- Playstation Portable PMP format demuxer version 0.7: diff --git a/doc/general.texi b/doc/general.texi index 9a5c405f85..dc7e8bb77b 100644 --- a/doc/general.texi +++ b/doc/general.texi @@ -167,6 +167,7 @@ library: @item NUT @tab X @tab X @tab NUT Open Container Format @item Ogg @tab X @tab X +@item Playstation Portable PMP @tab @tab X @item TechnoTrend PVA @tab @tab X @tab Used by TechnoTrend DVB PCI boards. @item QCP @tab @tab X diff --git a/libavformat/Makefile b/libavformat/Makefile index f3f8679b42..fccb5f342f 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -218,6 +218,7 @@ OBJS-$(CONFIG_PCM_U32LE_DEMUXER) += pcmdec.o pcm.o rawdec.o OBJS-$(CONFIG_PCM_U32LE_MUXER) += pcmenc.o rawenc.o OBJS-$(CONFIG_PCM_U8_DEMUXER) += pcmdec.o pcm.o rawdec.o OBJS-$(CONFIG_PCM_U8_MUXER) += pcmenc.o rawenc.o +OBJS-$(CONFIG_PMP_DEMUXER) += pmpdec.o OBJS-$(CONFIG_PVA_DEMUXER) += pva.o OBJS-$(CONFIG_QCP_DEMUXER) += qcp.o OBJS-$(CONFIG_R3D_DEMUXER) += r3d.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 573b714d33..fe775f4cce 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -177,6 +177,7 @@ void av_register_all(void) REGISTER_MUXDEMUX (PCM_U16BE, pcm_u16be); REGISTER_MUXDEMUX (PCM_U16LE, pcm_u16le); REGISTER_MUXDEMUX (PCM_U8, pcm_u8); + REGISTER_DEMUXER (PMP, pmp); REGISTER_MUXER (PSP, psp); REGISTER_DEMUXER (PVA, pva); REGISTER_DEMUXER (QCP, qcp); diff --git a/libavformat/pmpdec.c b/libavformat/pmpdec.c new file mode 100644 index 0000000000..a367344b16 --- /dev/null +++ b/libavformat/pmpdec.c @@ -0,0 +1,179 @@ +/* + * PMP demuxer + * Copyright (c) 2011 Reimar Döffinger + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/intreadwrite.h" +#include "avformat.h" + +typedef struct PMPContext { + int cur_stream; + int num_streams; + int audio_packets; + int current_packet; + uint32_t *packet_sizes; + int packet_sizes_alloc; +} PMPContext; + +static int pmp_probe(AVProbeData *p) +{ + if (!memcmp(p->buf, "pmpm\1\0\0\0", 8)) + return AVPROBE_SCORE_MAX; + return 0; +} + +static int pmp_header(AVFormatContext *s, AVFormatParameters *ap) +{ + PMPContext *pmp = s->priv_data; + AVIOContext *pb = s->pb; + int tb_num, tb_den; + int index_cnt; + int audio_codec_id = CODEC_ID_NONE; + int srate, channels; + int i; + uint64_t pos; + AVStream *vst = avformat_new_stream(s, NULL); + if (!vst) + return AVERROR(ENOMEM); + vst->codec->codec_type = AVMEDIA_TYPE_VIDEO; + avio_skip(pb, 8); + switch (avio_rl32(pb)) { + case 0: + vst->codec->codec_id = CODEC_ID_MPEG4; + break; + case 1: + vst->codec->codec_id = CODEC_ID_H264; + break; + default: + av_log(s, AV_LOG_ERROR, "Unsupported video format\n"); + break; + } + index_cnt = avio_rl32(pb); + vst->codec->width = avio_rl32(pb); + vst->codec->height = avio_rl32(pb); + + tb_num = avio_rl32(pb); + tb_den = avio_rl32(pb); + av_set_pts_info(vst, 32, tb_num, tb_den); + vst->nb_frames = index_cnt; + vst->duration = index_cnt; + + switch (avio_rl32(pb)) { + case 0: + audio_codec_id = CODEC_ID_MP3; + break; + case 1: + av_log(s, AV_LOG_WARNING, "AAC is not yet correctly supported\n"); + audio_codec_id = CODEC_ID_AAC; + break; + default: + av_log(s, AV_LOG_ERROR, "Unsupported audio format\n"); + break; + } + pmp->num_streams = avio_rl16(pb) + 1; + avio_skip(pb, 10); + srate = avio_rl32(pb); + channels = avio_rl32(pb) + 1; + for (i = 1; i < pmp->num_streams; i++) { + AVStream *ast = avformat_new_stream(s, NULL); + if (!ast) + return AVERROR(ENOMEM); + ast->codec->codec_type = AVMEDIA_TYPE_AUDIO; + ast->codec->codec_id = audio_codec_id; + ast->codec->channels = channels; + ast->codec->sample_rate = srate; + av_set_pts_info(ast, 32, 1, srate); + } + pos = avio_tell(pb) + 4 * index_cnt; + for (i = 0; i < index_cnt; i++) { + int size = avio_rl32(pb); + int flags = size & 1 ? AVINDEX_KEYFRAME : 0; + size >>= 1; + av_add_index_entry(vst, pos, i, size, 0, flags); + pos += size; + } + return 0; +} + +static int pmp_packet(AVFormatContext *s, AVPacket *pkt) +{ + PMPContext *pmp = s->priv_data; + AVIOContext *pb = s->pb; + int ret = 0; + int i; + + if (pb->eof_reached) + return AVERROR_EOF; + if (pmp->cur_stream == 0) { + int num_packets; + pmp->audio_packets = avio_r8(pb); + num_packets = (pmp->num_streams - 1) * pmp->audio_packets + 1; + avio_skip(pb, 8); + pmp->current_packet = 0; + av_fast_malloc(&pmp->packet_sizes, + &pmp->packet_sizes_alloc, + num_packets * sizeof(*pmp->packet_sizes)); + if (!pmp->packet_sizes_alloc) { + av_log(s, AV_LOG_ERROR, "Cannot (re)allocate packet buffer\n"); + return AVERROR(ENOMEM); + } + for (i = 0; i < num_packets; i++) + pmp->packet_sizes[i] = avio_rl32(pb); + } + ret = av_get_packet(pb, pkt, pmp->packet_sizes[pmp->current_packet]); + if (ret > 0) { + ret = 0; + // FIXME: this is a hack that should be removed once + // compute_pkt_fields() can handle timestamps properly + if (pmp->cur_stream == 0) + pkt->dts = s->streams[0]->cur_dts++; + pkt->stream_index = pmp->cur_stream; + } + pmp->current_packet++; + if (pmp->current_packet == 1 || pmp->current_packet > pmp->audio_packets) + pmp->cur_stream = (pmp->cur_stream + 1) % pmp->num_streams; + + return ret; +} + +static int pmp_seek(AVFormatContext *s, int stream_idx, int64_t ts, int flags) +{ + PMPContext *pmp = s->priv_data; + pmp->cur_stream = 0; + // fallback to default seek now + return -1; +} + +static int pmp_close(AVFormatContext *s) +{ + PMPContext *pmp = s->priv_data; + av_freep(&pmp->packet_sizes); + return 0; +} + +AVInputFormat ff_pmp_demuxer = { + .name = "pmp", + .long_name = NULL_IF_CONFIG_SMALL("Playstation Portable PMP format"), + .priv_data_size = sizeof(PMPContext), + .read_probe = pmp_probe, + .read_header = pmp_header, + .read_packet = pmp_packet, + .read_seek = pmp_seek, + .read_close = pmp_close, +}; From 37fed0e635942306a43b3b546c9c6385a43d5934 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Thu, 1 Dec 2011 00:18:38 +0000 Subject: [PATCH 13/25] rv34: align temporary block of "dct" coefs This is needed for optimised transforms. Signed-off-by: Mans Rullgard --- libavcodec/rv34.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index 098f7b5a24..295a633f38 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -1112,7 +1112,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types) GetBitContext *gb = &s->gb; int cbp, cbp2; int i, blknum, blkoff; - DCTELEM block16[64]; + LOCAL_ALIGNED_16(DCTELEM, block16, [64]); int luma_dc_quant; int dist; int mb_pos = s->mb_x + s->mb_y * s->mb_stride; @@ -1147,7 +1147,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types) luma_dc_quant = r->block_type == RV34_MB_P_MIX16x16 ? r->luma_dc_quant_p[s->qscale] : r->luma_dc_quant_i[s->qscale]; if(r->is16){ - memset(block16, 0, sizeof(block16)); + memset(block16, 0, 64 * sizeof(*block16)); rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0); rv34_dequant4x4_16x16(block16, rv34_qscale_tab[luma_dc_quant],rv34_qscale_tab[s->qscale]); r->rdsp.rv34_inv_transform_tab[1](block16); From 74e96eb77e7ce6da6917d8fb5ae1151b90eb5e4b Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Thu, 1 Dec 2011 17:28:36 +0100 Subject: [PATCH 14/25] pmpdec: don't use deprecated av_set_pts_info. --- libavformat/pmpdec.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libavformat/pmpdec.c b/libavformat/pmpdec.c index a367344b16..96c7048570 100644 --- a/libavformat/pmpdec.c +++ b/libavformat/pmpdec.c @@ -21,6 +21,7 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "internal.h" typedef struct PMPContext { int cur_stream; @@ -70,7 +71,7 @@ static int pmp_header(AVFormatContext *s, AVFormatParameters *ap) tb_num = avio_rl32(pb); tb_den = avio_rl32(pb); - av_set_pts_info(vst, 32, tb_num, tb_den); + avpriv_set_pts_info(vst, 32, tb_num, tb_den); vst->nb_frames = index_cnt; vst->duration = index_cnt; @@ -98,7 +99,7 @@ static int pmp_header(AVFormatContext *s, AVFormatParameters *ap) ast->codec->codec_id = audio_codec_id; ast->codec->channels = channels; ast->codec->sample_rate = srate; - av_set_pts_info(ast, 32, 1, srate); + avpriv_set_pts_info(ast, 32, 1, srate); } pos = avio_tell(pb) + 4 * index_cnt; for (i = 0; i < index_cnt; i++) { From 5089ce1b5abe2ecbbfd7235aeb0ad47ba38305c1 Mon Sep 17 00:00:00 2001 From: Reinhard Tartler Date: Thu, 1 Dec 2011 18:48:33 +0100 Subject: [PATCH 15/25] swscale: #include "libavutil/mathematics.h" this file uses the M_PI macro since 4e74187db2f5db52f88729efc662df9d6bc763e1, so include the correct header directly. Signed-off-by: Reinhard Tartler --- libswscale/utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libswscale/utils.c b/libswscale/utils.c index 4458e8f700..b644ed9610 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -43,6 +43,7 @@ #include "libavutil/cpu.h" #include "libavutil/avutil.h" #include "libavutil/bswap.h" +#include "libavutil/mathematics.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" From ca124013769aa85cb4b08b718beca1aac8299004 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 30 Nov 2011 16:51:01 -0500 Subject: [PATCH 16/25] fate: split acodec-pcm into individual tests this removes 2 redundant tests for pcm in mkv. we can add the coverage back in later as fate-lavf tests if needed. --- tests/codec-regression.sh | 50 ++++++++++++++++++++++---- tests/ref/acodec/pcm | 68 ------------------------------------ tests/ref/acodec/pcm_alaw | 4 +++ tests/ref/acodec/pcm_f32be | 4 +++ tests/ref/acodec/pcm_f32le | 4 +++ tests/ref/acodec/pcm_f64be | 4 +++ tests/ref/acodec/pcm_f64le | 4 +++ tests/ref/acodec/pcm_mulaw | 4 +++ tests/ref/acodec/pcm_s16be | 4 +++ tests/ref/acodec/pcm_s16le | 4 +++ tests/ref/acodec/pcm_s24be | 4 +++ tests/ref/acodec/pcm_s24daud | 4 +++ tests/ref/acodec/pcm_s24le | 4 +++ tests/ref/acodec/pcm_s32be | 4 +++ tests/ref/acodec/pcm_s32le | 4 +++ tests/ref/acodec/pcm_s8 | 4 +++ tests/ref/acodec/pcm_u8 | 4 +++ tests/ref/seek/pcm_s16be_mkv | 53 ---------------------------- tests/ref/seek/pcm_s16le_mkv | 53 ---------------------------- 19 files changed, 103 insertions(+), 181 deletions(-) delete mode 100644 tests/ref/acodec/pcm create mode 100644 tests/ref/acodec/pcm_alaw create mode 100644 tests/ref/acodec/pcm_f32be create mode 100644 tests/ref/acodec/pcm_f32le create mode 100644 tests/ref/acodec/pcm_f64be create mode 100644 tests/ref/acodec/pcm_f64le create mode 100644 tests/ref/acodec/pcm_mulaw create mode 100644 tests/ref/acodec/pcm_s16be create mode 100644 tests/ref/acodec/pcm_s16le create mode 100644 tests/ref/acodec/pcm_s24be create mode 100644 tests/ref/acodec/pcm_s24daud create mode 100644 tests/ref/acodec/pcm_s24le create mode 100644 tests/ref/acodec/pcm_s32be create mode 100644 tests/ref/acodec/pcm_s32le create mode 100644 tests/ref/acodec/pcm_s8 create mode 100644 tests/ref/acodec/pcm_u8 delete mode 100644 tests/ref/seek/pcm_s16be_mkv delete mode 100644 tests/ref/seek/pcm_s16le_mkv diff --git a/tests/codec-regression.sh b/tests/codec-regression.sh index 1a15c39e67..5133345dc0 100755 --- a/tests/codec-regression.sh +++ b/tests/codec-regression.sh @@ -354,26 +354,62 @@ do_audio_enc_dec() { do_audio_decoding } -if [ -n "$do_pcm" ] ; then +if [ -n "$do_pcm_alaw" ] ; then do_audio_enc_dec wav s16 pcm_alaw +fi +if [ -n "$do_pcm_mulaw" ] ; then do_audio_enc_dec wav s16 pcm_mulaw +fi +if [ -n "$do_pcm_s8" ] ; then do_audio_enc_dec mov u8 pcm_s8 +fi +if [ -n "$do_pcm_u8" ] ; then do_audio_enc_dec wav u8 pcm_u8 +fi +if [ -n "$do_pcm_s16be" ] ; then do_audio_enc_dec mov s16 pcm_s16be +fi +if [ -n "$do_pcm_s16le" ] ; then do_audio_enc_dec wav s16 pcm_s16le -do_audio_enc_dec mkv s16 pcm_s16be -do_audio_enc_dec mkv s16 pcm_s16le +fi +if [ -n "$do_pcm_s24be" ] ; then do_audio_enc_dec mov s32 pcm_s24be +fi +if [ -n "$do_pcm_s24le" ] ; then do_audio_enc_dec wav s32 pcm_s24le -#do_audio_enc_dec ??? s32 pcm_u24be #no compatible muxer or demuxer -#do_audio_enc_dec ??? s32 pcm_u24le #no compatible muxer or demuxer +fi +# no compatible muxer or demuxer +# if [ -n "$do_pcm_u24be" ] ; then +# do_audio_enc_dec ??? u32 pcm_u24be +# fi +# if [ -n "$do_pcm_u24le" ] ; then +# do_audio_enc_dec ??? u32 pcm_u24le +# fi +if [ -n "$do_pcm_s32be" ] ; then do_audio_enc_dec mov s32 pcm_s32be +fi +if [ -n "$do_pcm_s32le" ] ; then do_audio_enc_dec wav s32 pcm_s32le -#do_audio_enc_dec ??? s32 pcm_u32be #no compatible muxer or demuxer -#do_audio_enc_dec ??? s32 pcm_u32le #no compatible muxer or demuxer +fi +# no compatible muxer or demuxer +# if [ -n "$do_pcm_u32be" ] ; then +# do_audio_enc_dec ??? u32 pcm_u32be +# fi +# if [ -n "$do_pcm_u32le" ] ; then +# do_audio_enc_dec ??? u32 pcm_u32le +# fi +if [ -n "$do_pcm_f32be" ] ; then do_audio_enc_dec au flt pcm_f32be +fi +if [ -n "$do_pcm_f32le" ] ; then do_audio_enc_dec wav flt pcm_f32le +fi +if [ -n "$do_pcm_f64be" ] ; then do_audio_enc_dec au dbl pcm_f64be +fi +if [ -n "$do_pcm_f64le" ] ; then do_audio_enc_dec wav dbl pcm_f64le +fi +if [ -n "$do_pcm_s24daud" ] ; then do_audio_enc_dec 302 s16 pcm_s24daud "-ac 6 -ar 96000" fi diff --git a/tests/ref/acodec/pcm b/tests/ref/acodec/pcm deleted file mode 100644 index 1c710b8c97..0000000000 --- a/tests/ref/acodec/pcm +++ /dev/null @@ -1,68 +0,0 @@ -ede2da07839a00c255a43129922f2c7b *./tests/data/acodec/pcm_alaw.wav -529258 ./tests/data/acodec/pcm_alaw.wav -f323f7551ffad91de8613f44dcb198b6 *./tests/data/pcm.acodec.out.wav -stddev: 101.67 PSNR: 56.19 MAXDIFF: 515 bytes: 1058400/ 1058400 -0c2a55850fb46ad5385a69b15b271f10 *./tests/data/acodec/pcm_mulaw.wav -529258 ./tests/data/acodec/pcm_mulaw.wav -7ae8c3fc804bd574006fd547fe28980c *./tests/data/pcm.acodec.out.wav -stddev: 103.38 PSNR: 56.04 MAXDIFF: 644 bytes: 1058400/ 1058400 -760f85fb9f4e8aba326fb44ae84c9507 *./tests/data/acodec/pcm_s8.mov -530837 ./tests/data/acodec/pcm_s8.mov -651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm.acodec.out.wav -stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 -70fecbae732f81143a560c7315eda49a *./tests/data/acodec/pcm_u8.wav -529246 ./tests/data/acodec/pcm_u8.wav -651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm.acodec.out.wav -stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 -a4e18d1ca9ef5b8132a84d43625ddc47 *./tests/data/acodec/pcm_s16be.mov -1060037 ./tests/data/acodec/pcm_s16be.mov -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/acodec/pcm_s16le.wav -1058446 ./tests/data/acodec/pcm_s16le.wav -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -af717ca95eaca310772eb1238c745d1b *./tests/data/acodec/pcm_s16be.mkv -1060638 ./tests/data/acodec/pcm_s16be.mkv -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -c4f51bf32fad2f7af8ea5beedb56168b *./tests/data/acodec/pcm_s16le.mkv -1060638 ./tests/data/acodec/pcm_s16le.mkv -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -971d2d2633e41a0326fe2d04a2d0350f *./tests/data/acodec/pcm_s24be.mov -1589237 ./tests/data/acodec/pcm_s24be.mov -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -a85380fb79b0d4fff38e24ac1e34bb94 *./tests/data/acodec/pcm_s24le.wav -1587668 ./tests/data/acodec/pcm_s24le.wav -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -fc4f4e3e195bbde037ed31021d229f12 *./tests/data/acodec/pcm_s32be.mov -2118437 ./tests/data/acodec/pcm_s32be.mov -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -da6ed80f4f40f0082577dea80827e014 *./tests/data/acodec/pcm_s32le.wav -2116868 ./tests/data/acodec/pcm_s32le.wav -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -118ff3dc83c62ce9ce669eef57e55bb2 *./tests/data/acodec/pcm_f32be.au -2116824 ./tests/data/acodec/pcm_f32be.au -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -46f44f86a18984a832206ab9e29a79f2 *./tests/data/acodec/pcm_f32le.wav -2116880 ./tests/data/acodec/pcm_f32le.wav -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -8112296b1ed94f72f20d04b1a54850a7 *./tests/data/acodec/pcm_f64be.au -4233624 ./tests/data/acodec/pcm_f64be.au -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -ba17c6d1a270e1333e981f239bf7eb45 *./tests/data/acodec/pcm_f64le.wav -4233680 ./tests/data/acodec/pcm_f64le.wav -64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav -stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -8168a5c1343553ef027541830f2cb879 *./tests/data/acodec/pcm_s24daud.302 -10368730 ./tests/data/acodec/pcm_s24daud.302 -f552afadfdfcd6348a07095da6382de5 *./tests/data/pcm.acodec.out.wav -stddev: 9416.28 PSNR: 16.85 MAXDIFF:42744 bytes: 6911796/ 1058400 diff --git a/tests/ref/acodec/pcm_alaw b/tests/ref/acodec/pcm_alaw new file mode 100644 index 0000000000..4943831d39 --- /dev/null +++ b/tests/ref/acodec/pcm_alaw @@ -0,0 +1,4 @@ +ede2da07839a00c255a43129922f2c7b *./tests/data/acodec/pcm_alaw.wav +529258 ./tests/data/acodec/pcm_alaw.wav +f323f7551ffad91de8613f44dcb198b6 *./tests/data/pcm_alaw.acodec.out.wav +stddev: 101.67 PSNR: 56.19 MAXDIFF: 515 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_f32be b/tests/ref/acodec/pcm_f32be new file mode 100644 index 0000000000..5f067c2dfb --- /dev/null +++ b/tests/ref/acodec/pcm_f32be @@ -0,0 +1,4 @@ +118ff3dc83c62ce9ce669eef57e55bb2 *./tests/data/acodec/pcm_f32be.au +2116824 ./tests/data/acodec/pcm_f32be.au +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f32be.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_f32le b/tests/ref/acodec/pcm_f32le new file mode 100644 index 0000000000..38e5c0b719 --- /dev/null +++ b/tests/ref/acodec/pcm_f32le @@ -0,0 +1,4 @@ +46f44f86a18984a832206ab9e29a79f2 *./tests/data/acodec/pcm_f32le.wav +2116880 ./tests/data/acodec/pcm_f32le.wav +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f32le.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_f64be b/tests/ref/acodec/pcm_f64be new file mode 100644 index 0000000000..9abdabc747 --- /dev/null +++ b/tests/ref/acodec/pcm_f64be @@ -0,0 +1,4 @@ +8112296b1ed94f72f20d04b1a54850a7 *./tests/data/acodec/pcm_f64be.au +4233624 ./tests/data/acodec/pcm_f64be.au +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f64be.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_f64le b/tests/ref/acodec/pcm_f64le new file mode 100644 index 0000000000..42875a8d2f --- /dev/null +++ b/tests/ref/acodec/pcm_f64le @@ -0,0 +1,4 @@ +ba17c6d1a270e1333e981f239bf7eb45 *./tests/data/acodec/pcm_f64le.wav +4233680 ./tests/data/acodec/pcm_f64le.wav +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f64le.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_mulaw b/tests/ref/acodec/pcm_mulaw new file mode 100644 index 0000000000..cefd76ba49 --- /dev/null +++ b/tests/ref/acodec/pcm_mulaw @@ -0,0 +1,4 @@ +0c2a55850fb46ad5385a69b15b271f10 *./tests/data/acodec/pcm_mulaw.wav +529258 ./tests/data/acodec/pcm_mulaw.wav +7ae8c3fc804bd574006fd547fe28980c *./tests/data/pcm_mulaw.acodec.out.wav +stddev: 103.38 PSNR: 56.04 MAXDIFF: 644 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s16be b/tests/ref/acodec/pcm_s16be new file mode 100644 index 0000000000..708375d657 --- /dev/null +++ b/tests/ref/acodec/pcm_s16be @@ -0,0 +1,4 @@ +a4e18d1ca9ef5b8132a84d43625ddc47 *./tests/data/acodec/pcm_s16be.mov +1060037 ./tests/data/acodec/pcm_s16be.mov +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s16be.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s16le b/tests/ref/acodec/pcm_s16le new file mode 100644 index 0000000000..c7b5de7b92 --- /dev/null +++ b/tests/ref/acodec/pcm_s16le @@ -0,0 +1,4 @@ +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/acodec/pcm_s16le.wav +1058446 ./tests/data/acodec/pcm_s16le.wav +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s16le.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s24be b/tests/ref/acodec/pcm_s24be new file mode 100644 index 0000000000..1e90d7e008 --- /dev/null +++ b/tests/ref/acodec/pcm_s24be @@ -0,0 +1,4 @@ +971d2d2633e41a0326fe2d04a2d0350f *./tests/data/acodec/pcm_s24be.mov +1589237 ./tests/data/acodec/pcm_s24be.mov +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s24be.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s24daud b/tests/ref/acodec/pcm_s24daud new file mode 100644 index 0000000000..eab6f8d28e --- /dev/null +++ b/tests/ref/acodec/pcm_s24daud @@ -0,0 +1,4 @@ +8168a5c1343553ef027541830f2cb879 *./tests/data/acodec/pcm_s24daud.302 +10368730 ./tests/data/acodec/pcm_s24daud.302 +f552afadfdfcd6348a07095da6382de5 *./tests/data/pcm_s24daud.acodec.out.wav +stddev: 9416.28 PSNR: 16.85 MAXDIFF:42744 bytes: 6911796/ 1058400 diff --git a/tests/ref/acodec/pcm_s24le b/tests/ref/acodec/pcm_s24le new file mode 100644 index 0000000000..a724e8c189 --- /dev/null +++ b/tests/ref/acodec/pcm_s24le @@ -0,0 +1,4 @@ +a85380fb79b0d4fff38e24ac1e34bb94 *./tests/data/acodec/pcm_s24le.wav +1587668 ./tests/data/acodec/pcm_s24le.wav +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s24le.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s32be b/tests/ref/acodec/pcm_s32be new file mode 100644 index 0000000000..3bbb71df28 --- /dev/null +++ b/tests/ref/acodec/pcm_s32be @@ -0,0 +1,4 @@ +fc4f4e3e195bbde037ed31021d229f12 *./tests/data/acodec/pcm_s32be.mov +2118437 ./tests/data/acodec/pcm_s32be.mov +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s32be.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s32le b/tests/ref/acodec/pcm_s32le new file mode 100644 index 0000000000..86777505f5 --- /dev/null +++ b/tests/ref/acodec/pcm_s32le @@ -0,0 +1,4 @@ +da6ed80f4f40f0082577dea80827e014 *./tests/data/acodec/pcm_s32le.wav +2116868 ./tests/data/acodec/pcm_s32le.wav +64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s32le.acodec.out.wav +stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s8 b/tests/ref/acodec/pcm_s8 new file mode 100644 index 0000000000..7a53fdc5c5 --- /dev/null +++ b/tests/ref/acodec/pcm_s8 @@ -0,0 +1,4 @@ +760f85fb9f4e8aba326fb44ae84c9507 *./tests/data/acodec/pcm_s8.mov +530837 ./tests/data/acodec/pcm_s8.mov +651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm_s8.acodec.out.wav +stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_u8 b/tests/ref/acodec/pcm_u8 new file mode 100644 index 0000000000..e8d70c93e9 --- /dev/null +++ b/tests/ref/acodec/pcm_u8 @@ -0,0 +1,4 @@ +70fecbae732f81143a560c7315eda49a *./tests/data/acodec/pcm_u8.wav +529246 ./tests/data/acodec/pcm_u8.wav +651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm_u8.acodec.out.wav +stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 diff --git a/tests/ref/seek/pcm_s16be_mkv b/tests/ref/seek/pcm_s16be_mkv deleted file mode 100644 index 8889c423b7..0000000000 --- a/tests/ref/seek/pcm_s16be_mkv +++ /dev/null @@ -1,53 +0,0 @@ -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 1.881000 pts: 1.881000 pos: 332755 size: 4096 -ret: 0 st: 0 flags:0 ts: 0.788000 -ret: 0 st: 0 flags:1 dts: 0.789000 pts: 0.789000 pos: 139914 size: 4096 -ret: 0 st: 0 flags:1 ts:-0.317000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st:-1 flags:0 ts: 2.576668 -ret: 0 st: 0 flags:1 dts: 2.577000 pts: 2.577000 pos: 455845 size: 4096 -ret: 0 st:-1 flags:1 ts: 1.470835 -ret: 0 st: 0 flags:1 dts: 1.463000 pts: 1.463000 pos: 258901 size: 4096 -ret: 0 st: 0 flags:0 ts: 0.365000 -ret: 0 st: 0 flags:1 dts: 0.372000 pts: 0.372000 pos: 66060 size: 4096 -ret: 0 st: 0 flags:1 ts:-0.741000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st:-1 flags:0 ts: 2.153336 -ret: 0 st: 0 flags:1 dts: 2.159000 pts: 2.159000 pos: 381991 size: 4096 -ret: 0 st:-1 flags:1 ts: 1.047503 -ret: 0 st: 0 flags:1 dts: 1.045000 pts: 1.045000 pos: 185047 size: 4096 -ret: 0 st: 0 flags:0 ts:-0.058000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st: 0 flags:1 ts: 2.836000 -ret: 0 st: 0 flags:1 dts: 2.833000 pts: 2.833000 pos: 500978 size: 4096 -ret: 0 st:-1 flags:0 ts: 1.730004 -ret: 0 st: 0 flags:1 dts: 1.741000 pts: 1.741000 pos: 308137 size: 4096 -ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.604000 pts: 0.604000 pos: 107090 size: 4096 -ret: 0 st: 0 flags:0 ts:-0.482000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st: 0 flags:1 ts: 2.413000 -ret: 0 st: 0 flags:1 dts: 2.392000 pts: 2.392000 pos: 423021 size: 4096 -ret: 0 st:-1 flags:0 ts: 1.306672 -ret: 0 st: 0 flags:1 dts: 1.324000 pts: 1.324000 pos: 234283 size: 4096 -ret: 0 st:-1 flags:1 ts: 0.200839 -ret: 0 st: 0 flags:1 dts: 0.186000 pts: 0.186000 pos: 33236 size: 4096 -ret: 0 st: 0 flags:0 ts:-0.905000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st: 0 flags:1 ts: 1.989000 -ret: 0 st: 0 flags:1 dts: 1.974000 pts: 1.974000 pos: 349167 size: 4096 -ret: 0 st:-1 flags:0 ts: 0.883340 -ret: 0 st: 0 flags:1 dts: 0.906000 pts: 0.906000 pos: 160429 size: 4096 -ret: 0 st:-1 flags:1 ts:-0.222493 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st: 0 flags:0 ts: 2.672000 -ret: 0 st: 0 flags:1 dts: 2.694000 pts: 2.694000 pos: 476360 size: 4096 -ret: 0 st: 0 flags:1 ts: 1.566000 -ret: 0 st: 0 flags:1 dts: 1.556000 pts: 1.556000 pos: 275313 size: 4096 -ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.464000 pts: 0.464000 pos: 82472 size: 4096 -ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 diff --git a/tests/ref/seek/pcm_s16le_mkv b/tests/ref/seek/pcm_s16le_mkv deleted file mode 100644 index 8889c423b7..0000000000 --- a/tests/ref/seek/pcm_s16le_mkv +++ /dev/null @@ -1,53 +0,0 @@ -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 1.881000 pts: 1.881000 pos: 332755 size: 4096 -ret: 0 st: 0 flags:0 ts: 0.788000 -ret: 0 st: 0 flags:1 dts: 0.789000 pts: 0.789000 pos: 139914 size: 4096 -ret: 0 st: 0 flags:1 ts:-0.317000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st:-1 flags:0 ts: 2.576668 -ret: 0 st: 0 flags:1 dts: 2.577000 pts: 2.577000 pos: 455845 size: 4096 -ret: 0 st:-1 flags:1 ts: 1.470835 -ret: 0 st: 0 flags:1 dts: 1.463000 pts: 1.463000 pos: 258901 size: 4096 -ret: 0 st: 0 flags:0 ts: 0.365000 -ret: 0 st: 0 flags:1 dts: 0.372000 pts: 0.372000 pos: 66060 size: 4096 -ret: 0 st: 0 flags:1 ts:-0.741000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st:-1 flags:0 ts: 2.153336 -ret: 0 st: 0 flags:1 dts: 2.159000 pts: 2.159000 pos: 381991 size: 4096 -ret: 0 st:-1 flags:1 ts: 1.047503 -ret: 0 st: 0 flags:1 dts: 1.045000 pts: 1.045000 pos: 185047 size: 4096 -ret: 0 st: 0 flags:0 ts:-0.058000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st: 0 flags:1 ts: 2.836000 -ret: 0 st: 0 flags:1 dts: 2.833000 pts: 2.833000 pos: 500978 size: 4096 -ret: 0 st:-1 flags:0 ts: 1.730004 -ret: 0 st: 0 flags:1 dts: 1.741000 pts: 1.741000 pos: 308137 size: 4096 -ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.604000 pts: 0.604000 pos: 107090 size: 4096 -ret: 0 st: 0 flags:0 ts:-0.482000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st: 0 flags:1 ts: 2.413000 -ret: 0 st: 0 flags:1 dts: 2.392000 pts: 2.392000 pos: 423021 size: 4096 -ret: 0 st:-1 flags:0 ts: 1.306672 -ret: 0 st: 0 flags:1 dts: 1.324000 pts: 1.324000 pos: 234283 size: 4096 -ret: 0 st:-1 flags:1 ts: 0.200839 -ret: 0 st: 0 flags:1 dts: 0.186000 pts: 0.186000 pos: 33236 size: 4096 -ret: 0 st: 0 flags:0 ts:-0.905000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st: 0 flags:1 ts: 1.989000 -ret: 0 st: 0 flags:1 dts: 1.974000 pts: 1.974000 pos: 349167 size: 4096 -ret: 0 st:-1 flags:0 ts: 0.883340 -ret: 0 st: 0 flags:1 dts: 0.906000 pts: 0.906000 pos: 160429 size: 4096 -ret: 0 st:-1 flags:1 ts:-0.222493 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 -ret: 0 st: 0 flags:0 ts: 2.672000 -ret: 0 st: 0 flags:1 dts: 2.694000 pts: 2.694000 pos: 476360 size: 4096 -ret: 0 st: 0 flags:1 ts: 1.566000 -ret: 0 st: 0 flags:1 dts: 1.556000 pts: 1.556000 pos: 275313 size: 4096 -ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.464000 pts: 0.464000 pos: 82472 size: 4096 -ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096 From 94267ddfb25ccb6ebd9f22249894586279499aea Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Thu, 1 Dec 2011 05:04:32 +0000 Subject: [PATCH 17/25] ARM: clean up NEON put/avg_pixels macros Although this adds a few lines, the macro calls are less convoluted. Signed-off-by: Mans Rullgard --- libavcodec/arm/dsputil_neon.S | 155 +++++++++++++++++++--------------- 1 file changed, 86 insertions(+), 69 deletions(-) diff --git a/libavcodec/arm/dsputil_neon.S b/libavcodec/arm/dsputil_neon.S index 33969134d7..6f0a6e9012 100644 --- a/libavcodec/arm/dsputil_neon.S +++ b/libavcodec/arm/dsputil_neon.S @@ -40,10 +40,10 @@ function ff_clear_blocks_neon, export=1 bx lr endfunc - .macro pixels16 avg=0 -.if \avg +.macro pixels16 rnd=1, avg=0 + .if \avg mov ip, r0 -.endif + .endif 1: vld1.64 {d0, d1}, [r1], r2 vld1.64 {d2, d3}, [r1], r2 vld1.64 {d4, d5}, [r1], r2 @@ -52,7 +52,7 @@ endfunc pld [r1] pld [r1, r2] pld [r1, r2, lsl #1] -.if \avg + .if \avg vld1.64 {d16,d17}, [ip,:128], r2 vrhadd.u8 q0, q0, q8 vld1.64 {d18,d19}, [ip,:128], r2 @@ -61,7 +61,7 @@ endfunc vrhadd.u8 q2, q2, q10 vld1.64 {d22,d23}, [ip,:128], r2 vrhadd.u8 q3, q3, q11 -.endif + .endif subs r3, r3, #4 vst1.64 {d0, d1}, [r0,:128], r2 vst1.64 {d2, d3}, [r0,:128], r2 @@ -69,31 +69,31 @@ endfunc vst1.64 {d6, d7}, [r0,:128], r2 bne 1b bx lr - .endm +.endm - .macro pixels16_x2 vhadd=vrhadd.u8 +.macro pixels16_x2 rnd=1, avg=0 1: vld1.64 {d0-d2}, [r1], r2 vld1.64 {d4-d6}, [r1], r2 pld [r1] pld [r1, r2] subs r3, r3, #2 vext.8 q1, q0, q1, #1 - \vhadd q0, q0, q1 + avg q0, q0, q1 vext.8 q3, q2, q3, #1 - \vhadd q2, q2, q3 + avg q2, q2, q3 vst1.64 {d0, d1}, [r0,:128], r2 vst1.64 {d4, d5}, [r0,:128], r2 bne 1b bx lr - .endm +.endm - .macro pixels16_y2 vhadd=vrhadd.u8 +.macro pixels16_y2 rnd=1, avg=0 vld1.64 {d0, d1}, [r1], r2 vld1.64 {d2, d3}, [r1], r2 1: subs r3, r3, #2 - \vhadd q2, q0, q1 + avg q2, q0, q1 vld1.64 {d0, d1}, [r1], r2 - \vhadd q3, q0, q1 + avg q3, q0, q1 vld1.64 {d2, d3}, [r1], r2 pld [r1] pld [r1, r2] @@ -101,14 +101,14 @@ endfunc vst1.64 {d6, d7}, [r0,:128], r2 bne 1b bx lr - .endm +.endm - .macro pixels16_xy2 vshrn=vrshrn.u16 no_rnd=0 +.macro pixels16_xy2 rnd=1, avg=0 vld1.64 {d0-d2}, [r1], r2 vld1.64 {d4-d6}, [r1], r2 -.if \no_rnd + .ifeq \rnd vmov.i16 q13, #1 -.endif + .endif pld [r1] pld [r1, r2] vext.8 q1, q0, q1, #1 @@ -121,40 +121,40 @@ endfunc vld1.64 {d0-d2}, [r1], r2 vadd.u16 q12, q8, q9 pld [r1] -.if \no_rnd + .ifeq \rnd vadd.u16 q12, q12, q13 -.endif + .endif vext.8 q15, q0, q1, #1 vadd.u16 q1 , q10, q11 - \vshrn d28, q12, #2 -.if \no_rnd + shrn d28, q12, #2 + .ifeq \rnd vadd.u16 q1, q1, q13 -.endif - \vshrn d29, q1, #2 + .endif + shrn d29, q1, #2 vaddl.u8 q8, d0, d30 vld1.64 {d2-d4}, [r1], r2 vaddl.u8 q10, d1, d31 vst1.64 {d28,d29}, [r0,:128], r2 vadd.u16 q12, q8, q9 pld [r1, r2] -.if \no_rnd + .ifeq \rnd vadd.u16 q12, q12, q13 -.endif + .endif vext.8 q2, q1, q2, #1 vadd.u16 q0, q10, q11 - \vshrn d30, q12, #2 -.if \no_rnd + shrn d30, q12, #2 + .ifeq \rnd vadd.u16 q0, q0, q13 -.endif - \vshrn d31, q0, #2 + .endif + shrn d31, q0, #2 vaddl.u8 q9, d2, d4 vaddl.u8 q11, d3, d5 vst1.64 {d30,d31}, [r0,:128], r2 bgt 1b bx lr - .endm +.endm - .macro pixels8 avg=0 +.macro pixels8 rnd=1, avg=0 1: vld1.64 {d0}, [r1], r2 vld1.64 {d1}, [r1], r2 vld1.64 {d2}, [r1], r2 @@ -163,7 +163,7 @@ endfunc pld [r1] pld [r1, r2] pld [r1, r2, lsl #1] -.if \avg + .if \avg vld1.64 {d4}, [r0,:64], r2 vrhadd.u8 d0, d0, d4 vld1.64 {d5}, [r0,:64], r2 @@ -173,7 +173,7 @@ endfunc vld1.64 {d7}, [r0,:64], r2 vrhadd.u8 d3, d3, d7 sub r0, r0, r2, lsl #2 -.endif + .endif subs r3, r3, #4 vst1.64 {d0}, [r0,:64], r2 vst1.64 {d1}, [r0,:64], r2 @@ -181,9 +181,9 @@ endfunc vst1.64 {d3}, [r0,:64], r2 bne 1b bx lr - .endm +.endm - .macro pixels8_x2 vhadd=vrhadd.u8 +.macro pixels8_x2 rnd=1, avg=0 1: vld1.64 {d0, d1}, [r1], r2 vext.8 d1, d0, d1, #1 vld1.64 {d2, d3}, [r1], r2 @@ -192,20 +192,20 @@ endfunc pld [r1, r2] subs r3, r3, #2 vswp d1, d2 - \vhadd q0, q0, q1 + avg q0, q0, q1 vst1.64 {d0}, [r0,:64], r2 vst1.64 {d1}, [r0,:64], r2 bne 1b bx lr - .endm +.endm - .macro pixels8_y2 vhadd=vrhadd.u8 +.macro pixels8_y2 rnd=1, avg=0 vld1.64 {d0}, [r1], r2 vld1.64 {d1}, [r1], r2 1: subs r3, r3, #2 - \vhadd d4, d0, d1 + avg d4, d0, d1 vld1.64 {d0}, [r1], r2 - \vhadd d5, d0, d1 + avg d5, d0, d1 vld1.64 {d1}, [r1], r2 pld [r1] pld [r1, r2] @@ -213,14 +213,14 @@ endfunc vst1.64 {d5}, [r0,:64], r2 bne 1b bx lr - .endm +.endm - .macro pixels8_xy2 vshrn=vrshrn.u16 no_rnd=0 +.macro pixels8_xy2 rnd=1, avg=0 vld1.64 {d0, d1}, [r1], r2 vld1.64 {d2, d3}, [r1], r2 -.if \no_rnd + .ifeq \rnd vmov.i16 q11, #1 -.endif + .endif pld [r1] pld [r1, r2] vext.8 d4, d0, d1, #1 @@ -232,66 +232,83 @@ endfunc pld [r1] vadd.u16 q10, q8, q9 vext.8 d4, d0, d1, #1 -.if \no_rnd + .ifeq \rnd vadd.u16 q10, q10, q11 -.endif + .endif vaddl.u8 q8, d0, d4 - \vshrn d5, q10, #2 + shrn d5, q10, #2 vld1.64 {d2, d3}, [r1], r2 vadd.u16 q10, q8, q9 pld [r1, r2] -.if \no_rnd + .ifeq \rnd vadd.u16 q10, q10, q11 -.endif + .endif vst1.64 {d5}, [r0,:64], r2 - \vshrn d7, q10, #2 + shrn d7, q10, #2 vext.8 d6, d2, d3, #1 vaddl.u8 q9, d2, d6 vst1.64 {d7}, [r0,:64], r2 bgt 1b bx lr - .endm - - .macro pixfunc pfx name suf rnd_op args:vararg +.endm + +.macro pixfunc pfx, name, suf, rnd=1, avg=0 + .if \rnd + .macro avg rd, rn, rm + vrhadd.u8 \rd, \rn, \rm + .endm + .macro shrn rd, rn, rm + vrshrn.u16 \rd, \rn, \rm + .endm + .else + .macro avg rd, rn, rm + vhadd.u8 \rd, \rn, \rm + .endm + .macro shrn rd, rn, rm + vshrn.u16 \rd, \rn, \rm + .endm + .endif function ff_\pfx\name\suf\()_neon, export=1 - \name \rnd_op \args + \name \rnd, \avg endfunc - .endm + .purgem avg + .purgem shrn +.endm - .macro pixfunc2 pfx name args:vararg - pixfunc \pfx \name - pixfunc \pfx \name \args - .endm +.macro pixfunc2 pfx, name, avg=0 + pixfunc \pfx, \name, rnd=1, avg=\avg + pixfunc \pfx, \name, _no_rnd, rnd=0, avg=\avg +.endm function ff_put_h264_qpel16_mc00_neon, export=1 mov r3, #16 endfunc - pixfunc put_ pixels16 - pixfunc2 put_ pixels16_x2, _no_rnd, vhadd.u8 - pixfunc2 put_ pixels16_y2, _no_rnd, vhadd.u8 - pixfunc2 put_ pixels16_xy2, _no_rnd, vshrn.u16, 1 + pixfunc put_, pixels16, avg=0 + pixfunc2 put_, pixels16_x2, avg=0 + pixfunc2 put_, pixels16_y2, avg=0 + pixfunc2 put_, pixels16_xy2, avg=0 function ff_avg_h264_qpel16_mc00_neon, export=1 mov r3, #16 endfunc - pixfunc avg_ pixels16,, 1 + pixfunc avg_, pixels16, avg=1 function ff_put_h264_qpel8_mc00_neon, export=1 mov r3, #8 endfunc - pixfunc put_ pixels8 - pixfunc2 put_ pixels8_x2, _no_rnd, vhadd.u8 - pixfunc2 put_ pixels8_y2, _no_rnd, vhadd.u8 - pixfunc2 put_ pixels8_xy2, _no_rnd, vshrn.u16, 1 + pixfunc put_, pixels8, avg=0 + pixfunc2 put_, pixels8_x2, avg=0 + pixfunc2 put_, pixels8_y2, avg=0 + pixfunc2 put_, pixels8_xy2, avg=0 function ff_avg_h264_qpel8_mc00_neon, export=1 mov r3, #8 endfunc - pixfunc avg_ pixels8,, 1 + pixfunc avg_, pixels8, avg=1 function ff_put_pixels_clamped_neon, export=1 vld1.64 {d16-d19}, [r0,:128]! From 716f1705e994b9264a93f5c2648c4bba4e9ff7b9 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Thu, 1 Dec 2011 05:07:09 +0000 Subject: [PATCH 18/25] ARM: add remaining NEON avg_pixels8/16 functions --- libavcodec/arm/dsputil_init_neon.c | 27 +++++++++++++++++ libavcodec/arm/dsputil_neon.S | 48 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/libavcodec/arm/dsputil_init_neon.c b/libavcodec/arm/dsputil_init_neon.c index acb2132132..1631988a38 100644 --- a/libavcodec/arm/dsputil_init_neon.c +++ b/libavcodec/arm/dsputil_init_neon.c @@ -53,7 +53,19 @@ void ff_put_pixels8_y2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); void ff_put_pixels8_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); void ff_avg_pixels16_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels16_x2_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels16_y2_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels16_xy2_neon(uint8_t *, const uint8_t *, int, int); void ff_avg_pixels8_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels8_x2_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels8_y2_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels8_xy2_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels16_x2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels16_y2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels16_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels8_x2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels8_y2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); +void ff_avg_pixels8_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); void ff_add_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); void ff_put_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); @@ -211,7 +223,22 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) c->put_no_rnd_pixels_tab[1][3] = ff_put_pixels8_xy2_no_rnd_neon; c->avg_pixels_tab[0][0] = ff_avg_pixels16_neon; + c->avg_pixels_tab[0][1] = ff_avg_pixels16_x2_neon; + c->avg_pixels_tab[0][2] = ff_avg_pixels16_y2_neon; + c->avg_pixels_tab[0][3] = ff_avg_pixels16_xy2_neon; c->avg_pixels_tab[1][0] = ff_avg_pixels8_neon; + c->avg_pixels_tab[1][1] = ff_avg_pixels8_x2_neon; + c->avg_pixels_tab[1][2] = ff_avg_pixels8_y2_neon; + c->avg_pixels_tab[1][3] = ff_avg_pixels8_xy2_neon; + + c->avg_no_rnd_pixels_tab[0][0] = ff_avg_pixels16_neon; + c->avg_no_rnd_pixels_tab[0][1] = ff_avg_pixels16_x2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[0][2] = ff_avg_pixels16_y2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[0][3] = ff_avg_pixels16_xy2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[1][0] = ff_avg_pixels8_neon; + c->avg_no_rnd_pixels_tab[1][1] = ff_avg_pixels8_x2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[1][2] = ff_avg_pixels8_y2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[1][3] = ff_avg_pixels8_xy2_no_rnd_neon; } c->add_pixels_clamped = ff_add_pixels_clamped_neon; diff --git a/libavcodec/arm/dsputil_neon.S b/libavcodec/arm/dsputil_neon.S index 6f0a6e9012..8e2f2cb359 100644 --- a/libavcodec/arm/dsputil_neon.S +++ b/libavcodec/arm/dsputil_neon.S @@ -81,6 +81,13 @@ endfunc avg q0, q0, q1 vext.8 q3, q2, q3, #1 avg q2, q2, q3 + .if \avg + vld1.8 {q1}, [r0,:128], r2 + vld1.8 {q3}, [r0,:128] + vrhadd.u8 q0, q0, q1 + vrhadd.u8 q2, q2, q3 + sub r0, r0, r2 + .endif vst1.64 {d0, d1}, [r0,:128], r2 vst1.64 {d4, d5}, [r0,:128], r2 bne 1b @@ -97,6 +104,13 @@ endfunc vld1.64 {d2, d3}, [r1], r2 pld [r1] pld [r1, r2] + .if \avg + vld1.8 {q8}, [r0,:128], r2 + vld1.8 {q9}, [r0,:128] + vrhadd.u8 q2, q2, q8 + vrhadd.u8 q3, q3, q9 + sub r0, r0, r2 + .endif vst1.64 {d4, d5}, [r0,:128], r2 vst1.64 {d6, d7}, [r0,:128], r2 bne 1b @@ -131,6 +145,10 @@ endfunc vadd.u16 q1, q1, q13 .endif shrn d29, q1, #2 + .if \avg + vld1.8 {q8}, [r0,:128] + vrhadd.u8 q14, q14, q8 + .endif vaddl.u8 q8, d0, d30 vld1.64 {d2-d4}, [r1], r2 vaddl.u8 q10, d1, d31 @@ -147,6 +165,10 @@ endfunc vadd.u16 q0, q0, q13 .endif shrn d31, q0, #2 + .if \avg + vld1.8 {q9}, [r0,:128] + vrhadd.u8 q15, q15, q9 + .endif vaddl.u8 q9, d2, d4 vaddl.u8 q11, d3, d5 vst1.64 {d30,d31}, [r0,:128], r2 @@ -193,6 +215,12 @@ endfunc subs r3, r3, #2 vswp d1, d2 avg q0, q0, q1 + .if \avg + vld1.8 {d4}, [r0,:64], r2 + vld1.8 {d5}, [r0,:64] + vrhadd.u8 q0, q0, q2 + sub r0, r0, r2 + .endif vst1.64 {d0}, [r0,:64], r2 vst1.64 {d1}, [r0,:64], r2 bne 1b @@ -209,6 +237,12 @@ endfunc vld1.64 {d1}, [r1], r2 pld [r1] pld [r1, r2] + .if \avg + vld1.8 {d2}, [r0,:64], r2 + vld1.8 {d3}, [r0,:64] + vrhadd.u8 q2, q2, q1 + sub r0, r0, r2 + .endif vst1.64 {d4}, [r0,:64], r2 vst1.64 {d5}, [r0,:64], r2 bne 1b @@ -240,11 +274,19 @@ endfunc vld1.64 {d2, d3}, [r1], r2 vadd.u16 q10, q8, q9 pld [r1, r2] + .if \avg + vld1.8 {d7}, [r0,:64] + vrhadd.u8 d5, d5, d7 + .endif .ifeq \rnd vadd.u16 q10, q10, q11 .endif vst1.64 {d5}, [r0,:64], r2 shrn d7, q10, #2 + .if \avg + vld1.8 {d5}, [r0,:64] + vrhadd.u8 d7, d7, d5 + .endif vext.8 d6, d2, d3, #1 vaddl.u8 q9, d2, d6 vst1.64 {d7}, [r0,:64], r2 @@ -294,6 +336,9 @@ function ff_avg_h264_qpel16_mc00_neon, export=1 endfunc pixfunc avg_, pixels16, avg=1 + pixfunc2 avg_, pixels16_x2, avg=1 + pixfunc2 avg_, pixels16_y2, avg=1 + pixfunc2 avg_, pixels16_xy2, avg=1 function ff_put_h264_qpel8_mc00_neon, export=1 mov r3, #8 @@ -309,6 +354,9 @@ function ff_avg_h264_qpel8_mc00_neon, export=1 endfunc pixfunc avg_, pixels8, avg=1 + pixfunc2 avg_, pixels8_x2, avg=1 + pixfunc2 avg_, pixels8_y2, avg=1 + pixfunc2 avg_, pixels8_xy2, avg=1 function ff_put_pixels_clamped_neon, export=1 vld1.64 {d16-d19}, [r0,:128]! From 96fef6cf31b360ea6a4899361650a1608373f96c Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Thu, 1 Dec 2011 15:01:44 +0000 Subject: [PATCH 19/25] ARM: NEON put/avg_pixels8/16 cosmetics This makes whitespace and register names consistent with the style used in more recent code. Signed-off-by: Mans Rullgard --- libavcodec/arm/dsputil_neon.S | 114 +++++++++++++++++----------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/libavcodec/arm/dsputil_neon.S b/libavcodec/arm/dsputil_neon.S index 8e2f2cb359..d49aedd6c4 100644 --- a/libavcodec/arm/dsputil_neon.S +++ b/libavcodec/arm/dsputil_neon.S @@ -42,38 +42,38 @@ endfunc .macro pixels16 rnd=1, avg=0 .if \avg - mov ip, r0 + mov r12, r0 .endif -1: vld1.64 {d0, d1}, [r1], r2 - vld1.64 {d2, d3}, [r1], r2 - vld1.64 {d4, d5}, [r1], r2 +1: vld1.64 {q0}, [r1], r2 + vld1.64 {q1}, [r1], r2 + vld1.64 {q2}, [r1], r2 pld [r1, r2, lsl #2] - vld1.64 {d6, d7}, [r1], r2 + vld1.64 {q3}, [r1], r2 pld [r1] pld [r1, r2] pld [r1, r2, lsl #1] .if \avg - vld1.64 {d16,d17}, [ip,:128], r2 + vld1.64 {q8}, [r12,:128], r2 vrhadd.u8 q0, q0, q8 - vld1.64 {d18,d19}, [ip,:128], r2 + vld1.64 {q9}, [r12,:128], r2 vrhadd.u8 q1, q1, q9 - vld1.64 {d20,d21}, [ip,:128], r2 + vld1.64 {q10}, [r12,:128], r2 vrhadd.u8 q2, q2, q10 - vld1.64 {d22,d23}, [ip,:128], r2 + vld1.64 {q11}, [r12,:128], r2 vrhadd.u8 q3, q3, q11 .endif subs r3, r3, #4 - vst1.64 {d0, d1}, [r0,:128], r2 - vst1.64 {d2, d3}, [r0,:128], r2 - vst1.64 {d4, d5}, [r0,:128], r2 - vst1.64 {d6, d7}, [r0,:128], r2 + vst1.64 {q0}, [r0,:128], r2 + vst1.64 {q1}, [r0,:128], r2 + vst1.64 {q2}, [r0,:128], r2 + vst1.64 {q3}, [r0,:128], r2 bne 1b bx lr .endm .macro pixels16_x2 rnd=1, avg=0 -1: vld1.64 {d0-d2}, [r1], r2 - vld1.64 {d4-d6}, [r1], r2 +1: vld1.64 {d0-d2}, [r1], r2 + vld1.64 {d4-d6}, [r1], r2 pld [r1] pld [r1, r2] subs r3, r3, #2 @@ -88,20 +88,20 @@ endfunc vrhadd.u8 q2, q2, q3 sub r0, r0, r2 .endif - vst1.64 {d0, d1}, [r0,:128], r2 - vst1.64 {d4, d5}, [r0,:128], r2 + vst1.64 {q0}, [r0,:128], r2 + vst1.64 {q2}, [r0,:128], r2 bne 1b bx lr .endm .macro pixels16_y2 rnd=1, avg=0 - vld1.64 {d0, d1}, [r1], r2 - vld1.64 {d2, d3}, [r1], r2 + vld1.64 {q0}, [r1], r2 + vld1.64 {q1}, [r1], r2 1: subs r3, r3, #2 avg q2, q0, q1 - vld1.64 {d0, d1}, [r1], r2 + vld1.64 {q0}, [r1], r2 avg q3, q0, q1 - vld1.64 {d2, d3}, [r1], r2 + vld1.64 {q1}, [r1], r2 pld [r1] pld [r1, r2] .if \avg @@ -111,15 +111,15 @@ endfunc vrhadd.u8 q3, q3, q9 sub r0, r0, r2 .endif - vst1.64 {d4, d5}, [r0,:128], r2 - vst1.64 {d6, d7}, [r0,:128], r2 + vst1.64 {q2}, [r0,:128], r2 + vst1.64 {q3}, [r0,:128], r2 bne 1b bx lr .endm .macro pixels16_xy2 rnd=1, avg=0 - vld1.64 {d0-d2}, [r1], r2 - vld1.64 {d4-d6}, [r1], r2 + vld1.64 {d0-d2}, [r1], r2 + vld1.64 {d4-d6}, [r1], r2 .ifeq \rnd vmov.i16 q13, #1 .endif @@ -132,7 +132,7 @@ endfunc vaddl.u8 q9, d4, d6 vaddl.u8 q11, d5, d7 1: subs r3, r3, #2 - vld1.64 {d0-d2}, [r1], r2 + vld1.64 {d0-d2}, [r1], r2 vadd.u16 q12, q8, q9 pld [r1] .ifeq \rnd @@ -150,9 +150,9 @@ endfunc vrhadd.u8 q14, q14, q8 .endif vaddl.u8 q8, d0, d30 - vld1.64 {d2-d4}, [r1], r2 + vld1.64 {d2-d4}, [r1], r2 vaddl.u8 q10, d1, d31 - vst1.64 {d28,d29}, [r0,:128], r2 + vst1.64 {q14}, [r0,:128], r2 vadd.u16 q12, q8, q9 pld [r1, r2] .ifeq \rnd @@ -171,44 +171,44 @@ endfunc .endif vaddl.u8 q9, d2, d4 vaddl.u8 q11, d3, d5 - vst1.64 {d30,d31}, [r0,:128], r2 + vst1.64 {q15}, [r0,:128], r2 bgt 1b bx lr .endm .macro pixels8 rnd=1, avg=0 -1: vld1.64 {d0}, [r1], r2 - vld1.64 {d1}, [r1], r2 - vld1.64 {d2}, [r1], r2 +1: vld1.64 {d0}, [r1], r2 + vld1.64 {d1}, [r1], r2 + vld1.64 {d2}, [r1], r2 pld [r1, r2, lsl #2] - vld1.64 {d3}, [r1], r2 + vld1.64 {d3}, [r1], r2 pld [r1] pld [r1, r2] pld [r1, r2, lsl #1] .if \avg - vld1.64 {d4}, [r0,:64], r2 + vld1.64 {d4}, [r0,:64], r2 vrhadd.u8 d0, d0, d4 - vld1.64 {d5}, [r0,:64], r2 + vld1.64 {d5}, [r0,:64], r2 vrhadd.u8 d1, d1, d5 - vld1.64 {d6}, [r0,:64], r2 + vld1.64 {d6}, [r0,:64], r2 vrhadd.u8 d2, d2, d6 - vld1.64 {d7}, [r0,:64], r2 + vld1.64 {d7}, [r0,:64], r2 vrhadd.u8 d3, d3, d7 sub r0, r0, r2, lsl #2 .endif subs r3, r3, #4 - vst1.64 {d0}, [r0,:64], r2 - vst1.64 {d1}, [r0,:64], r2 - vst1.64 {d2}, [r0,:64], r2 - vst1.64 {d3}, [r0,:64], r2 + vst1.64 {d0}, [r0,:64], r2 + vst1.64 {d1}, [r0,:64], r2 + vst1.64 {d2}, [r0,:64], r2 + vst1.64 {d3}, [r0,:64], r2 bne 1b bx lr .endm .macro pixels8_x2 rnd=1, avg=0 -1: vld1.64 {d0, d1}, [r1], r2 +1: vld1.64 {q0}, [r1], r2 vext.8 d1, d0, d1, #1 - vld1.64 {d2, d3}, [r1], r2 + vld1.64 {q1}, [r1], r2 vext.8 d3, d2, d3, #1 pld [r1] pld [r1, r2] @@ -221,20 +221,20 @@ endfunc vrhadd.u8 q0, q0, q2 sub r0, r0, r2 .endif - vst1.64 {d0}, [r0,:64], r2 - vst1.64 {d1}, [r0,:64], r2 + vst1.64 {d0}, [r0,:64], r2 + vst1.64 {d1}, [r0,:64], r2 bne 1b bx lr .endm .macro pixels8_y2 rnd=1, avg=0 - vld1.64 {d0}, [r1], r2 - vld1.64 {d1}, [r1], r2 + vld1.64 {d0}, [r1], r2 + vld1.64 {d1}, [r1], r2 1: subs r3, r3, #2 avg d4, d0, d1 - vld1.64 {d0}, [r1], r2 + vld1.64 {d0}, [r1], r2 avg d5, d0, d1 - vld1.64 {d1}, [r1], r2 + vld1.64 {d1}, [r1], r2 pld [r1] pld [r1, r2] .if \avg @@ -243,15 +243,15 @@ endfunc vrhadd.u8 q2, q2, q1 sub r0, r0, r2 .endif - vst1.64 {d4}, [r0,:64], r2 - vst1.64 {d5}, [r0,:64], r2 + vst1.64 {d4}, [r0,:64], r2 + vst1.64 {d5}, [r0,:64], r2 bne 1b bx lr .endm .macro pixels8_xy2 rnd=1, avg=0 - vld1.64 {d0, d1}, [r1], r2 - vld1.64 {d2, d3}, [r1], r2 + vld1.64 {q0}, [r1], r2 + vld1.64 {q1}, [r1], r2 .ifeq \rnd vmov.i16 q11, #1 .endif @@ -262,7 +262,7 @@ endfunc vaddl.u8 q8, d0, d4 vaddl.u8 q9, d2, d6 1: subs r3, r3, #2 - vld1.64 {d0, d1}, [r1], r2 + vld1.64 {q0}, [r1], r2 pld [r1] vadd.u16 q10, q8, q9 vext.8 d4, d0, d1, #1 @@ -271,7 +271,7 @@ endfunc .endif vaddl.u8 q8, d0, d4 shrn d5, q10, #2 - vld1.64 {d2, d3}, [r1], r2 + vld1.64 {q1}, [r1], r2 vadd.u16 q10, q8, q9 pld [r1, r2] .if \avg @@ -281,7 +281,7 @@ endfunc .ifeq \rnd vadd.u16 q10, q10, q11 .endif - vst1.64 {d5}, [r0,:64], r2 + vst1.64 {d5}, [r0,:64], r2 shrn d7, q10, #2 .if \avg vld1.8 {d5}, [r0,:64] @@ -289,7 +289,7 @@ endfunc .endif vext.8 d6, d2, d3, #1 vaddl.u8 q9, d2, d6 - vst1.64 {d7}, [r0,:64], r2 + vst1.64 {d7}, [r0,:64], r2 bgt 1b bx lr .endm From 3adba2de3d0c4903cf310fcce80ebac4dd972fd3 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Thu, 1 Dec 2011 18:39:02 +0000 Subject: [PATCH 20/25] ARM: fix indentation in ff_dsputil_init_neon() Signed-off-by: Mans Rullgard --- libavcodec/arm/dsputil_init_neon.c | 80 +++++++++++++++--------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/libavcodec/arm/dsputil_init_neon.c b/libavcodec/arm/dsputil_init_neon.c index 1631988a38..68e5b3ed42 100644 --- a/libavcodec/arm/dsputil_init_neon.c +++ b/libavcodec/arm/dsputil_init_neon.c @@ -201,52 +201,51 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) } if (!high_bit_depth) { - c->clear_block = ff_clear_block_neon; - c->clear_blocks = ff_clear_blocks_neon; - - c->put_pixels_tab[0][0] = ff_put_pixels16_neon; - c->put_pixels_tab[0][1] = ff_put_pixels16_x2_neon; - c->put_pixels_tab[0][2] = ff_put_pixels16_y2_neon; - c->put_pixels_tab[0][3] = ff_put_pixels16_xy2_neon; - c->put_pixels_tab[1][0] = ff_put_pixels8_neon; - c->put_pixels_tab[1][1] = ff_put_pixels8_x2_neon; - c->put_pixels_tab[1][2] = ff_put_pixels8_y2_neon; - c->put_pixels_tab[1][3] = ff_put_pixels8_xy2_neon; - - c->put_no_rnd_pixels_tab[0][0] = ff_put_pixels16_neon; - c->put_no_rnd_pixels_tab[0][1] = ff_put_pixels16_x2_no_rnd_neon; - c->put_no_rnd_pixels_tab[0][2] = ff_put_pixels16_y2_no_rnd_neon; - c->put_no_rnd_pixels_tab[0][3] = ff_put_pixels16_xy2_no_rnd_neon; - c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_neon; - c->put_no_rnd_pixels_tab[1][1] = ff_put_pixels8_x2_no_rnd_neon; - c->put_no_rnd_pixels_tab[1][2] = ff_put_pixels8_y2_no_rnd_neon; - c->put_no_rnd_pixels_tab[1][3] = ff_put_pixels8_xy2_no_rnd_neon; - - c->avg_pixels_tab[0][0] = ff_avg_pixels16_neon; - c->avg_pixels_tab[0][1] = ff_avg_pixels16_x2_neon; - c->avg_pixels_tab[0][2] = ff_avg_pixels16_y2_neon; - c->avg_pixels_tab[0][3] = ff_avg_pixels16_xy2_neon; - c->avg_pixels_tab[1][0] = ff_avg_pixels8_neon; - c->avg_pixels_tab[1][1] = ff_avg_pixels8_x2_neon; - c->avg_pixels_tab[1][2] = ff_avg_pixels8_y2_neon; - c->avg_pixels_tab[1][3] = ff_avg_pixels8_xy2_neon; - - c->avg_no_rnd_pixels_tab[0][0] = ff_avg_pixels16_neon; - c->avg_no_rnd_pixels_tab[0][1] = ff_avg_pixels16_x2_no_rnd_neon; - c->avg_no_rnd_pixels_tab[0][2] = ff_avg_pixels16_y2_no_rnd_neon; - c->avg_no_rnd_pixels_tab[0][3] = ff_avg_pixels16_xy2_no_rnd_neon; - c->avg_no_rnd_pixels_tab[1][0] = ff_avg_pixels8_neon; - c->avg_no_rnd_pixels_tab[1][1] = ff_avg_pixels8_x2_no_rnd_neon; - c->avg_no_rnd_pixels_tab[1][2] = ff_avg_pixels8_y2_no_rnd_neon; - c->avg_no_rnd_pixels_tab[1][3] = ff_avg_pixels8_xy2_no_rnd_neon; + c->clear_block = ff_clear_block_neon; + c->clear_blocks = ff_clear_blocks_neon; + + c->put_pixels_tab[0][0] = ff_put_pixels16_neon; + c->put_pixels_tab[0][1] = ff_put_pixels16_x2_neon; + c->put_pixels_tab[0][2] = ff_put_pixels16_y2_neon; + c->put_pixels_tab[0][3] = ff_put_pixels16_xy2_neon; + c->put_pixels_tab[1][0] = ff_put_pixels8_neon; + c->put_pixels_tab[1][1] = ff_put_pixels8_x2_neon; + c->put_pixels_tab[1][2] = ff_put_pixels8_y2_neon; + c->put_pixels_tab[1][3] = ff_put_pixels8_xy2_neon; + + c->put_no_rnd_pixels_tab[0][0] = ff_put_pixels16_neon; + c->put_no_rnd_pixels_tab[0][1] = ff_put_pixels16_x2_no_rnd_neon; + c->put_no_rnd_pixels_tab[0][2] = ff_put_pixels16_y2_no_rnd_neon; + c->put_no_rnd_pixels_tab[0][3] = ff_put_pixels16_xy2_no_rnd_neon; + c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_neon; + c->put_no_rnd_pixels_tab[1][1] = ff_put_pixels8_x2_no_rnd_neon; + c->put_no_rnd_pixels_tab[1][2] = ff_put_pixels8_y2_no_rnd_neon; + c->put_no_rnd_pixels_tab[1][3] = ff_put_pixels8_xy2_no_rnd_neon; + + c->avg_pixels_tab[0][0] = ff_avg_pixels16_neon; + c->avg_pixels_tab[0][1] = ff_avg_pixels16_x2_neon; + c->avg_pixels_tab[0][2] = ff_avg_pixels16_y2_neon; + c->avg_pixels_tab[0][3] = ff_avg_pixels16_xy2_neon; + c->avg_pixels_tab[1][0] = ff_avg_pixels8_neon; + c->avg_pixels_tab[1][1] = ff_avg_pixels8_x2_neon; + c->avg_pixels_tab[1][2] = ff_avg_pixels8_y2_neon; + c->avg_pixels_tab[1][3] = ff_avg_pixels8_xy2_neon; + + c->avg_no_rnd_pixels_tab[0][0] = ff_avg_pixels16_neon; + c->avg_no_rnd_pixels_tab[0][1] = ff_avg_pixels16_x2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[0][2] = ff_avg_pixels16_y2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[0][3] = ff_avg_pixels16_xy2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[1][0] = ff_avg_pixels8_neon; + c->avg_no_rnd_pixels_tab[1][1] = ff_avg_pixels8_x2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[1][2] = ff_avg_pixels8_y2_no_rnd_neon; + c->avg_no_rnd_pixels_tab[1][3] = ff_avg_pixels8_xy2_no_rnd_neon; } c->add_pixels_clamped = ff_add_pixels_clamped_neon; c->put_pixels_clamped = ff_put_pixels_clamped_neon; c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_neon; - if (CONFIG_H264_DECODER) { - if (!high_bit_depth) { + if (CONFIG_H264_DECODER && !high_bit_depth) { c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_neon; c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_neon; c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_neon; @@ -322,7 +321,6 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) c->avg_h264_qpel_pixels_tab[1][13] = ff_avg_h264_qpel8_mc13_neon; c->avg_h264_qpel_pixels_tab[1][14] = ff_avg_h264_qpel8_mc23_neon; c->avg_h264_qpel_pixels_tab[1][15] = ff_avg_h264_qpel8_mc33_neon; - } } if (CONFIG_VP3_DECODER) { From 2574f08d4c30b37e39650a3b3d1970f75f3170cd Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Thu, 1 Dec 2011 12:45:10 -0800 Subject: [PATCH 21/25] h264: cap max has_b_frames at MAX_DELAYED_PIC_COUNT - 1. This prevents frame allocation overflows, and fixed fate-h264-conformance-mr3_tandberg_b with 2 threads. --- libavcodec/h264.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index ad1ab69e29..96062b7806 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -1438,7 +1438,7 @@ static void decode_postinit(H264Context *h, int setup_finished){ if( s->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT && !h->sps.bitstream_restriction_flag){ - s->avctx->has_b_frames= MAX_DELAYED_PIC_COUNT; + s->avctx->has_b_frames = MAX_DELAYED_PIC_COUNT - 1; s->low_delay= 0; } From 2d31d890bfce103512dca34e35815762eb61b5da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 30 Nov 2011 22:03:43 +0200 Subject: [PATCH 22/25] rtpenc: Cast a rescaling parameter to int64_t MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This avoids overflow if frame_size is over 2147, since both frame_size and AV_TIME_BASE are plain integers. Signed-off-by: Martin Storsjö --- libavformat/rtpenc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c index 77ae6f327a..88b85b995c 100644 --- a/libavformat/rtpenc.c +++ b/libavformat/rtpenc.c @@ -121,7 +121,7 @@ static int rtp_write_header(AVFormatContext *s1) if (st->codec->frame_size == 0) { av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n"); } else { - s->max_frames_per_packet = av_rescale_rnd(s1->max_delay, st->codec->sample_rate, AV_TIME_BASE * st->codec->frame_size, AV_ROUND_DOWN); + s->max_frames_per_packet = av_rescale_rnd(s1->max_delay, st->codec->sample_rate, AV_TIME_BASE * (int64_t)st->codec->frame_size, AV_ROUND_DOWN); } } if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { From 77e0c7584b595edcec7bf393c0e77dbcfe2a8cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 30 Nov 2011 23:10:54 +0200 Subject: [PATCH 23/25] rtpenc: Change rtp_send_samples to handle sample sizes other than even bytes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/rtpenc.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c index 88b85b995c..7434837a02 100644 --- a/libavformat/rtpenc.c +++ b/libavformat/rtpenc.c @@ -248,14 +248,16 @@ void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m) /* send an integer number of samples and compute time stamp and fill the rtp send buffer before sending. */ static void rtp_send_samples(AVFormatContext *s1, - const uint8_t *buf1, int size, int sample_size) + const uint8_t *buf1, int size, int sample_size_bits) { RTPMuxContext *s = s1->priv_data; int len, max_packet_size, n; + /* Calculate the number of bytes to get samples aligned on a byte border */ + int aligned_samples_size = sample_size_bits/av_gcd(sample_size_bits, 8); - max_packet_size = (s->max_payload_size / sample_size) * sample_size; - /* not needed, but who nows */ - if ((size % sample_size) != 0) + max_packet_size = (s->max_payload_size / aligned_samples_size) * aligned_samples_size; + /* Not needed, but who knows. Don't check if samples aren't an even number of bytes. */ + if ((sample_size_bits % 8) == 0 && ((8 * size) % sample_size_bits) != 0) av_abort(); n = 0; while (size > 0) { @@ -267,7 +269,7 @@ static void rtp_send_samples(AVFormatContext *s1, s->buf_ptr += len; buf1 += len; size -= len; - s->timestamp = s->cur_timestamp + n / sample_size; + s->timestamp = s->cur_timestamp + n * 8 / sample_size_bits; ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0); n += (s->buf_ptr - s->buf); } @@ -394,19 +396,20 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) case CODEC_ID_PCM_ALAW: case CODEC_ID_PCM_U8: case CODEC_ID_PCM_S8: - rtp_send_samples(s1, pkt->data, size, 1 * st->codec->channels); + rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels); break; case CODEC_ID_PCM_U16BE: case CODEC_ID_PCM_U16LE: case CODEC_ID_PCM_S16BE: case CODEC_ID_PCM_S16LE: - rtp_send_samples(s1, pkt->data, size, 2 * st->codec->channels); + rtp_send_samples(s1, pkt->data, size, 16 * st->codec->channels); break; case CODEC_ID_ADPCM_G722: /* The actual sample size is half a byte per sample, but since the * stream clock rate is 8000 Hz while the sample rate is 16000 Hz, - * the correct parameter for send_samples is 1 byte per stream clock. */ - rtp_send_samples(s1, pkt->data, size, 1 * st->codec->channels); + * the correct parameter for send_samples_bits is 8 bits per stream + * clock. */ + rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels); break; case CODEC_ID_MP2: case CODEC_ID_MP3: From fa6dce4c572fd52266201f1c9d83d26bc662bf56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 1 Dec 2011 10:45:26 +0200 Subject: [PATCH 24/25] rtpdec: Interpret the different G726 names as bits_per_coded_sample MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For the standardized 8 kHz sample rate, this works exactly the same. For nonstandard sample rates, the different predefined G726 names (G726-16, G726-24, G726-32, G726-40) are interpreted as an indication of the bits per coded sample, even though their actual bitrates aren't what the name specifies. This feels more sane than using free-form names for nonstandard sample rate/bitrate combinations, e.g like G726-22, G726-33 for 11025 Hz. Signed-off-by: Martin Storsjö --- libavformat/rtpdec_g726.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libavformat/rtpdec_g726.c b/libavformat/rtpdec_g726.c index 5735c2cba6..4a0b6acf59 100644 --- a/libavformat/rtpdec_g726.c +++ b/libavformat/rtpdec_g726.c @@ -27,10 +27,8 @@ static int g726_ ## bitrate ##_init(AVFormatContext *s, int st_index, PayloadCon AVStream *stream = s->streams[st_index]; \ AVCodecContext *codec = stream->codec; \ \ - codec->bit_rate = bitrate*1000; \ - if (codec->sample_rate) \ - codec->bits_per_coded_sample = \ - av_clip((codec->bit_rate + codec->sample_rate/2) / codec->sample_rate, 2, 5); \ + codec->bits_per_coded_sample = bitrate/8; \ + codec->bit_rate = codec->bits_per_coded_sample * codec->sample_rate; \ \ return 0; \ } \ From 04403ec2e405a3cfcfbdd45f1274be30c652e462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 30 Nov 2011 23:11:50 +0200 Subject: [PATCH 25/25] rtpenc: Add support for G726 audio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/rtpenc.c | 5 +++++ libavformat/sdp.c | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c index 7434837a02..1f036a6baf 100644 --- a/libavformat/rtpenc.c +++ b/libavformat/rtpenc.c @@ -72,6 +72,7 @@ static int is_supported(enum CodecID id) case CODEC_ID_THEORA: case CODEC_ID_VP8: case CODEC_ID_ADPCM_G722: + case CODEC_ID_ADPCM_G726: return 1; default: return 0; @@ -411,6 +412,10 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) * clock. */ rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels); break; + case CODEC_ID_ADPCM_G726: + rtp_send_samples(s1, pkt->data, size, + st->codec->bits_per_coded_sample * st->codec->channels); + break; case CODEC_ID_MP2: case CODEC_ID_MP3: rtp_send_mpegaudio(s1, pkt->data, size); diff --git a/libavformat/sdp.c b/libavformat/sdp.c index ba3d4dd611..f0d4253da2 100644 --- a/libavformat/sdp.c +++ b/libavformat/sdp.c @@ -517,6 +517,14 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, payload_type, 8000, c->channels); break; + case CODEC_ID_ADPCM_G726: { + if (payload_type >= RTP_PT_PRIVATE) + av_strlcatf(buff, size, "a=rtpmap:%d G726-%d/%d\r\n", + payload_type, + c->bits_per_coded_sample*8, + c->sample_rate); + break; + } default: /* Nothing special to do here... */ break;