diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-05-08 21:10:56 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-05-08 22:02:59 +0200 |
commit | b4178a3f13784604281dc3da31383783676b8fec (patch) | |
tree | 5cbcf5e4bf9288ee4743e47e90a3dcacb45f3df0 /libavcodec/lagarith.c | |
parent | b4b58485135dbc37a6cf8a57196157b1d67d13e1 (diff) | |
parent | b2e495afa8e23b46536e25e892157104437f4020 (diff) | |
download | ffmpeg-b4178a3f13784604281dc3da31383783676b8fec.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
rtmp: Support 'rtmp_live', an option which specifies if the media is a live stream.
av_samples_fill_array: Mark unmodified function argument as const.
lagarith: add YUY2 decoding support
Support decoding unaligned rgb24 lagarith.
dv: Split profile handling code into a separate file.
flvenc: use AVFormatContext, not AVCodecContext for logging.
mov: Remove write-only variable in mov_read_chan().
fate: Change the probe-format refs to match the final text format committed.
fate: Add avprobe as a make dependency
Add probe fate tests to test for regressions in detecting media types.
fate: Add oneline comparison method
qdm2: clip array indices returned by qdm2_get_vlc().
avplay: properly close/reopen AVAudioResampleContext on channel layout change
avcodec: do not needlessly set packet size to 0 in avcodec_encode_audio2()
avcodec: for audio encoding, reset output packet when it is not valid
avcodec: refactor avcodec_encode_audio2() to merge common branches
avcodec: remove fallbacks for AVCodec.encode() in avcodec_encode_audio2()
Conflicts:
ffplay.c
libavcodec/Makefile
libavcodec/dvdata.c
libavcodec/dvdata.h
libavcodec/qdm2.c
libavcodec/utils.c
libavformat/flvenc.c
libavformat/mov.c
tests/Makefile
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/lagarith.c')
-rw-r--r-- | libavcodec/lagarith.c | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c index c2a8ed18e4..27793acdb0 100644 --- a/libavcodec/lagarith.c +++ b/libavcodec/lagarith.c @@ -269,6 +269,40 @@ static void lag_pred_line(LagarithContext *l, uint8_t *buf, } } +static void lag_pred_line_yuy2(LagarithContext *l, uint8_t *buf, + int width, int stride, int line, + int is_luma) +{ + int L, TL; + + if (!line) { + if (is_luma) { + buf++; + width--; + } + l->dsp.add_hfyu_left_prediction(buf + 1, buf + 1, width - 1, buf[0]); + return; + } + if (line == 1) { + const int HEAD = is_luma ? 4 : 2; + int i; + + L = buf[width - stride - 1]; + TL = buf[HEAD - stride - 1]; + for (i = 0; i < HEAD; i++) { + L += buf[i]; + buf[i] = L; + } + buf += HEAD; + width -= HEAD; + } else { + TL = buf[width - (2 * stride) - 1]; + L = buf[width - stride - 1]; + } + l->dsp.add_hfyu_median_prediction(buf, buf - stride, buf, width, + &L, &TL); +} + static int lag_decode_line(LagarithContext *l, lag_rac *rac, uint8_t *dst, int width, int stride, int esc_count) @@ -442,9 +476,17 @@ static int lag_decode_arith_plane(LagarithContext *l, uint8_t *dst, return -1; } - for (i = 0; i < height; i++) { - lag_pred_line(l, dst, width, stride, i); - dst += stride; + if (l->avctx->pix_fmt != PIX_FMT_YUV422P) { + for (i = 0; i < height; i++) { + lag_pred_line(l, dst, width, stride, i); + dst += stride; + } + } else { + for (i = 0; i < height; i++) { + lag_pred_line_yuy2(l, dst, width, stride, i, + width == l->avctx->width); + dst += stride; + } } return 0; @@ -566,6 +608,32 @@ static int lag_decode_frame(AVCodecContext *avctx, srcs[i] += l->rgb_stride; } break; + case FRAME_ARITH_YUY2: + avctx->pix_fmt = PIX_FMT_YUV422P; + + if (avctx->get_buffer(avctx, p) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return -1; + } + + if (offset_ry >= buf_size || + offset_gu >= buf_size || + offset_bv >= buf_size) { + av_log(avctx, AV_LOG_ERROR, + "Invalid frame offsets\n"); + return AVERROR_INVALIDDATA; + } + + lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height, + p->linesize[0], buf + offset_ry, + buf_size - offset_ry); + lag_decode_arith_plane(l, p->data[2], avctx->width / 2, + avctx->height, p->linesize[2], + buf + offset_gu, buf_size - offset_gu); + lag_decode_arith_plane(l, p->data[1], avctx->width / 2, + avctx->height, p->linesize[1], + buf + offset_bv, buf_size - offset_bv); + break; case FRAME_ARITH_YV12: avctx->pix_fmt = PIX_FMT_YUV420P; |