Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
b7ce3242
Commit
b7ce3242
authored
Apr 06, 2012
by
Jimmy Christensen
Committed by
Michael Niedermayer
Apr 06, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc: add a OpenEXR decoder
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
9e91a7d4
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
495 additions
and
2 deletions
+495
-2
Changelog
Changelog
+1
-1
general.texi
doc/general.texi
+2
-0
Makefile
libavcodec/Makefile
+1
-0
allcodecs.c
libavcodec/allcodecs.c
+1
-0
avcodec.h
libavcodec/avcodec.h
+1
-0
exr.c
libavcodec/exr.c
+485
-0
version.h
libavcodec/version.h
+1
-1
img2.c
libavformat/img2.c
+1
-0
isom.c
libavformat/isom.c
+1
-0
riff.c
libavformat/riff.c
+1
-0
No files found.
Changelog
View file @
b7ce3242
...
@@ -20,7 +20,7 @@ version next:
...
@@ -20,7 +20,7 @@ version next:
- ZeroCodec decoder
- ZeroCodec decoder
- tile video filter
- tile video filter
- Metal Gear Solid: The Twin Snakes demuxer
- Metal Gear Solid: The Twin Snakes demuxer
- OpenEXR image decoder
version 0.10:
version 0.10:
- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936,
- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936,
...
...
doc/general.texi
View file @
b7ce3242
...
@@ -372,6 +372,8 @@ following image formats are supported:
...
@@ -372,6 +372,8 @@ following image formats are supported:
@tab Microsoft BMP image
@tab Microsoft BMP image
@item DPX @tab X @tab X
@item DPX @tab X @tab X
@tab Digital Picture Exchange
@tab Digital Picture Exchange
@item EXR @tab @tab X
@tab OpenEXR
@item JPEG @tab X @tab X
@item JPEG @tab X @tab X
@tab Progressive JPEG is not supported.
@tab Progressive JPEG is not supported.
@item JPEG 2000 @tab X @tab X
@item JPEG 2000 @tab X @tab X
...
...
libavcodec/Makefile
View file @
b7ce3242
...
@@ -160,6 +160,7 @@ OBJS-$(CONFIG_EIGHTSVX_FIB_DECODER) += 8svx.o
...
@@ -160,6 +160,7 @@ OBJS-$(CONFIG_EIGHTSVX_FIB_DECODER) += 8svx.o
OBJS-$(CONFIG_EIGHTSVX_RAW_DECODER)
+=
8svx.o
OBJS-$(CONFIG_EIGHTSVX_RAW_DECODER)
+=
8svx.o
OBJS-$(CONFIG_ESCAPE124_DECODER)
+=
escape124.o
OBJS-$(CONFIG_ESCAPE124_DECODER)
+=
escape124.o
OBJS-$(CONFIG_ESCAPE130_DECODER)
+=
escape130.o
OBJS-$(CONFIG_ESCAPE130_DECODER)
+=
escape130.o
OBJS-$(CONFIG_EXR_DECODER)
+=
exr.o
OBJS-$(CONFIG_FFV1_DECODER)
+=
ffv1.o
rangecoder.o
OBJS-$(CONFIG_FFV1_DECODER)
+=
ffv1.o
rangecoder.o
OBJS-$(CONFIG_FFV1_ENCODER)
+=
ffv1.o
rangecoder.o
OBJS-$(CONFIG_FFV1_ENCODER)
+=
ffv1.o
rangecoder.o
OBJS-$(CONFIG_FFVHUFF_DECODER)
+=
huffyuv.o
OBJS-$(CONFIG_FFVHUFF_DECODER)
+=
huffyuv.o
...
...
libavcodec/allcodecs.c
View file @
b7ce3242
...
@@ -113,6 +113,7 @@ void avcodec_register_all(void)
...
@@ -113,6 +113,7 @@ void avcodec_register_all(void)
REGISTER_DECODER
(
EIGHTSVX_FIB
,
eightsvx_fib
);
REGISTER_DECODER
(
EIGHTSVX_FIB
,
eightsvx_fib
);
REGISTER_DECODER
(
ESCAPE124
,
escape124
);
REGISTER_DECODER
(
ESCAPE124
,
escape124
);
REGISTER_DECODER
(
ESCAPE130
,
escape130
);
REGISTER_DECODER
(
ESCAPE130
,
escape130
);
REGISTER_DECODER
(
EXR
,
exr
);
REGISTER_ENCDEC
(
FFV1
,
ffv1
);
REGISTER_ENCDEC
(
FFV1
,
ffv1
);
REGISTER_ENCDEC
(
FFVHUFF
,
ffvhuff
);
REGISTER_ENCDEC
(
FFVHUFF
,
ffvhuff
);
REGISTER_ENCDEC
(
FLASHSV
,
flashsv
);
REGISTER_ENCDEC
(
FLASHSV
,
flashsv
);
...
...
libavcodec/avcodec.h
View file @
b7ce3242
...
@@ -251,6 +251,7 @@ enum CodecID {
...
@@ -251,6 +251,7 @@ enum CodecID {
CODEC_ID_ZEROCODEC
,
CODEC_ID_ZEROCODEC
,
CODEC_ID_Y41P
=
MKBETAG
(
'Y'
,
'4'
,
'1'
,
'P'
),
CODEC_ID_Y41P
=
MKBETAG
(
'Y'
,
'4'
,
'1'
,
'P'
),
CODEC_ID_ESCAPE130
=
MKBETAG
(
'E'
,
'1'
,
'3'
,
'0'
),
CODEC_ID_ESCAPE130
=
MKBETAG
(
'E'
,
'1'
,
'3'
,
'0'
),
CODEC_ID_EXR
=
MKBETAG
(
'0'
,
'E'
,
'X'
,
'R'
),
CODEC_ID_AVRP
=
MKBETAG
(
'A'
,
'V'
,
'R'
,
'P'
),
CODEC_ID_AVRP
=
MKBETAG
(
'A'
,
'V'
,
'R'
,
'P'
),
CODEC_ID_G2M
=
MKBETAG
(
0
,
'G'
,
'2'
,
'M'
),
CODEC_ID_G2M
=
MKBETAG
(
0
,
'G'
,
'2'
,
'M'
),
...
...
libavcodec/exr.c
0 → 100644
View file @
b7ce3242
/*
* OpenEXR (.exr) image decoder
* Copyright (c) 2009 Jimmy Christensen
*
* This file is part of FFmpeg.
*
* FFmpeg 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.
*
* FFmpeg 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file libavcodec/exr.c
* OpenEXR decoder
* @author Jimmy Christensen
*
* For more information on the OpenEXR format, visit:
* http://openexr.com/
*
* exr_flt2uint() and exr_halflt2uint() is credited to Reimar Döffinger
*/
#include "avcodec.h"
#include "bytestream.h"
#include "libavutil/imgutils.h"
enum
ExrCompr
{
EXR_RAW
=
0
,
EXR_RLE
=
1
,
EXR_ZIP1
=
2
,
EXR_ZIP16
=
3
,
EXR_PIZ
=
4
,
EXR_B44
=
6
};
typedef
struct
EXRContext
{
AVFrame
picture
;
int
compr
;
int
bits_per_color_id
;
int8_t
channel_offsets
[
3
];
// 0 = red, 1 = green and 2 = blue
}
EXRContext
;
/**
* Converts from 32-bit float as uint32_t to uint16_t
*
* @param v 32-bit float
* @return normalized 16-bit unsigned int
*/
static
inline
uint16_t
exr_flt2uint
(
uint32_t
v
)
{
unsigned
int
exp
=
v
>>
23
;
// "HACK": negative values result in exp< 0, so clipping them to 0
// is also handled by this condition, avoids explicit check for sign bit.
if
(
exp
<=
127
+
7
-
24
)
// we would shift out all bits anyway
return
0
;
if
(
exp
>=
127
)
return
0xffff
;
v
&=
0x007fffff
;
return
(
v
+
(
1
<<
23
))
>>
(
127
+
7
-
exp
);
}
/**
* Converts from 16-bit float as uint16_t to uint16_t
*
* @param v 16-bit float
* @return normalized 16-bit unsigned int
*/
static
inline
uint16_t
exr_halflt2uint
(
uint16_t
v
)
{
int
exp
=
v
>>
10
;
if
(
v
&
0x8000
)
return
0
;
if
(
!
exp
)
return
(
v
>>
9
)
&
1
;
if
(
exp
>=
15
)
return
0xffff
;
v
<<=
6
;
return
(
v
+
(
1
<<
16
))
>>
(
15
-
exp
);
}
/**
* Gets the size of the header variable
*
* @param **buf the current pointer location in the header where
* the variable data starts
* @param *buf_end pointer location of the end of the buffer
* @return size of variable data
*/
static
unsigned
int
get_header_variable_length
(
const
uint8_t
**
buf
,
const
uint8_t
*
buf_end
)
{
unsigned
int
variable_buffer_data_size
=
bytestream_get_le32
(
buf
);
if
(
variable_buffer_data_size
>=
buf_end
-
*
buf
)
return
0
;
return
variable_buffer_data_size
;
}
/**
* Checks if the variable name corresponds with it's data type
*
* @param *avctx the AVCodecContext
* @param **buf the current pointer location in the header where
* the variable name starts
* @param *buf_end pointer location of the end of the buffer
* @param *value_name name of the varible to check
* @param *value_type type of the varible to check
* @param minimum_length minimum length of the variable data
* @param variable_buffer_data_size variable length read from the header
* after it's checked
* @return zero if variable is invalid and 1 if good
*/
static
unsigned
int
check_header_variable
(
AVCodecContext
*
avctx
,
const
uint8_t
**
buf
,
const
uint8_t
*
buf_end
,
const
char
*
value_name
,
const
char
*
value_type
,
unsigned
int
minimum_length
,
unsigned
int
*
variable_buffer_data_size
)
{
if
(
buf_end
-
*
buf
>=
minimum_length
&&
!
strcmp
(
*
buf
,
value_name
))
{
*
buf
+=
strlen
(
value_name
)
+
1
;
if
(
!
strcmp
(
*
buf
,
value_type
))
{
*
buf
+=
strlen
(
value_type
)
+
1
;
*
variable_buffer_data_size
=
get_header_variable_length
(
buf
,
buf_end
);
if
(
!*
variable_buffer_data_size
)
av_log
(
avctx
,
AVERROR_INVALIDDATA
,
"Incomplete header
\n
"
);
return
1
;
}
*
buf
-=
strlen
(
value_name
)
+
1
;
av_log
(
avctx
,
AV_LOG_WARNING
,
"Unknown data type for header variable %s
\n
"
,
value_name
);
}
return
0
;
}
static
int
decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
data_size
,
AVPacket
*
avpkt
)
{
const
uint8_t
*
buf
=
avpkt
->
data
;
unsigned
int
buf_size
=
avpkt
->
size
;
const
uint8_t
*
buf_end
=
buf
+
buf_size
;
EXRContext
*
const
s
=
avctx
->
priv_data
;
AVFrame
*
picture
=
data
;
AVFrame
*
const
p
=
&
s
->
picture
;
uint8_t
*
ptr
;
int
x
,
y
,
stride
,
magic_number
,
version_flag
;
int
w
=
0
;
int
h
=
0
;
unsigned
int
xmin
=
~
0
;
unsigned
int
xmax
=
~
0
;
unsigned
int
ymin
=
~
0
;
unsigned
int
ymax
=
~
0
;
unsigned
int
xdelta
=
~
0
;
unsigned
int
current_channel_offset
=
0
;
s
->
channel_offsets
[
0
]
=
-
1
;
s
->
channel_offsets
[
1
]
=
-
1
;
s
->
channel_offsets
[
2
]
=
-
1
;
s
->
bits_per_color_id
=
-
1
;
magic_number
=
bytestream_get_le32
(
&
buf
);
if
(
magic_number
!=
20000630
)
{
// As per documentation of OpenEXR it's supposed to be int 20000630 little-endian
av_log
(
avctx
,
AVERROR_INVALIDDATA
,
"Wrong magic number %d
\n
"
,
magic_number
);
return
-
1
;
}
version_flag
=
bytestream_get_le32
(
&
buf
);
if
((
version_flag
&
0x200
)
==
0x200
)
{
av_log
(
avctx
,
AVERROR_NOFMT
,
"Tile based images are not supported
\n
"
);
return
-
1
;
}
if
(
buf_end
-
buf
<
10
)
{
av_log
(
avctx
,
AVERROR_INVALIDDATA
,
"Too short header to parse
\n
"
);
return
-
1
;
}
// Parse the header
while
(
buf
[
0
]
!=
0x0
)
{
unsigned
int
variable_buffer_data_size
;
// Process the channel list
if
(
check_header_variable
(
avctx
,
&
buf
,
buf_end
,
"channels"
,
"chlist"
,
38
,
&
variable_buffer_data_size
))
{
const
uint8_t
*
channel_list_end
;
if
(
!
variable_buffer_data_size
)
return
-
1
;
channel_list_end
=
buf
+
variable_buffer_data_size
+
4
;
while
(
channel_list_end
-
buf
>=
19
)
{
int
current_bits_per_color_id
=
-
1
;
int
channel_index
=
-
1
;
if
(
!
strcmp
(
buf
,
"R"
))
channel_index
=
0
;
if
(
!
strcmp
(
buf
,
"G"
))
channel_index
=
1
;
if
(
!
strcmp
(
buf
,
"B"
))
channel_index
=
2
;
while
(
bytestream_get_byte
(
&
buf
)
&&
buf
<
channel_list_end
)
continue
;
/* skip */
if
(
channel_list_end
-
*
&
buf
<
4
)
{
av_log
(
avctx
,
AVERROR_INVALIDDATA
,
"Incomplete header
\n
"
);
return
-
1
;
}
current_bits_per_color_id
=
bytestream_get_le32
(
&
buf
);
if
(
current_bits_per_color_id
>
2
)
{
av_log
(
avctx
,
AVERROR_NOFMT
,
"Unknown color format
\n
"
);
return
-
1
;
}
if
(
channel_index
>=
0
)
{
if
(
s
->
bits_per_color_id
!=
-
1
&&
s
->
bits_per_color_id
!=
current_bits_per_color_id
)
{
av_log
(
avctx
,
AVERROR_NOFMT
,
"RGB channels not of the same depth
\n
"
);
return
-
1
;
}
s
->
bits_per_color_id
=
current_bits_per_color_id
;
s
->
channel_offsets
[
channel_index
]
=
current_channel_offset
;
}
current_channel_offset
+=
1
<<
current_bits_per_color_id
;
buf
+=
12
;
}
/* Check if all channels are set with an offset or if the channels
* are causing an overflow */
if
(
FFMIN3
(
s
->
channel_offsets
[
0
],
s
->
channel_offsets
[
1
],
s
->
channel_offsets
[
2
])
<
0
)
{
if
(
s
->
channel_offsets
[
0
]
<
0
)
av_log
(
avctx
,
AVERROR_NOFMT
,
"Missing red channel
\n
"
);
if
(
s
->
channel_offsets
[
1
]
<
0
)
av_log
(
avctx
,
AVERROR_NOFMT
,
"Missing green channel
\n
"
);
if
(
s
->
channel_offsets
[
2
]
<
0
)
av_log
(
avctx
,
AVERROR_NOFMT
,
"Missing blue channel
\n
"
);
return
-
1
;
}
buf
=
channel_list_end
;
continue
;
}
// Process the dataWindow variable
if
(
check_header_variable
(
avctx
,
&
buf
,
buf_end
,
"dataWindow"
,
"box2i"
,
31
,
&
variable_buffer_data_size
))
{
if
(
!
variable_buffer_data_size
)
return
-
1
;
xmin
=
AV_RL32
(
buf
);
ymin
=
AV_RL32
(
buf
+
4
);
xmax
=
AV_RL32
(
buf
+
8
);
ymax
=
AV_RL32
(
buf
+
12
);
xdelta
=
(
xmax
-
xmin
)
+
1
;
buf
+=
variable_buffer_data_size
;
continue
;
}
// Process the displayWindow variable
if
(
check_header_variable
(
avctx
,
&
buf
,
buf_end
,
"displayWindow"
,
"box2i"
,
34
,
&
variable_buffer_data_size
))
{
if
(
!
variable_buffer_data_size
)
return
-
1
;
w
=
AV_RL32
(
buf
+
8
)
+
1
;
h
=
AV_RL32
(
buf
+
12
)
+
1
;
buf
+=
variable_buffer_data_size
;
continue
;
}
// Process the lineOrder variable
if
(
check_header_variable
(
avctx
,
&
buf
,
buf_end
,
"lineOrder"
,
"lineOrder"
,
25
,
&
variable_buffer_data_size
))
{
if
(
!
variable_buffer_data_size
)
return
-
1
;
if
(
*
buf
)
{
av_log
(
avctx
,
AVERROR_NOFMT
,
"Doesn't support this line order : %d
\n
"
,
*
buf
);
return
-
1
;
}
buf
+=
variable_buffer_data_size
;
continue
;
}
// Process the compression variable
if
(
check_header_variable
(
avctx
,
&
buf
,
buf_end
,
"compression"
,
"compression"
,
29
,
&
variable_buffer_data_size
))
{
if
(
!
variable_buffer_data_size
)
return
-
1
;
switch
(
*
buf
)
{
case
EXR_RAW
:
s
->
compr
=
*
buf
;
break
;
case
EXR_RLE
:
case
EXR_ZIP1
:
case
EXR_ZIP16
:
case
EXR_PIZ
:
case
EXR_B44
:
default:
av_log
(
avctx
,
AVERROR_NOFMT
,
"This type of compression is not supported
\n
"
);
return
-
1
;
}
buf
+=
variable_buffer_data_size
;
continue
;
}
// Check if there is enough bytes for a header
if
(
buf_end
-
buf
<=
9
)
{
av_log
(
avctx
,
AVERROR_INVALIDDATA
,
"Incomplete header
\n
"
);
return
-
1
;
}
// Process unknown variables
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
// Skip variable name/type
while
(
buf
++
<
buf_end
)
if
(
buf
[
0
]
==
0x0
)
break
;
}
buf
++
;
// Skip variable length
if
(
buf_end
-
buf
>=
5
)
{
variable_buffer_data_size
=
get_header_variable_length
(
&
buf
,
buf_end
);
if
(
!
variable_buffer_data_size
)
{
av_log
(
avctx
,
AVERROR_INVALIDDATA
,
"Incomplete header
\n
"
);
return
-
1
;
}
buf
+=
variable_buffer_data_size
;
}
}
if
(
buf
>=
buf_end
)
{
av_log
(
avctx
,
AVERROR_EOF
,
"Incomplete file
\n
"
);
return
-
1
;
}
buf
++
;
switch
(
s
->
bits_per_color_id
)
{
case
2
:
// 32-bit
case
1
:
// 16-bit
avctx
->
pix_fmt
=
PIX_FMT_RGB48
;
break
;
// 8-bit
case
0
:
av_log_missing_feature
(
avctx
,
"8-bit OpenEXR"
,
1
);
return
-
1
;
default:
av_log
(
avctx
,
AVERROR_NOFMT
,
"Unknown color format : %d
\n
"
,
s
->
bits_per_color_id
);
return
-
1
;
}
if
(
s
->
picture
.
data
[
0
])
avctx
->
release_buffer
(
avctx
,
&
s
->
picture
);
if
(
av_image_check_size
(
w
,
h
,
0
,
avctx
))
return
-
1
;
// Verify the xmin, xmax, ymin, ymax and xdelta before setting the actual image size
if
(
xmin
>
w
||
xmin
==
~
0
||
xmax
>
w
||
xmax
==
~
0
||
ymin
>
h
||
ymin
==
~
0
||
ymax
>
h
||
ymax
==
~
0
||
xdelta
==
~
0
)
{
av_log
(
avctx
,
AVERROR_INVALIDDATA
,
"Wrong sizing or missing size information
\n
"
);
return
-
1
;
}
if
(
w
!=
avctx
->
width
||
h
!=
avctx
->
height
)
{
avcodec_set_dimensions
(
avctx
,
w
,
h
);
}
if
(
avctx
->
get_buffer
(
avctx
,
p
)
<
0
)
{
av_log
(
avctx
,
AVERROR_IO
,
"get_buffer() failed
\n
"
);
return
-
1
;
}
ptr
=
p
->
data
[
0
];
stride
=
p
->
linesize
[
0
];
// Zero out the start if ymin is not 0
for
(
y
=
0
;
y
<
ymin
;
y
++
)
{
memset
(
ptr
,
0
,
avctx
->
width
*
6
);
ptr
+=
stride
;
}
// Process the actual lines
for
(
y
=
ymin
;
y
<=
ymax
;
y
++
)
{
uint16_t
*
ptr_x
=
(
uint16_t
*
)
ptr
;
if
(
buf_end
-
buf
>
8
)
{
/* Read the lineoffset from the line offset table and add 8 bytes
to skip the coordinates and data size fields */
const
uint64_t
line_offset
=
bytestream_get_le64
(
&
buf
)
+
8
;
// Check if the buffer has the required bytes needed from the offset
if
(
line_offset
>
avpkt
->
size
-
xdelta
*
current_channel_offset
)
{
// Line offset is probably wrong and not inside the buffer
av_log
(
avctx
,
AV_LOG_WARNING
,
"Line offset for line %d is out of reach setting it to black
\n
"
,
y
);
memset
(
ptr_x
,
0
,
avctx
->
width
*
6
);
}
else
{
const
uint8_t
*
red_channel_buffer
=
avpkt
->
data
+
line_offset
+
xdelta
*
s
->
channel_offsets
[
0
];
const
uint8_t
*
green_channel_buffer
=
avpkt
->
data
+
line_offset
+
xdelta
*
s
->
channel_offsets
[
1
];
const
uint8_t
*
blue_channel_buffer
=
avpkt
->
data
+
line_offset
+
xdelta
*
s
->
channel_offsets
[
2
];
// Zero out the start if xmin is not 0
memset
(
ptr_x
,
0
,
xmin
*
6
);
ptr_x
+=
xmin
*
3
;
if
(
s
->
bits_per_color_id
==
2
)
{
// 32-bit
for
(
x
=
0
;
x
<
xdelta
;
x
++
)
{
*
ptr_x
++
=
exr_flt2uint
(
bytestream_get_le32
(
&
red_channel_buffer
));
*
ptr_x
++
=
exr_flt2uint
(
bytestream_get_le32
(
&
green_channel_buffer
));
*
ptr_x
++
=
exr_flt2uint
(
bytestream_get_le32
(
&
blue_channel_buffer
));
}
}
else
{
// 16-bit
for
(
x
=
0
;
x
<
xdelta
;
x
++
)
{
*
ptr_x
++
=
exr_halflt2uint
(
bytestream_get_le16
(
&
red_channel_buffer
));
*
ptr_x
++
=
exr_halflt2uint
(
bytestream_get_le16
(
&
green_channel_buffer
));
*
ptr_x
++
=
exr_halflt2uint
(
bytestream_get_le16
(
&
blue_channel_buffer
));
}
}
// Zero out the end if xmax+1 is not w
memset
(
ptr_x
,
0
,
(
avctx
->
width
-
(
xmax
+
1
))
*
6
);
ptr_x
+=
(
avctx
->
width
-
(
xmax
+
1
))
*
3
;
}
// Move to next line
ptr
+=
stride
;
}
}
// Zero out the end if ymax+1 is not h
for
(
y
=
ymax
;
y
<
avctx
->
height
;
y
++
)
{
memset
(
ptr
,
0
,
avctx
->
width
*
6
);
ptr
+=
stride
;
}
*
picture
=
s
->
picture
;
*
data_size
=
sizeof
(
AVPicture
);
return
buf_size
;
}
static
av_cold
int
decode_init
(
AVCodecContext
*
avctx
)
{
EXRContext
*
s
=
avctx
->
priv_data
;
avcodec_get_frame_defaults
(
&
s
->
picture
);
avctx
->
coded_frame
=
&
s
->
picture
;
return
0
;
}
static
av_cold
int
decode_end
(
AVCodecContext
*
avctx
)
{
EXRContext
*
s
=
avctx
->
priv_data
;
if
(
s
->
picture
.
data
[
0
])
avctx
->
release_buffer
(
avctx
,
&
s
->
picture
);
return
0
;
}
AVCodec
ff_exr_decoder
=
{
.
name
=
"exr"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
CODEC_ID_EXR
,
.
priv_data_size
=
sizeof
(
EXRContext
),
.
init
=
decode_init
,
.
close
=
decode_end
,
.
decode
=
decode_frame
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"OpenEXR image"
),
};
libavcodec/version.h
View file @
b7ce3242
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#define AVCODEC_VERSION_H
#define AVCODEC_VERSION_H
#define LIBAVCODEC_VERSION_MAJOR 54
#define LIBAVCODEC_VERSION_MAJOR 54
#define LIBAVCODEC_VERSION_MINOR 1
2
#define LIBAVCODEC_VERSION_MINOR 1
3
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
...
...
libavformat/img2.c
View file @
b7ce3242
...
@@ -70,6 +70,7 @@ static const IdStrMap img_tags[] = {
...
@@ -70,6 +70,7 @@ static const IdStrMap img_tags[] = {
{
CODEC_ID_JPEG2000
,
"jp2"
},
{
CODEC_ID_JPEG2000
,
"jp2"
},
{
CODEC_ID_JPEG2000
,
"jpc"
},
{
CODEC_ID_JPEG2000
,
"jpc"
},
{
CODEC_ID_DPX
,
"dpx"
},
{
CODEC_ID_DPX
,
"dpx"
},
{
CODEC_ID_EXR
,
"exr"
},
{
CODEC_ID_PICTOR
,
"pic"
},
{
CODEC_ID_PICTOR
,
"pic"
},
{
CODEC_ID_XBM
,
"xbm"
},
{
CODEC_ID_XBM
,
"xbm"
},
{
CODEC_ID_XWD
,
"xwd"
},
{
CODEC_ID_XWD
,
"xwd"
},
...
...
libavformat/isom.c
View file @
b7ce3242
...
@@ -225,6 +225,7 @@ const AVCodecTag ff_codec_movvideo_tags[] = {
...
@@ -225,6 +225,7 @@ const AVCodecTag ff_codec_movvideo_tags[] = {
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'V'
,
'u'
,
'p'
)
},
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'V'
,
'u'
,
'p'
)
},
{
CODEC_ID_SGI
,
MKTAG
(
's'
,
'g'
,
'i'
,
' '
)
},
/* SGI */
{
CODEC_ID_SGI
,
MKTAG
(
's'
,
'g'
,
'i'
,
' '
)
},
/* SGI */
{
CODEC_ID_DPX
,
MKTAG
(
'd'
,
'p'
,
'x'
,
' '
)
},
/* DPX */
{
CODEC_ID_DPX
,
MKTAG
(
'd'
,
'p'
,
'x'
,
' '
)
},
/* DPX */
{
CODEC_ID_EXR
,
MKTAG
(
'e'
,
'x'
,
'r'
,
' '
)
},
/* OpenEXR */
{
CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'h'
)
},
/* Apple ProRes 422 High Quality */
{
CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'h'
)
},
/* Apple ProRes 422 High Quality */
{
CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'n'
)
},
/* Apple ProRes 422 Standard Definition */
{
CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'n'
)
},
/* Apple ProRes 422 Standard Definition */
...
...
libavformat/riff.c
View file @
b7ce3242
...
@@ -301,6 +301,7 @@ const AVCodecTag ff_codec_bmp_tags[] = {
...
@@ -301,6 +301,7 @@ const AVCodecTag ff_codec_bmp_tags[] = {
{
CODEC_ID_ZEROCODEC
,
MKTAG
(
'Z'
,
'E'
,
'C'
,
'O'
)
},
{
CODEC_ID_ZEROCODEC
,
MKTAG
(
'Z'
,
'E'
,
'C'
,
'O'
)
},
{
CODEC_ID_Y41P
,
MKTAG
(
'Y'
,
'4'
,
'1'
,
'P'
)
},
{
CODEC_ID_Y41P
,
MKTAG
(
'Y'
,
'4'
,
'1'
,
'P'
)
},
{
CODEC_ID_FLIC
,
MKTAG
(
'A'
,
'F'
,
'L'
,
'C'
)
},
{
CODEC_ID_FLIC
,
MKTAG
(
'A'
,
'F'
,
'L'
,
'C'
)
},
{
CODEC_ID_EXR
,
MKTAG
(
'e'
,
'x'
,
'r'
,
' '
)
},
{
CODEC_ID_NONE
,
0
}
{
CODEC_ID_NONE
,
0
}
};
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment