From 39616fc30746ca07608f7855e85bd89cb08cfd27 Mon Sep 17 00:00:00 2001 From: Nathan Caldwell Date: Wed, 16 Nov 2011 00:45:00 -0700 Subject: [PATCH 1/7] lagarith: Add correct line prediction for RGB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavcodec/lagarith.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c index 10cc71e0d8..9200773a65 100644 --- a/libavcodec/lagarith.c +++ b/libavcodec/lagarith.c @@ -245,21 +245,21 @@ static void lag_pred_line(LagarithContext *l, uint8_t *buf, { int L, TL; + /* Left pixel is actually prev_row[width] */ + L = buf[width - stride - 1]; if (!line) { /* Left prediction only for first line */ L = l->dsp.add_hfyu_left_prediction(buf + 1, buf + 1, width - 1, buf[0]); return; } else if (line == 1) { - /* Second line, left predict first pixel, the rest of the line is median predicted */ - /* FIXME: In the case of RGB this pixel is top predicted */ - TL = buf[-stride]; + /* Second line, left predict first pixel, the rest of the line is median predicted + * NOTE: In the case of RGB this pixel is top predicted */ + TL = l->avctx->pix_fmt == PIX_FMT_YUV420P ? buf[-stride] : L; } else { /* Top left is 2 rows back, last pixel */ TL = buf[width - (2 * stride) - 1]; } - /* Left pixel is actually prev_row[width] */ - L = buf[width - stride - 1]; add_lag_median_prediction(buf, buf - stride, buf, width, &L, &TL); From ffc638c283c3ad8a67bf9e3591ec6fa59209caea Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 12 Nov 2011 20:54:27 +0100 Subject: [PATCH 2/7] lagarith: add some RGBA decoding support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavcodec/lagarith.c | 67 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c index 9200773a65..1aa9ec305e 100644 --- a/libavcodec/lagarith.c +++ b/libavcodec/lagarith.c @@ -51,6 +51,8 @@ typedef struct LagarithContext { DSPContext dsp; int zeros; /**< number of consecutive zero bytes encountered */ int zeros_rem; /**< number of zero bytes remaining to output */ + uint8_t *rgb_planes; + int rgb_stride; } LagarithContext; /** @@ -443,6 +445,9 @@ static int lag_decode_frame(AVCodecContext *avctx, AVFrame *const p = &l->picture; uint8_t frametype = 0; uint32_t offset_gu = 0, offset_bv = 0, offset_ry = 9; + int offs[4]; + uint8_t *srcs[4], *dst; + int i, j; AVFrame *picture = data; @@ -458,6 +463,67 @@ static int lag_decode_frame(AVCodecContext *avctx, offset_bv = AV_RL32(buf + 5); switch (frametype) { + case FRAME_SOLID_RGBA: + avctx->pix_fmt = PIX_FMT_RGB32; + + if (avctx->get_buffer(avctx, p) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return -1; + } + + dst = p->data[0]; + for (j = 0; j < avctx->height; j++) { + for (i = 0; i < avctx->width; i++) + AV_WN32(dst + i * 4, offset_gu); + dst += p->linesize[0]; + } + break; + case FRAME_ARITH_RGBA: + avctx->pix_fmt = PIX_FMT_RGB32; + + if (avctx->get_buffer(avctx, p) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return -1; + } + offs[0] = offset_bv; + offs[1] = offset_gu; + offs[2] = 13; + offs[3] = AV_RL32(buf + 9); + + if (!l->rgb_planes) { + l->rgb_stride = FFALIGN(avctx->width, 16); + l->rgb_planes = av_malloc(l->rgb_stride * avctx->height * 4); + if (!l->rgb_planes) { + av_log(avctx, AV_LOG_ERROR, "cannot allocate temporary buffer\n"); + return AVERROR(ENOMEM); + } + } + for (i = 0; i < 4; i++) + srcs[i] = l->rgb_planes + (i + 1) * l->rgb_stride * avctx->height - l->rgb_stride; + for (i = 0; i < 4; i++) + lag_decode_arith_plane(l, srcs[i], + avctx->width, avctx->height, + -l->rgb_stride, buf + offs[i], + buf_size); + dst = p->data[0]; + for (i = 0; i < 4; i++) + srcs[i] = l->rgb_planes + i * l->rgb_stride * avctx->height; + for (j = 0; j < avctx->height; j++) { + for (i = 0; i < avctx->width; i++) { + uint8_t r, g, b, a; + r = srcs[0][i]; + g = srcs[1][i]; + b = srcs[2][i]; + a = srcs[3][i]; + r += g; + b += g; + AV_WN32(dst + i * 4, MKBETAG(a, r, g, b)); + } + dst += p->linesize[0]; + for (i = 0; i < 4; i++) + srcs[i] += l->rgb_stride; + } + break; case FRAME_ARITH_YV12: avctx->pix_fmt = PIX_FMT_YUV420P; @@ -504,6 +570,7 @@ static av_cold int lag_decode_end(AVCodecContext *avctx) if (l->picture.data[0]) avctx->release_buffer(avctx, &l->picture); + av_freep(&l->rgb_planes); return 0; } From 747283a0788b088872ca58d3d15bb2ec5349dcb0 Mon Sep 17 00:00:00 2001 From: Mike Melanson Date: Tue, 15 Nov 2011 23:06:48 -0800 Subject: [PATCH 3/7] cinepak: Add another special case so that it can handle the following file: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit http://samples.mplayerhq.hu/V-codecs/CVID/bad_cinepak_frame_size.mov This fix works around another work around which handles a different type of odd Cinepak data. Thanks to Matthew Hoops (clone2727 - gmail.com) for the sample and fix. Signed-off-by: Martin Storsjö --- libavcodec/cinepak.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libavcodec/cinepak.c b/libavcodec/cinepak.c index c5d47be2ac..f8b5352e35 100644 --- a/libavcodec/cinepak.c +++ b/libavcodec/cinepak.c @@ -330,12 +330,13 @@ static int cinepak_decode (CinepakContext *s) /* if this is the first frame, check for deviant Sega FILM data */ if (s->sega_film_skip_bytes == -1) { - if (encoded_buf_size != s->size) { + if (encoded_buf_size != s->size && (s->size % encoded_buf_size) != 0) { /* If the encoded frame size differs from the frame size as indicated * by the container file, this data likely comes from a Sega FILM/CPK file. * If the frame header is followed by the bytes FE 00 00 06 00 00 then * this is probably one of the two known files that have 6 extra bytes - * after the frame header. Else, assume 2 extra bytes. */ + * after the frame header. Else, assume 2 extra bytes. The container + * size also cannot be a multiple of the encoded size. */ if (s->size >= 16 && (s->data[10] == 0xFE) && (s->data[11] == 0x00) && From 627067118c6674dd944df962d24cf386afcd4326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Mon, 7 Nov 2011 23:20:31 +0200 Subject: [PATCH 4/7] avutil: Add av_timegm as a public function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is useful, since the normal timegm function isn't a standard function (requiring _BSD_SOURCE or _SVID_SOURCE on glibc to be visible, and not available on e.g. windows). The widely available function mktime uses the local time zone, which requires ugly workarounds to handle UTC time. Signed-off-by: Martin Storsjö --- doc/APIchanges | 3 +++ libavutil/avutil.h | 2 +- libavutil/parseutils.c | 4 ++-- libavutil/parseutils.h | 7 +++++++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 5ef1fa50df..c45aca62a2 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,9 @@ libavutil: 2011-04-18 API changes, most recent first: +2011-11-xx - xxxxxxx - lavu 51.16.0 + Add av_timegm() + 2011-11-06 - ba04ecf - lavu 51.14.0 Add av_strcasecmp() and av_strncasecmp() to avstring.h. diff --git a/libavutil/avutil.h b/libavutil/avutil.h index 4b226e0fb9..436f79b82d 100644 --- a/libavutil/avutil.h +++ b/libavutil/avutil.h @@ -40,7 +40,7 @@ #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) #define LIBAVUTIL_VERSION_MAJOR 51 -#define LIBAVUTIL_VERSION_MINOR 15 +#define LIBAVUTIL_VERSION_MINOR 16 #define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ diff --git a/libavutil/parseutils.c b/libavutil/parseutils.c index c1647a0e20..a1d221b62a 100644 --- a/libavutil/parseutils.c +++ b/libavutil/parseutils.c @@ -461,7 +461,7 @@ static const char *small_strptime(const char *p, const char *fmt, struct tm *dt) } } -static time_t mktimegm(struct tm *tm) +time_t av_timegm(struct tm *tm) { time_t t; @@ -582,7 +582,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration) } else { dt.tm_isdst = -1; /* unknown */ if (is_utc) { - t = mktimegm(&dt); + t = av_timegm(&dt); } else { t = mktime(&dt); } diff --git a/libavutil/parseutils.h b/libavutil/parseutils.h index 0d78b3ea3b..cd913d8ceb 100644 --- a/libavutil/parseutils.h +++ b/libavutil/parseutils.h @@ -19,6 +19,8 @@ #ifndef AVUTIL_PARSEUTILS_H #define AVUTIL_PARSEUTILS_H +#include + #include "rational.h" /** @@ -114,4 +116,9 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration); */ int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info); +/** + * Convert the decomposed UTC time in tm to a time_t value. + */ +time_t av_timegm(struct tm *tm); + #endif /* AVUTIL_PARSEUTILS_H */ From 4a835416508820de383cda8cc906b6f1bd938889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Mon, 7 Nov 2011 23:32:21 +0200 Subject: [PATCH 5/7] avformat: Interpret times in ff_iso8601_to_unix_time as UTC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This function is used in muxers for parsing the 'creation_time' metadata key, for converting it to a time value. This makes it match the behaviour of the exported 'creation_time' metadata from demuxers, where it is in UTC, too. Signed-off-by: Martin Storsjö --- libavformat/utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index 11cb4f8b8e..dfcac203db 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -32,6 +32,7 @@ #include "id3v2.h" #include "libavutil/avstring.h" #include "libavutil/mathematics.h" +#include "libavutil/parseutils.h" #include "riff.h" #include "audiointerleave.h" #include "url.h" @@ -3944,7 +3945,7 @@ int64_t ff_iso8601_to_unix_time(const char *datestr) #if HAVE_STRPTIME struct tm time = {0}; strptime(datestr, "%Y - %m - %dT%T", &time); - return mktime(&time); + return av_timegm(&time); #else av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert " "the date string.\n"); From 18579f08e73d8b072952b7e388c55ab407db0ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 8 Nov 2011 00:12:09 +0200 Subject: [PATCH 6/7] avformat: Accept the ISO8601 separate format as input, too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes the function accept the format of creation_time as output by demuxers (e.g. the mov demuxer), making the creation timestamp stay intact if transcoding. Signed-off-by: Martin Storsjö --- libavformat/utils.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index dfcac203db..b8262ecaf1 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -3943,9 +3943,14 @@ void ff_make_absolute_url(char *buf, int size, const char *base, int64_t ff_iso8601_to_unix_time(const char *datestr) { #if HAVE_STRPTIME - struct tm time = {0}; - strptime(datestr, "%Y - %m - %dT%T", &time); - return av_timegm(&time); + struct tm time1 = {0}, time2 = {0}; + char *ret1, *ret2; + ret1 = strptime(datestr, "%Y - %m - %d %T", &time1); + ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2); + if (ret2 && !ret1) + return av_timegm(&time2); + else + return av_timegm(&time1); #else av_log(NULL, AV_LOG_WARNING, "strptime() unavailable on this system, cannot convert " "the date string.\n"); From 268fb3f9851590aed724dba83d3999c8369c929f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 16 Nov 2011 11:33:53 +0200 Subject: [PATCH 7/7] mpegaudiodec: Don't use a nonexistent log context for av_dlog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes builds with DEBUG defined, broken since 1158745a2d12966c58e83b66243a42f20190812e. Signed-off-by: Martin Storsjö --- libavcodec/mpegaudiodec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c index f8193d6ebb..bc012731b9 100644 --- a/libavcodec/mpegaudiodec.c +++ b/libavcodec/mpegaudiodec.c @@ -288,7 +288,7 @@ static void decode_init_static(AVCodec *codec) scale_factor_mult[i][0] = MULLx(norm, FIXR(1.0 * 2.0), FRAC_BITS); scale_factor_mult[i][1] = MULLx(norm, FIXR(0.7937005259 * 2.0), FRAC_BITS); scale_factor_mult[i][2] = MULLx(norm, FIXR(0.6299605249 * 2.0), FRAC_BITS); - av_dlog(avctx, "%d: norm=%x s=%x %x %x\n", i, norm, + av_dlog(NULL, "%d: norm=%x s=%x %x %x\n", i, norm, scale_factor_mult[i][0], scale_factor_mult[i][1], scale_factor_mult[i][2]); @@ -393,7 +393,7 @@ static void decode_init_static(AVCodec *codec) k = i & 1; is_table_lsf[j][k ^ 1][i] = FIXR(f); is_table_lsf[j][k ][i] = FIXR(1.0); - av_dlog(avctx, "is_table_lsf %d %d: %f %f\n", + av_dlog(NULL, "is_table_lsf %d %d: %f %f\n", i, j, (float) is_table_lsf[j][0][i], (float) is_table_lsf[j][1][i]); }