FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
cljrdec.c
Go to the documentation of this file.
1
/*
2
* Cirrus Logic AccuPak (CLJR) decoder
3
* Copyright (c) 2003 Alex Beregszaszi
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
/**
23
* @file
24
* Cirrus Logic AccuPak decoder.
25
*/
26
27
#include "
avcodec.h
"
28
#include "
get_bits.h
"
29
#include "
internal.h
"
30
31
static
int
decode_frame
(
AVCodecContext
*avctx,
32
void
*
data
,
int
*got_frame,
33
AVPacket
*avpkt)
34
{
35
const
uint8_t
*
buf
= avpkt->
data
;
36
int
buf_size = avpkt->
size
;
37
GetBitContext
gb;
38
AVFrame
*
const
p =
data
;
39
int
x,
y
,
ret
;
40
41
if
(avctx->
height
<= 0 || avctx->
width
<= 0) {
42
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid width or height\n"
);
43
return
AVERROR_INVALIDDATA
;
44
}
45
46
if
(buf_size / avctx->
height
< avctx->
width
) {
47
av_log
(avctx,
AV_LOG_ERROR
,
48
"Resolution larger than buffer size. Invalid header?\n"
);
49
return
AVERROR_INVALIDDATA
;
50
}
51
52
if
((ret =
ff_get_buffer
(avctx, p, 0)) < 0)
53
return
ret
;
54
p->
pict_type
=
AV_PICTURE_TYPE_I
;
55
p->
key_frame
= 1;
56
57
init_get_bits
(&gb, buf, buf_size * 8);
58
59
for
(y = 0; y < avctx->
height
; y++) {
60
uint8_t
*luma = &p->
data
[0][y * p->
linesize
[0]];
61
uint8_t
*
cb
= &p->
data
[1][y * p->
linesize
[1]];
62
uint8_t
*
cr
= &p->
data
[2][y * p->
linesize
[2]];
63
for
(x = 0; x < avctx->
width
; x += 4) {
64
luma[3] = (
get_bits
(&gb, 5)*33) >> 2;
65
luma[2] = (
get_bits
(&gb, 5)*33) >> 2;
66
luma[1] = (
get_bits
(&gb, 5)*33) >> 2;
67
luma[0] = (
get_bits
(&gb, 5)*33) >> 2;
68
luma += 4;
69
*(cb++) =
get_bits
(&gb, 6) << 2;
70
*(cr++) =
get_bits
(&gb, 6) << 2;
71
}
72
}
73
74
*got_frame = 1;
75
76
return
buf_size;
77
}
78
79
static
av_cold
int
decode_init
(
AVCodecContext
*avctx)
80
{
81
avctx->
pix_fmt
=
AV_PIX_FMT_YUV411P
;
82
return
0;
83
}
84
85
AVCodec
ff_cljr_decoder
= {
86
.
name
=
"cljr"
,
87
.long_name =
NULL_IF_CONFIG_SMALL
(
"Cirrus Logic AccuPak"
),
88
.type =
AVMEDIA_TYPE_VIDEO
,
89
.id =
AV_CODEC_ID_CLJR
,
90
.init =
decode_init
,
91
.decode =
decode_frame
,
92
.capabilities =
CODEC_CAP_DR1
,
93
};
94
Generated on Sun Jul 20 2014 23:05:45 for FFmpeg by
1.8.2