FFmpeg
v210enc.c
Go to the documentation of this file.
1 /*
2  * V210 encoder
3  *
4  * Copyright (C) 2009 Michael Niedermayer <michaelni@gmx.at>
5  * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include "avcodec.h"
25 #include "bytestream.h"
26 #include "internal.h"
27 #include "v210enc.h"
28 
29 #define TYPE uint8_t
30 #define DEPTH 8
31 #define BYTES_PER_PIXEL 1
32 #define RENAME(a) a ## _ ## 8
33 #include "v210_template.c"
34 #undef RENAME
35 #undef DEPTH
36 #undef BYTES_PER_PIXEL
37 #undef TYPE
38 
39 #define TYPE uint16_t
40 #define DEPTH 10
41 #define BYTES_PER_PIXEL 2
42 #define RENAME(a) a ## _ ## 10
43 #include "v210_template.c"
44 #undef RENAME
45 #undef DEPTH
46 #undef BYTES_PER_PIXEL
47 #undef TYPE
48 
49 static void v210_planar_pack_8_c(const uint8_t *y, const uint8_t *u,
50  const uint8_t *v, uint8_t *dst,
51  ptrdiff_t width)
52 {
53  uint32_t val;
54  int i;
55 
56  /* unroll this to match the assembly */
57  for (i = 0; i < width - 11; i += 12) {
58  WRITE_PIXELS(u, y, v, 8);
59  WRITE_PIXELS(y, u, y, 8);
60  WRITE_PIXELS(v, y, u, 8);
61  WRITE_PIXELS(y, v, y, 8);
62  WRITE_PIXELS(u, y, v, 8);
63  WRITE_PIXELS(y, u, y, 8);
64  WRITE_PIXELS(v, y, u, 8);
65  WRITE_PIXELS(y, v, y, 8);
66  }
67 }
68 
69 static void v210_planar_pack_10_c(const uint16_t *y, const uint16_t *u,
70  const uint16_t *v, uint8_t *dst,
71  ptrdiff_t width)
72 {
73  uint32_t val;
74  int i;
75 
76  for (i = 0; i < width - 5; i += 6) {
77  WRITE_PIXELS(u, y, v, 10);
78  WRITE_PIXELS(y, u, y, 10);
79  WRITE_PIXELS(v, y, u, 10);
80  WRITE_PIXELS(y, v, y, 10);
81  }
82 }
83 
85 {
88  s->sample_factor_8 = 2;
89  s->sample_factor_10 = 1;
90 
91  if (ARCH_X86)
93 }
94 
96 {
97  V210EncContext *s = avctx->priv_data;
98 
99  if (avctx->width & 1) {
100  av_log(avctx, AV_LOG_ERROR, "v210 needs even width\n");
101  return AVERROR(EINVAL);
102  }
103 
104 #if FF_API_CODED_FRAME
108 #endif
109 
110  ff_v210enc_init(s);
111 
112  avctx->bits_per_coded_sample = 20;
113  avctx->bit_rate = ff_guess_coded_bitrate(avctx) * 16 / 15;
114 
115  return 0;
116 }
117 
119  const AVFrame *pic, int *got_packet)
120 {
121  int aligned_width = ((avctx->width + 47) / 48) * 48;
122  int stride = aligned_width * 8 / 3;
123  AVFrameSideData *side_data;
124  int ret;
125  uint8_t *dst;
126 
127  ret = ff_alloc_packet2(avctx, pkt, avctx->height * stride, avctx->height * stride);
128  if (ret < 0) {
129  av_log(avctx, AV_LOG_ERROR, "Error getting output packet.\n");
130  return ret;
131  }
132  dst = pkt->data;
133 
134  if (pic->format == AV_PIX_FMT_YUV422P10)
135  v210_enc_10(avctx, dst, pic);
136  else if(pic->format == AV_PIX_FMT_YUV422P)
137  v210_enc_8(avctx, dst, pic);
138 
140  if (side_data && side_data->size) {
142  if (!buf)
143  return AVERROR(ENOMEM);
144  memcpy(buf, side_data->data, side_data->size);
145  }
146 
147  side_data = av_frame_get_side_data(pic, AV_FRAME_DATA_AFD);
148  if (side_data && side_data->size) {
150  if (!buf)
151  return AVERROR(ENOMEM);
152  memcpy(buf, side_data->data, side_data->size);
153  }
154 
155  pkt->flags |= AV_PKT_FLAG_KEY;
156  *got_packet = 1;
157  return 0;
158 }
159 
161  .name = "v210",
162  .long_name = NULL_IF_CONFIG_SMALL("Uncompressed 4:2:2 10-bit"),
163  .type = AVMEDIA_TYPE_VIDEO,
164  .id = AV_CODEC_ID_V210,
165  .priv_data_size = sizeof(V210EncContext),
166  .init = encode_init,
167  .encode2 = encode_frame,
169 };
const char const char void * val
Definition: avisynth_c.h:863
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
static void v210_planar_pack_8_c(const uint8_t *y, const uint8_t *u, const uint8_t *v, uint8_t *dst, ptrdiff_t width)
Definition: v210enc.c:49
int64_t bit_rate
the average bitrate
Definition: avcodec.h:1621
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
int sample_factor_8
Definition: v210enc.h:31
ATSC A53 Part 4 Closed Captions.
Definition: avcodec.h:1392
static AVPacket pkt
AVCodec.
Definition: avcodec.h:3495
void(* pack_line_10)(const uint16_t *y, const uint16_t *u, const uint16_t *v, uint8_t *dst, ptrdiff_t width)
Definition: v210enc.h:29
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:734
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
Definition: encode.c:32
void(* pack_line_8)(const uint8_t *y, const uint8_t *u, const uint8_t *v, uint8_t *dst, ptrdiff_t width)
Definition: v210enc.h:27
uint8_t
#define av_cold
Definition: attributes.h:82
#define u(width, name, range_min, range_max)
Definition: cbs_h2645.c:252
Structure to hold side data for an AVFrame.
Definition: frame.h:201
uint8_t * data
Definition: avcodec.h:1483
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
Definition: avcodec.h:2795
Active Format Description data consisting of a single byte as specified in ETSI TS 101 154 using AVAc...
Definition: frame.h:89
#define av_log(a,...)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1515
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
ATSC A53 Part 4 Closed Captions.
Definition: frame.h:58
const char * name
Name of the codec implementation.
Definition: avcodec.h:3502
av_cold void ff_v210enc_init(V210EncContext *s)
Definition: v210enc.c:84
int flags
A combination of AV_PKT_FLAG values.
Definition: avcodec.h:1489
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
int64_t ff_guess_coded_bitrate(AVCodecContext *avctx)
Get an estimated video bitrate based on frame size, frame rate and coded bits per pixel...
Definition: utils.c:2215
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:378
#define width
int width
picture width / height.
Definition: avcodec.h:1744
int sample_factor_10
Definition: v210enc.h:32
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic, int *got_packet)
Definition: v210enc.c:118
Active Format Description data consisting of a single byte as specified in ETSI TS 101 154 using AVAc...
Definition: avcodec.h:1411
#define s(width, name)
Definition: cbs_vp9.c:257
static av_cold int encode_init(AVCodecContext *avctx)
Definition: v210enc.c:95
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Definition: frame.h:368
Libavcodec external API header.
main external API structure.
Definition: avcodec.h:1571
uint8_t * data
Definition: frame.h:203
void ff_v210enc_init_x86(V210EncContext *s)
Definition: v210enc_init.c:36
void * buf
Definition: avisynth_c.h:766
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:275
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:388
#define WRITE_PIXELS(a, b, c, depth)
Definition: v210_template.c:26
GLint GLenum GLboolean GLsizei stride
Definition: opengl_enc.c:104
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:84
common internal api header.
static void v210_planar_pack_10_c(const uint16_t *y, const uint16_t *u, const uint16_t *v, uint8_t *dst, ptrdiff_t width)
Definition: v210enc.c:69
attribute_deprecated AVFrame * coded_frame
the picture in the bitstream
Definition: avcodec.h:2821
void * priv_data
Definition: avcodec.h:1598
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:85
AVCodec ff_v210_encoder
Definition: v210enc.c:160
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
Definition: avpacket.c:329
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
This structure stores compressed data.
Definition: avcodec.h:1460