mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
imgconvert: Move the shrink functions only where needed
This commit is contained in:
parent
9d3ea5cbf5
commit
892f037c55
@ -25,7 +25,6 @@
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "imgconvert.h"
|
||||
#include "internal.h"
|
||||
#include "mathops.h"
|
||||
#include "libavutil/colorspace.h"
|
||||
@ -154,92 +153,6 @@ enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat *pix_fmt_list,
|
||||
return dst_pix_fmt;
|
||||
}
|
||||
|
||||
/* 2x2 -> 1x1 */
|
||||
void ff_shrink22(uint8_t *dst, int dst_wrap,
|
||||
const uint8_t *src, int src_wrap,
|
||||
int width, int height)
|
||||
{
|
||||
int w;
|
||||
const uint8_t *s1, *s2;
|
||||
uint8_t *d;
|
||||
|
||||
for(;height > 0; height--) {
|
||||
s1 = src;
|
||||
s2 = s1 + src_wrap;
|
||||
d = dst;
|
||||
for(w = width;w >= 4; w-=4) {
|
||||
d[0] = (s1[0] + s1[1] + s2[0] + s2[1] + 2) >> 2;
|
||||
d[1] = (s1[2] + s1[3] + s2[2] + s2[3] + 2) >> 2;
|
||||
d[2] = (s1[4] + s1[5] + s2[4] + s2[5] + 2) >> 2;
|
||||
d[3] = (s1[6] + s1[7] + s2[6] + s2[7] + 2) >> 2;
|
||||
s1 += 8;
|
||||
s2 += 8;
|
||||
d += 4;
|
||||
}
|
||||
for(;w > 0; w--) {
|
||||
d[0] = (s1[0] + s1[1] + s2[0] + s2[1] + 2) >> 2;
|
||||
s1 += 2;
|
||||
s2 += 2;
|
||||
d++;
|
||||
}
|
||||
src += 2 * src_wrap;
|
||||
dst += dst_wrap;
|
||||
}
|
||||
}
|
||||
|
||||
/* 4x4 -> 1x1 */
|
||||
void ff_shrink44(uint8_t *dst, int dst_wrap,
|
||||
const uint8_t *src, int src_wrap,
|
||||
int width, int height)
|
||||
{
|
||||
int w;
|
||||
const uint8_t *s1, *s2, *s3, *s4;
|
||||
uint8_t *d;
|
||||
|
||||
for(;height > 0; height--) {
|
||||
s1 = src;
|
||||
s2 = s1 + src_wrap;
|
||||
s3 = s2 + src_wrap;
|
||||
s4 = s3 + src_wrap;
|
||||
d = dst;
|
||||
for(w = width;w > 0; w--) {
|
||||
d[0] = (s1[0] + s1[1] + s1[2] + s1[3] +
|
||||
s2[0] + s2[1] + s2[2] + s2[3] +
|
||||
s3[0] + s3[1] + s3[2] + s3[3] +
|
||||
s4[0] + s4[1] + s4[2] + s4[3] + 8) >> 4;
|
||||
s1 += 4;
|
||||
s2 += 4;
|
||||
s3 += 4;
|
||||
s4 += 4;
|
||||
d++;
|
||||
}
|
||||
src += 4 * src_wrap;
|
||||
dst += dst_wrap;
|
||||
}
|
||||
}
|
||||
|
||||
/* 8x8 -> 1x1 */
|
||||
void ff_shrink88(uint8_t *dst, int dst_wrap,
|
||||
const uint8_t *src, int src_wrap,
|
||||
int width, int height)
|
||||
{
|
||||
int w, i;
|
||||
|
||||
for(;height > 0; height--) {
|
||||
for(w = width;w > 0; w--) {
|
||||
int tmp=0;
|
||||
for(i=0; i<8; i++){
|
||||
tmp += src[0] + src[1] + src[2] + src[3] + src[4] + src[5] + src[6] + src[7];
|
||||
src += src_wrap;
|
||||
}
|
||||
*(dst++) = (tmp + 32)>>6;
|
||||
src += 8 - 8*src_wrap;
|
||||
}
|
||||
src += 8*src_wrap - 8*width;
|
||||
dst += dst_wrap - width;
|
||||
}
|
||||
}
|
||||
|
||||
/* return true if yuv planar */
|
||||
static inline int is_yuv_planar(const AVPixFmtDescriptor *desc)
|
||||
{
|
||||
|
@ -1,31 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_IMGCONVERT_H
|
||||
#define AVCODEC_IMGCONVERT_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "version.h"
|
||||
|
||||
/* 1/2^n downscaling functions */
|
||||
void ff_shrink22(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height);
|
||||
void ff_shrink44(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height);
|
||||
void ff_shrink88(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height);
|
||||
|
||||
#endif /* AVCODEC_IMGCONVERT_H */
|
@ -24,7 +24,6 @@
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
#include "avcodec.h"
|
||||
#include "imgconvert.h"
|
||||
#include "me_cmp.h"
|
||||
#include "mpegvideoencdsp.h"
|
||||
|
||||
@ -153,6 +152,93 @@ static void draw_edges_8_c(uint8_t *buf, int wrap, int width, int height,
|
||||
memcpy(last_line + (i + 1) * wrap, last_line, width + w + w);
|
||||
}
|
||||
|
||||
/* 2x2 -> 1x1 */
|
||||
static void shrink22(uint8_t *dst, int dst_wrap,
|
||||
const uint8_t *src, int src_wrap,
|
||||
int width, int height)
|
||||
{
|
||||
int w;
|
||||
const uint8_t *s1, *s2;
|
||||
uint8_t *d;
|
||||
|
||||
for (; height > 0; height--) {
|
||||
s1 = src;
|
||||
s2 = s1 + src_wrap;
|
||||
d = dst;
|
||||
for (w = width; w >= 4; w -= 4) {
|
||||
d[0] = (s1[0] + s1[1] + s2[0] + s2[1] + 2) >> 2;
|
||||
d[1] = (s1[2] + s1[3] + s2[2] + s2[3] + 2) >> 2;
|
||||
d[2] = (s1[4] + s1[5] + s2[4] + s2[5] + 2) >> 2;
|
||||
d[3] = (s1[6] + s1[7] + s2[6] + s2[7] + 2) >> 2;
|
||||
s1 += 8;
|
||||
s2 += 8;
|
||||
d += 4;
|
||||
}
|
||||
for (; w > 0; w--) {
|
||||
d[0] = (s1[0] + s1[1] + s2[0] + s2[1] + 2) >> 2;
|
||||
s1 += 2;
|
||||
s2 += 2;
|
||||
d++;
|
||||
}
|
||||
src += 2 * src_wrap;
|
||||
dst += dst_wrap;
|
||||
}
|
||||
}
|
||||
|
||||
/* 4x4 -> 1x1 */
|
||||
static void shrink44(uint8_t *dst, int dst_wrap,
|
||||
const uint8_t *src, int src_wrap,
|
||||
int width, int height)
|
||||
{
|
||||
int w;
|
||||
const uint8_t *s1, *s2, *s3, *s4;
|
||||
uint8_t *d;
|
||||
|
||||
for (; height > 0; height--) {
|
||||
s1 = src;
|
||||
s2 = s1 + src_wrap;
|
||||
s3 = s2 + src_wrap;
|
||||
s4 = s3 + src_wrap;
|
||||
d = dst;
|
||||
for (w = width; w > 0; w--) {
|
||||
d[0] = (s1[0] + s1[1] + s1[2] + s1[3] +
|
||||
s2[0] + s2[1] + s2[2] + s2[3] +
|
||||
s3[0] + s3[1] + s3[2] + s3[3] +
|
||||
s4[0] + s4[1] + s4[2] + s4[3] + 8) >> 4;
|
||||
s1 += 4;
|
||||
s2 += 4;
|
||||
s3 += 4;
|
||||
s4 += 4;
|
||||
d++;
|
||||
}
|
||||
src += 4 * src_wrap;
|
||||
dst += dst_wrap;
|
||||
}
|
||||
}
|
||||
|
||||
/* 8x8 -> 1x1 */
|
||||
static void shrink88(uint8_t *dst, int dst_wrap,
|
||||
const uint8_t *src, int src_wrap,
|
||||
int width, int height)
|
||||
{
|
||||
int w, i;
|
||||
|
||||
for (; height > 0; height--) {
|
||||
for(w = width;w > 0; w--) {
|
||||
int tmp = 0;
|
||||
for (i = 0; i < 8; i++) {
|
||||
tmp += src[0] + src[1] + src[2] + src[3] +
|
||||
src[4] + src[5] + src[6] + src[7];
|
||||
src += src_wrap;
|
||||
}
|
||||
*(dst++) = (tmp + 32) >> 6;
|
||||
src += 8 - 8 * src_wrap;
|
||||
}
|
||||
src += 8 * src_wrap - 8 * width;
|
||||
dst += dst_wrap - width;
|
||||
}
|
||||
}
|
||||
|
||||
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c,
|
||||
AVCodecContext *avctx)
|
||||
{
|
||||
@ -160,9 +246,9 @@ av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c,
|
||||
c->add_8x8basis = add_8x8basis_c;
|
||||
|
||||
c->shrink[0] = av_image_copy_plane;
|
||||
c->shrink[1] = ff_shrink22;
|
||||
c->shrink[2] = ff_shrink44;
|
||||
c->shrink[3] = ff_shrink88;
|
||||
c->shrink[1] = shrink22;
|
||||
c->shrink[2] = shrink44;
|
||||
c->shrink[3] = shrink88;
|
||||
|
||||
c->pix_sum = pix_sum_c;
|
||||
c->pix_norm1 = pix_norm1_c;
|
||||
|
Loading…
Reference in New Issue
Block a user