1 /*
2 * Unpack bit-packed streams to formats supported by FFmpeg
3 * Copyright (c) 2017 Savoir-faire Linux, Inc
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /* Development sponsored by CBC/Radio-Canada */
23
24 /**
25 * @file
26 * Bitpacked
27 */
28
33
37 };
38
39 /* For this format, it's a simple passthrough */
42 {
43 int ret;
44
45 /* there is no need to copy as the data already match
46 * a known pixel format */
50 if (ret < 0) {
52 return ret;
53 }
54
55 return 0;
56 }
57
60 {
62 uint64_t packet_size = (uint64_t)avpkt->
size * 8;
65 int ret, i, j;
66
68 if (ret < 0)
69 return ret;
70
71 if (frame_size > packet_size)
73
76
78 if (ret)
79 return ret;
80
81 for (i = 0; i < avctx->
height; i++) {
82 y = (uint16_t*)(frame->
data[0] + i * frame->
linesize[0]);
84 v = (uint16_t*)(frame->
data[2] + i * frame->
linesize[2]);
85
86 for (j = 0; j < avctx->
width; j += 2) {
91 }
92 }
93
94 return 0;
95 }
96
98 {
100
103
111 else
113 } else {
115 }
116
117 return 0;
118 }
119
122 {
124 int buf_size = avpkt->
size;
126 int res;
127
130
131 res = bc->
decode(avctx, frame, avpkt);
132 if (res)
133 return res;
134
135 *got_frame = 1;
136 return buf_size;
137
138 }
139
149 };
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], const uint8_t *src, enum AVPixelFormat pix_fmt, int width, int height, int align)
Setup the data pointers and linesizes based on the specified image parameters and the provided array...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
#define u(width, name, range_min, range_max)
static av_cold int bitpacked_init_decoder(AVCodecContext *avctx)
bitstream reader API header.
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
static int bitpacked_decode_uyvy422(AVCodecContext *avctx, AVFrame *frame, AVPacket *avpkt)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
const char * name
Name of the codec implementation.
enum AVPictureType pict_type
Picture type of the frame.
int(* decode)(AVCodecContext *avctx, AVFrame *frame, AVPacket *pkt)
int width
picture width / height.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
main external API structure.
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static int bitpacked_decode_yuv422p10(AVCodecContext *avctx, AVFrame *frame, AVPacket *avpkt)
#define AV_PIX_FMT_YUV422P10
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
common internal api header.
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
static int bitpacked_decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
int key_frame
1 -> keyframe, 0-> not
#define MKTAG(a, b, c, d)
This structure stores compressed data.
AVCodec ff_bitpacked_decoder