annotate v210enc.c @ 12197:fbf4d5b1b664 libavcodec

Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag, FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that have been checked specifically on such CPUs and are actually faster than their MMX counterparts. In addition, use this flag to enable particular VP8 and LPC SSE2 functions that are faster than their MMX counterparts. Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author rbultje
date Mon, 19 Jul 2010 22:38:23 +0000
parents 8a4984c5cacc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9628
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
1 /*
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
2 * V210 encoder
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
3 *
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
4 * Copyright (C) 2009 Michael Niedermayer <michaelni@gmx.at>
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
5 * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
6 *
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
7 * This file is part of FFmpeg.
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
8 *
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
9 * FFmpeg is free software; you can redistribute it and/or
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
10 * modify it under the terms of the GNU Lesser General Public
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
11 * License as published by the Free Software Foundation; either
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
12 * version 2.1 of the License, or (at your option) any later version.
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
13 *
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
14 * FFmpeg is distributed in the hope that it will be useful,
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
17 * Lesser General Public License for more details.
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
18 *
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
19 * You should have received a copy of the GNU Lesser General Public
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
20 * License along with FFmpeg; if not, write to the Free Software
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
22 */
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
23
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
24 #include "avcodec.h"
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
25 #include "libavcodec/bytestream.h"
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
26
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
27 static av_cold int encode_init(AVCodecContext *avctx)
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
28 {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
29 if (avctx->width & 1) {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
30 av_log(avctx, AV_LOG_ERROR, "v210 needs even width\n");
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
31 return -1;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
32 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
33
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
34 if (avctx->pix_fmt != PIX_FMT_YUV422P16) {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
35 av_log(avctx, AV_LOG_ERROR, "v210 needs YUV422P16\n");
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
36 return -1;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
37 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
38
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
39 if (avctx->bits_per_raw_sample != 10)
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
40 av_log(avctx, AV_LOG_WARNING, "bits per raw sample: %d != 10-bit\n",
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
41 avctx->bits_per_raw_sample);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
42
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
43 avctx->coded_frame = avcodec_alloc_frame();
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
44
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
45 avctx->coded_frame->key_frame = 1;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
46 avctx->coded_frame->pict_type = FF_I_TYPE;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
47
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
48 return 0;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
49 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
50
10131
4f974b8d8851 prettyprinting cosmetics
diego
parents: 9889
diff changeset
51 static int encode_frame(AVCodecContext *avctx, unsigned char *buf,
4f974b8d8851 prettyprinting cosmetics
diego
parents: 9889
diff changeset
52 int buf_size, void *data)
9628
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
53 {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
54 const AVFrame *pic = data;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
55 int aligned_width = ((avctx->width + 47) / 48) * 48;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
56 int stride = aligned_width * 8 / 3;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
57 int h, w;
9631
4f1f36cca468 add casts to silence gcc warnings
bcoudurier
parents: 9628
diff changeset
58 const uint16_t *y = (const uint16_t*)pic->data[0];
4f1f36cca468 add casts to silence gcc warnings
bcoudurier
parents: 9628
diff changeset
59 const uint16_t *u = (const uint16_t*)pic->data[1];
4f1f36cca468 add casts to silence gcc warnings
bcoudurier
parents: 9628
diff changeset
60 const uint16_t *v = (const uint16_t*)pic->data[2];
9628
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
61 uint8_t *p = buf;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
62 uint8_t *pdst = buf;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
63
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
64 if (buf_size < aligned_width * avctx->height * 8 / 3) {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
65 av_log(avctx, AV_LOG_ERROR, "output buffer too small\n");
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
66 return -1;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
67 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
68
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
69 #define WRITE_PIXELS(a, b, c) \
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
70 do { \
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
71 val = (*a++ >> 6) | \
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
72 ((*b++ & 0xFFC0) << 4); \
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
73 val|= (*c++ & 0xFFC0) << 14; \
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
74 bytestream_put_le32(&p, val); \
10169
a48c43551737 Remove ; after while(0) in macros.
ramiro
parents: 10146
diff changeset
75 } while (0)
9628
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
76
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
77 for (h = 0; h < avctx->height; h++) {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
78 uint32_t val;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
79 for (w = 0; w < avctx->width - 5; w += 6) {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
80 WRITE_PIXELS(u, y, v);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
81 WRITE_PIXELS(y, u, y);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
82 WRITE_PIXELS(v, y, u);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
83 WRITE_PIXELS(y, v, y);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
84 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
85 if (w < avctx->width - 1) {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
86 WRITE_PIXELS(u, y, v);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
87
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
88 val = *y++ >> 6;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
89 if (w == avctx->width - 2)
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
90 bytestream_put_le32(&p, val);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
91 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
92 if (w < avctx->width - 3) {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
93 val |=((*u++ & 0xFFC0) << 4) |
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
94 ((*y++ & 0xFFC0) << 14);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
95 bytestream_put_le32(&p, val);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
96
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
97 val = (*v++ >> 6) |
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
98 (*y++ & 0xFFC0) << 4;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
99 bytestream_put_le32(&p, val);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
100 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
101
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
102 pdst += stride;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
103 memset(p, 0, pdst - p);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
104 p = pdst;
10131
4f974b8d8851 prettyprinting cosmetics
diego
parents: 9889
diff changeset
105 y += pic->linesize[0] / 2 - avctx->width;
4f974b8d8851 prettyprinting cosmetics
diego
parents: 9889
diff changeset
106 u += pic->linesize[1] / 2 - avctx->width / 2;
4f974b8d8851 prettyprinting cosmetics
diego
parents: 9889
diff changeset
107 v += pic->linesize[2] / 2 - avctx->width / 2;
9628
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
108 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
109
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
110 return p - buf;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
111 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
112
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
113 static av_cold int encode_close(AVCodecContext *avctx)
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
114 {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
115 av_freep(&avctx->coded_frame);
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
116
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
117 return 0;
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
118 }
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
119
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
120 AVCodec v210_encoder = {
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
121 "v210",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10169
diff changeset
122 AVMEDIA_TYPE_VIDEO,
9628
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
123 CODEC_ID_V210,
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
124 0,
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
125 encode_init,
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
126 encode_frame,
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
127 encode_close,
10146
38cfe222e1a4 Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents: 10131
diff changeset
128 .pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV422P16, PIX_FMT_NONE},
9628
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
129 .long_name = NULL_IF_CONFIG_SMALL("Uncompressed 4:2:2 10-bit"),
4b6766057548 V210 Uncompressed 4:2:2 10-bit encoder and decoder
bcoudurier
parents:
diff changeset
130 };