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
46ce9ded
Commit
46ce9ded
authored
Jun 01, 2013
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tiff: K&R formatting cosmetics
parent
f849a77e
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
106 additions
and
102 deletions
+106
-102
tiff.c
libavcodec/tiff.c
+24
-20
tiff.h
libavcodec/tiff.h
+3
-3
tiffenc.c
libavcodec/tiffenc.c
+79
-79
No files found.
libavcodec/tiff.c
View file @
46ce9ded
...
@@ -25,19 +25,20 @@
...
@@ -25,19 +25,20 @@
* @author Konstantin Shishkov
* @author Konstantin Shishkov
*/
*/
#include "avcodec.h"
#include "config.h"
#include "config.h"
#if CONFIG_ZLIB
#if CONFIG_ZLIB
#include <zlib.h>
#include <zlib.h>
#endif
#endif
#include "lzw.h"
#include "tiff.h"
#include "faxcompr.h"
#include "internal.h"
#include "mathops.h"
#include "libavutil/attributes.h"
#include "libavutil/attributes.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/imgutils.h"
#include "libavutil/imgutils.h"
#include "avcodec.h"
#include "faxcompr.h"
#include "internal.h"
#include "lzw.h"
#include "mathops.h"
#include "tiff.h"
typedef
struct
TiffContext
{
typedef
struct
TiffContext
{
AVCodecContext
*
avctx
;
AVCodecContext
*
avctx
;
...
@@ -78,10 +79,14 @@ static unsigned tget_long(const uint8_t **p, int le)
...
@@ -78,10 +79,14 @@ static unsigned tget_long(const uint8_t **p, int le)
static
unsigned
tget
(
const
uint8_t
**
p
,
int
type
,
int
le
)
static
unsigned
tget
(
const
uint8_t
**
p
,
int
type
,
int
le
)
{
{
switch
(
type
)
{
switch
(
type
)
{
case
TIFF_BYTE
:
return
*
(
*
p
)
++
;
case
TIFF_BYTE
:
case
TIFF_SHORT
:
return
tget_short
(
p
,
le
);
return
*
(
*
p
)
++
;
case
TIFF_LONG
:
return
tget_long
(
p
,
le
);
case
TIFF_SHORT
:
default
:
return
UINT_MAX
;
return
tget_short
(
p
,
le
);
case
TIFF_LONG
:
return
tget_long
(
p
,
le
);
default:
return
UINT_MAX
;
}
}
}
}
...
@@ -151,8 +156,9 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
...
@@ -151,8 +156,9 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
return
ret
;
return
ret
;
}
}
}
}
if
(
s
->
compr
==
TIFF_CCITT_RLE
||
s
->
compr
==
TIFF_G3
if
(
s
->
compr
==
TIFF_CCITT_RLE
||
||
s
->
compr
==
TIFF_G4
)
{
s
->
compr
==
TIFF_G3
||
s
->
compr
==
TIFF_G4
)
{
int
i
,
ret
=
0
;
int
i
,
ret
=
0
;
uint8_t
*
src2
=
av_malloc
((
unsigned
)
size
+
uint8_t
*
src2
=
av_malloc
((
unsigned
)
size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
FF_INPUT_BUFFER_PADDING_SIZE
);
...
@@ -206,7 +212,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
...
@@ -206,7 +212,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
break
;
break
;
case
TIFF_PACKBITS
:
case
TIFF_PACKBITS
:
for
(
pixels
=
0
;
pixels
<
width
;)
{
for
(
pixels
=
0
;
pixels
<
width
;)
{
code
=
(
int8_t
)
*
src
++
;
code
=
(
int8_t
)
*
src
++
;
if
(
code
>=
0
)
{
if
(
code
>=
0
)
{
code
++
;
code
++
;
if
(
pixels
+
code
>
width
)
{
if
(
pixels
+
code
>
width
)
{
...
@@ -339,12 +345,11 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -339,12 +345,11 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
buf
=
start
+
off
;
buf
=
start
+
off
;
}
}
}
else
{
}
else
{
if
(
count
<=
4
&&
type_sizes
[
type
]
*
count
<=
4
)
{
if
(
count
<=
4
&&
type_sizes
[
type
]
*
count
<=
4
)
buf
-=
4
;
buf
-=
4
;
}
else
{
else
buf
=
start
+
off
;
buf
=
start
+
off
;
}
}
}
if
(
buf
&&
(
buf
<
start
||
buf
>
end_buf
))
{
if
(
buf
&&
(
buf
<
start
||
buf
>
end_buf
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
...
@@ -546,12 +551,11 @@ static int decode_frame(AVCodecContext *avctx,
...
@@ -546,12 +551,11 @@ static int decode_frame(AVCodecContext *avctx,
const
uint8_t
*
orig_buf
=
buf
,
*
end_buf
=
buf
+
buf_size
;
const
uint8_t
*
orig_buf
=
buf
,
*
end_buf
=
buf
+
buf_size
;
unsigned
off
;
unsigned
off
;
int
id
,
le
,
ret
;
int
id
,
le
,
ret
;
int
i
,
j
,
entries
;
int
i
,
j
,
entries
,
stride
;
int
stride
;
unsigned
soff
,
ssize
;
unsigned
soff
,
ssize
;
uint8_t
*
dst
;
uint8_t
*
dst
;
//parse image header
//
parse image header
if
(
end_buf
-
buf
<
8
)
if
(
end_buf
-
buf
<
8
)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
id
=
AV_RL16
(
buf
);
id
=
AV_RL16
(
buf
);
...
@@ -678,6 +682,7 @@ static av_cold int tiff_end(AVCodecContext *avctx)
...
@@ -678,6 +682,7 @@ static av_cold int tiff_end(AVCodecContext *avctx)
AVCodec
ff_tiff_decoder
=
{
AVCodec
ff_tiff_decoder
=
{
.
name
=
"tiff"
,
.
name
=
"tiff"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"TIFF image"
),
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_TIFF
,
.
id
=
AV_CODEC_ID_TIFF
,
.
priv_data_size
=
sizeof
(
TiffContext
),
.
priv_data_size
=
sizeof
(
TiffContext
),
...
@@ -685,5 +690,4 @@ AVCodec ff_tiff_decoder = {
...
@@ -685,5 +690,4 @@ AVCodec ff_tiff_decoder = {
.
close
=
tiff_end
,
.
close
=
tiff_end
,
.
decode
=
decode_frame
,
.
decode
=
decode_frame
,
.
capabilities
=
CODEC_CAP_DR1
,
.
capabilities
=
CODEC_CAP_DR1
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"TIFF image"
),
};
};
libavcodec/tiff.h
View file @
46ce9ded
...
@@ -31,7 +31,7 @@
...
@@ -31,7 +31,7 @@
#include <stdint.h>
#include <stdint.h>
/** abridged list of TIFF tags */
/** abridged list of TIFF tags */
enum
TiffTags
{
enum
TiffTags
{
TIFF_SUBFILE
=
0xfe
,
TIFF_SUBFILE
=
0xfe
,
TIFF_WIDTH
=
0x100
,
TIFF_WIDTH
=
0x100
,
TIFF_HEIGHT
,
TIFF_HEIGHT
,
...
@@ -61,7 +61,7 @@ enum TiffTags{
...
@@ -61,7 +61,7 @@ enum TiffTags{
};
};
/** list of TIFF compression types */
/** list of TIFF compression types */
enum
TiffCompr
{
enum
TiffCompr
{
TIFF_RAW
=
1
,
TIFF_RAW
=
1
,
TIFF_CCITT_RLE
,
TIFF_CCITT_RLE
,
TIFF_G3
,
TIFF_G3
,
...
@@ -74,7 +74,7 @@ enum TiffCompr{
...
@@ -74,7 +74,7 @@ enum TiffCompr{
TIFF_DEFLATE
=
0x80B2
TIFF_DEFLATE
=
0x80B2
};
};
enum
TiffTypes
{
enum
TiffTypes
{
TIFF_BYTE
=
1
,
TIFF_BYTE
=
1
,
TIFF_STRING
,
TIFF_STRING
,
TIFF_SHORT
,
TIFF_SHORT
,
...
...
libavcodec/tiffenc.c
View file @
46ce9ded
...
@@ -25,20 +25,20 @@
...
@@ -25,20 +25,20 @@
* @author Bartlomiej Wolowiec
* @author Bartlomiej Wolowiec
*/
*/
#include "libavutil/log.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "config.h"
#include "config.h"
#if CONFIG_ZLIB
#if CONFIG_ZLIB
#include <zlib.h>
#include <zlib.h>
#endif
#endif
#include "libavutil/log.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "bytestream.h"
#include "bytestream.h"
#include "tiff.h"
#include "rle.h"
#include "lzw.h"
#include "lzw.h"
#include "put_bits.h"
#include "put_bits.h"
#include "rle.h"
#include "tiff.h"
#define TIFF_MAX_ENTRY 32
#define TIFF_MAX_ENTRY 32
...
@@ -60,23 +60,22 @@ typedef struct TiffEncoderContext {
...
@@ -60,23 +60,22 @@ typedef struct TiffEncoderContext {
int
photometric_interpretation
;
///< photometric interpretation
int
photometric_interpretation
;
///< photometric interpretation
int
strips
;
///< number of strips
int
strips
;
///< number of strips
int
rps
;
///< row per strip
int
rps
;
///< row per strip
uint8_t
entries
[
TIFF_MAX_ENTRY
*
12
];
///< entir
es in header
uint8_t
entries
[
TIFF_MAX_ENTRY
*
12
];
///< entri
es in header
int
num_entries
;
///< number of entir
es
int
num_entries
;
///< number of entri
es
uint8_t
**
buf
;
///< actual position in buffer
uint8_t
**
buf
;
///< actual position in buffer
uint8_t
*
buf_start
;
///< pointer to first byte in buffer
uint8_t
*
buf_start
;
///< pointer to first byte in buffer
int
buf_size
;
///< buffer size
int
buf_size
;
///< buffer size
uint16_t
subsampling
[
2
];
///< YUV subsampling factors
uint16_t
subsampling
[
2
];
///< YUV subsampling factors
struct
LZWEncodeState
*
lzws
;
///< LZW E
ncode state
struct
LZWEncodeState
*
lzws
;
///< LZW e
ncode state
}
TiffEncoderContext
;
}
TiffEncoderContext
;
/**
/**
* Check free space in buffer
* Check free space in buffer
* @param s Tiff context
* @param s Tiff context
* @param need Needed bytes
* @param need Needed bytes
* @return 0 - ok, 1 - no free space
* @return 0 - ok, 1 - no free space
*/
*/
static
inline
int
check_size
(
TiffEncoderContext
*
s
,
uint64_t
need
)
static
inline
int
check_size
(
TiffEncoderContext
*
s
,
uint64_t
need
)
{
{
if
(
s
->
buf_size
<
*
s
->
buf
-
s
->
buf_start
+
need
)
{
if
(
s
->
buf_size
<
*
s
->
buf
-
s
->
buf_start
+
need
)
{
*
s
->
buf
=
s
->
buf_start
+
s
->
buf_size
+
1
;
*
s
->
buf
=
s
->
buf_start
+
s
->
buf_size
+
1
;
...
@@ -95,12 +94,12 @@ static inline int check_size(TiffEncoderContext * s, uint64_t need)
...
@@ -95,12 +94,12 @@ static inline int check_size(TiffEncoderContext * s, uint64_t need)
* @param type Type of values
* @param type Type of values
* @param flip =0 - normal copy, >0 - flip
* @param flip =0 - normal copy, >0 - flip
*/
*/
static
void
tnput
(
uint8_t
**
p
,
int
n
,
const
uint8_t
*
val
,
enum
TiffTypes
type
,
static
void
tnput
(
uint8_t
**
p
,
int
n
,
const
uint8_t
*
val
,
enum
TiffTypes
type
,
int
flip
)
int
flip
)
{
{
int
i
;
int
i
;
#if HAVE_BIGENDIAN
#if HAVE_BIGENDIAN
flip
^=
((
int
[])
{
0
,
0
,
0
,
1
,
3
,
3
})[
type
];
flip
^=
((
int
[])
{
0
,
0
,
0
,
1
,
3
,
3
})[
type
];
#endif
#endif
for
(
i
=
0
;
i
<
n
*
type_sizes2
[
type
];
i
++
)
for
(
i
=
0
;
i
<
n
*
type_sizes2
[
type
];
i
++
)
*
(
*
p
)
++
=
val
[
i
^
flip
];
*
(
*
p
)
++
=
val
[
i
^
flip
];
...
@@ -114,9 +113,8 @@ static void tnput(uint8_t ** p, int n, const uint8_t * val, enum TiffTypes type,
...
@@ -114,9 +113,8 @@ static void tnput(uint8_t ** p, int n, const uint8_t * val, enum TiffTypes type,
* @param count The number of values
* @param count The number of values
* @param ptr_val Pointer to values
* @param ptr_val Pointer to values
*/
*/
static
void
add_entry
(
TiffEncoderContext
*
s
,
static
void
add_entry
(
TiffEncoderContext
*
s
,
enum
TiffTags
tag
,
enum
TiffTags
tag
,
enum
TiffTypes
type
,
int
count
,
enum
TiffTypes
type
,
int
count
,
const
void
*
ptr_val
)
const
void
*
ptr_val
)
{
{
uint8_t
*
entries_ptr
=
s
->
entries
+
12
*
s
->
num_entries
;
uint8_t
*
entries_ptr
=
s
->
entries
+
12
*
s
->
num_entries
;
...
@@ -137,10 +135,11 @@ static void add_entry(TiffEncoderContext * s,
...
@@ -137,10 +135,11 @@ static void add_entry(TiffEncoderContext * s,
s
->
num_entries
++
;
s
->
num_entries
++
;
}
}
static
void
add_entry1
(
TiffEncoderContext
*
s
,
static
void
add_entry1
(
TiffEncoderContext
*
s
,
enum
TiffTags
tag
,
enum
TiffTypes
type
,
int
val
){
enum
TiffTags
tag
,
enum
TiffTypes
type
,
int
val
)
{
uint16_t
w
=
val
;
uint16_t
w
=
val
;
uint32_t
dw
=
val
;
uint32_t
dw
=
val
;
add_entry
(
s
,
tag
,
type
,
1
,
type
==
TIFF_SHORT
?
(
void
*
)
&
w
:
(
void
*
)
&
dw
);
add_entry
(
s
,
tag
,
type
,
1
,
type
==
TIFF_SHORT
?
(
void
*
)
&
w
:
(
void
*
)
&
dw
);
}
}
...
@@ -154,10 +153,9 @@ static void add_entry1(TiffEncoderContext * s,
...
@@ -154,10 +153,9 @@ static void add_entry1(TiffEncoderContext * s,
* @param compr Compression method
* @param compr Compression method
* @return Number of output bytes. If an output error is encountered, -1 returned
* @return Number of output bytes. If an output error is encountered, -1 returned
*/
*/
static
int
encode_strip
(
TiffEncoderContext
*
s
,
const
int8_t
*
src
,
static
int
encode_strip
(
TiffEncoderContext
*
s
,
const
int8_t
*
src
,
uint8_t
*
dst
,
int
n
,
int
compr
)
uint8_t
*
dst
,
int
n
,
int
compr
)
{
{
switch
(
compr
)
{
switch
(
compr
)
{
#if CONFIG_ZLIB
#if CONFIG_ZLIB
case
TIFF_DEFLATE
:
case
TIFF_DEFLATE
:
...
@@ -177,7 +175,8 @@ static int encode_strip(TiffEncoderContext * s, const int8_t * src,
...
@@ -177,7 +175,8 @@ static int encode_strip(TiffEncoderContext * s, const int8_t * src,
memcpy
(
dst
,
src
,
n
);
memcpy
(
dst
,
src
,
n
);
return
n
;
return
n
;
case
TIFF_PACKBITS
:
case
TIFF_PACKBITS
:
return
ff_rle_encode
(
dst
,
s
->
buf_size
-
(
*
s
->
buf
-
s
->
buf_start
),
src
,
1
,
n
,
2
,
0xff
,
-
1
,
0
);
return
ff_rle_encode
(
dst
,
s
->
buf_size
-
(
*
s
->
buf
-
s
->
buf_start
),
src
,
1
,
n
,
2
,
0xff
,
-
1
,
0
);
case
TIFF_LZW
:
case
TIFF_LZW
:
return
ff_lzw_encode
(
s
->
lzws
,
src
,
n
);
return
ff_lzw_encode
(
s
->
lzws
,
src
,
n
);
default:
default:
...
@@ -185,14 +184,14 @@ static int encode_strip(TiffEncoderContext * s, const int8_t * src,
...
@@ -185,14 +184,14 @@ static int encode_strip(TiffEncoderContext * s, const int8_t * src,
}
}
}
}
static
void
pack_yuv
(
TiffEncoderContext
*
s
,
uint8_t
*
dst
,
int
lnum
)
static
void
pack_yuv
(
TiffEncoderContext
*
s
,
uint8_t
*
dst
,
int
lnum
)
{
{
AVFrame
*
p
=
&
s
->
picture
;
AVFrame
*
p
=
&
s
->
picture
;
int
i
,
j
,
k
;
int
i
,
j
,
k
;
int
w
=
(
s
->
width
-
1
)
/
s
->
subsampling
[
0
]
+
1
;
int
w
=
(
s
->
width
-
1
)
/
s
->
subsampling
[
0
]
+
1
;
uint8_t
*
pu
=
&
p
->
data
[
1
][
lnum
/
s
->
subsampling
[
1
]
*
p
->
linesize
[
1
]];
uint8_t
*
pu
=
&
p
->
data
[
1
][
lnum
/
s
->
subsampling
[
1
]
*
p
->
linesize
[
1
]];
uint8_t
*
pv
=
&
p
->
data
[
2
][
lnum
/
s
->
subsampling
[
1
]
*
p
->
linesize
[
2
]];
uint8_t
*
pv
=
&
p
->
data
[
2
][
lnum
/
s
->
subsampling
[
1
]
*
p
->
linesize
[
2
]];
for
(
i
=
0
;
i
<
w
;
i
++
){
for
(
i
=
0
;
i
<
w
;
i
++
)
{
for
(
j
=
0
;
j
<
s
->
subsampling
[
1
];
j
++
)
for
(
j
=
0
;
j
<
s
->
subsampling
[
1
];
j
++
)
for
(
k
=
0
;
k
<
s
->
subsampling
[
0
];
k
++
)
for
(
k
=
0
;
k
<
s
->
subsampling
[
0
];
k
++
)
*
dst
++
=
p
->
data
[
0
][(
lnum
+
j
)
*
p
->
linesize
[
0
]
+
*
dst
++
=
p
->
data
[
0
][(
lnum
+
j
)
*
p
->
linesize
[
0
]
+
...
@@ -202,7 +201,7 @@ static void pack_yuv(TiffEncoderContext * s, uint8_t * dst, int lnum)
...
@@ -202,7 +201,7 @@ static void pack_yuv(TiffEncoderContext * s, uint8_t * dst, int lnum)
}
}
}
}
static
int
encode_frame
(
AVCodecContext
*
avctx
,
AVPacket
*
pkt
,
static
int
encode_frame
(
AVCodecContext
*
avctx
,
AVPacket
*
pkt
,
const
AVFrame
*
pict
,
int
*
got_packet
)
const
AVFrame
*
pict
,
int
*
got_packet
)
{
{
TiffEncoderContext
*
s
=
avctx
->
priv_data
;
TiffEncoderContext
*
s
=
avctx
->
priv_data
;
...
@@ -220,14 +219,14 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -220,14 +219,14 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
int
is_yuv
=
0
;
int
is_yuv
=
0
;
uint8_t
*
yuv_line
=
NULL
;
uint8_t
*
yuv_line
=
NULL
;
int
shift_h
,
shift_v
;
int
shift_h
,
shift_v
;
const
AVPixFmtDescriptor
*
pfd
;
const
AVPixFmtDescriptor
*
pfd
;
s
->
avctx
=
avctx
;
s
->
avctx
=
avctx
;
*
p
=
*
pict
;
*
p
=
*
pict
;
p
->
pict_type
=
AV_PICTURE_TYPE_I
;
p
->
pict_type
=
AV_PICTURE_TYPE_I
;
p
->
key_frame
=
1
;
p
->
key_frame
=
1
;
avctx
->
coded_frame
=
&
s
->
picture
;
avctx
->
coded_frame
=
&
s
->
picture
;
s
->
width
=
avctx
->
width
;
s
->
width
=
avctx
->
width
;
s
->
height
=
avctx
->
height
;
s
->
height
=
avctx
->
height
;
...
@@ -242,17 +241,15 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -242,17 +241,15 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
case
AV_PIX_FMT_PAL8
:
case
AV_PIX_FMT_PAL8
:
pfd
=
av_pix_fmt_desc_get
(
avctx
->
pix_fmt
);
pfd
=
av_pix_fmt_desc_get
(
avctx
->
pix_fmt
);
s
->
bpp
=
av_get_bits_per_pixel
(
pfd
);
s
->
bpp
=
av_get_bits_per_pixel
(
pfd
);
if
(
pfd
->
flags
&
AV_PIX_FMT_FLAG_PAL
)
{
if
(
pfd
->
flags
&
AV_PIX_FMT_FLAG_PAL
)
s
->
photometric_interpretation
=
3
;
s
->
photometric_interpretation
=
3
;
}
else
if
(
pfd
->
flags
&
AV_PIX_FMT_FLAG_RGB
)
{
else
if
(
pfd
->
flags
&
AV_PIX_FMT_FLAG_RGB
)
s
->
photometric_interpretation
=
2
;
s
->
photometric_interpretation
=
2
;
}
else
{
else
s
->
photometric_interpretation
=
1
;
s
->
photometric_interpretation
=
1
;
}
s
->
bpp_tab_size
=
pfd
->
nb_components
;
s
->
bpp_tab_size
=
pfd
->
nb_components
;
for
(
i
=
0
;
i
<
s
->
bpp_tab_size
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
bpp_tab_size
;
i
++
)
bpp_tab
[
i
]
=
s
->
bpp
/
s
->
bpp_tab_size
;
bpp_tab
[
i
]
=
s
->
bpp
/
s
->
bpp_tab_size
;
}
break
;
break
;
case
AV_PIX_FMT_MONOBLACK
:
case
AV_PIX_FMT_MONOBLACK
:
s
->
bpp
=
1
;
s
->
bpp
=
1
;
...
@@ -269,9 +266,8 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -269,9 +266,8 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
case
AV_PIX_FMT_YUV444P
:
case
AV_PIX_FMT_YUV444P
:
case
AV_PIX_FMT_YUV410P
:
case
AV_PIX_FMT_YUV410P
:
case
AV_PIX_FMT_YUV411P
:
case
AV_PIX_FMT_YUV411P
:
av_pix_fmt_get_chroma_sub_sample
(
avctx
->
pix_fmt
,
&
shift_h
,
&
shift_v
);
s
->
photometric_interpretation
=
6
;
s
->
photometric_interpretation
=
6
;
av_pix_fmt_get_chroma_sub_sample
(
avctx
->
pix_fmt
,
&
shift_h
,
&
shift_v
);
s
->
bpp
=
8
+
(
16
>>
(
shift_h
+
shift_v
));
s
->
bpp
=
8
+
(
16
>>
(
shift_h
+
shift_v
));
s
->
subsampling
[
0
]
=
1
<<
shift_h
;
s
->
subsampling
[
0
]
=
1
<<
shift_h
;
s
->
subsampling
[
1
]
=
1
<<
shift_v
;
s
->
subsampling
[
1
]
=
1
<<
shift_v
;
...
@@ -284,17 +280,22 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -284,17 +280,22 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
return
-
1
;
return
-
1
;
}
}
if
(
s
->
compr
==
TIFF_DEFLATE
||
s
->
compr
==
TIFF_ADOBE_DEFLATE
||
s
->
compr
==
TIFF_LZW
)
if
(
s
->
compr
==
TIFF_DEFLATE
||
//best choose for DEFLATE
s
->
compr
==
TIFF_ADOBE_DEFLATE
||
s
->
compr
==
TIFF_LZW
)
// best choice for DEFLATE
s
->
rps
=
s
->
height
;
s
->
rps
=
s
->
height
;
else
else
s
->
rps
=
FFMAX
(
8192
/
(((
s
->
width
*
s
->
bpp
)
>>
3
)
+
1
),
1
);
// suggest size of strip
// suggest size of strip
s
->
rps
=
((
s
->
rps
-
1
)
/
s
->
subsampling
[
1
]
+
1
)
*
s
->
subsampling
[
1
];
// round rps up
s
->
rps
=
FFMAX
(
8192
/
(((
s
->
width
*
s
->
bpp
)
>>
3
)
+
1
),
1
);
// round rps up
s
->
rps
=
((
s
->
rps
-
1
)
/
s
->
subsampling
[
1
]
+
1
)
*
s
->
subsampling
[
1
];
strips
=
(
s
->
height
-
1
)
/
s
->
rps
+
1
;
strips
=
(
s
->
height
-
1
)
/
s
->
rps
+
1
;
if
(
!
pkt
->
data
&&
if
(
!
pkt
->
data
&&
(
ret
=
av_new_packet
(
pkt
,
avctx
->
width
*
avctx
->
height
*
s
->
bpp
*
2
+
(
ret
=
av_new_packet
(
pkt
,
avctx
->
width
*
avctx
->
height
*
s
->
bpp
*
2
+
avctx
->
height
*
4
+
FF_MIN_BUFFER_SIZE
))
<
0
)
{
avctx
->
height
*
4
+
FF_MIN_BUFFER_SIZE
))
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error getting output packet.
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error getting output packet.
\n
"
);
return
ret
;
return
ret
;
...
@@ -321,11 +322,11 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -321,11 +322,11 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
goto
fail
;
goto
fail
;
}
}
bytes_per_row
=
(((
s
->
width
-
1
)
/
s
->
subsampling
[
0
]
+
1
)
*
s
->
bpp
bytes_per_row
=
(((
s
->
width
-
1
)
/
s
->
subsampling
[
0
]
+
1
)
*
s
->
bpp
*
*
s
->
subsampling
[
0
]
*
s
->
subsampling
[
1
]
+
7
)
>>
3
;
s
->
subsampling
[
0
]
*
s
->
subsampling
[
1
]
+
7
)
>>
3
;
if
(
is_yuv
){
if
(
is_yuv
)
{
yuv_line
=
av_malloc
(
bytes_per_row
);
yuv_line
=
av_malloc
(
bytes_per_row
);
if
(
yuv_line
==
NULL
){
if
(
yuv_line
==
NULL
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Not enough memory
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Not enough memory
\n
"
);
ret
=
AVERROR
(
ENOMEM
);
ret
=
AVERROR
(
ENOMEM
);
goto
fail
;
goto
fail
;
...
@@ -347,12 +348,11 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -347,12 +348,11 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
strip_offsets
[
0
]
=
ptr
-
pkt
->
data
;
strip_offsets
[
0
]
=
ptr
-
pkt
->
data
;
zn
=
0
;
zn
=
0
;
for
(
j
=
0
;
j
<
s
->
rps
;
j
++
)
{
for
(
j
=
0
;
j
<
s
->
rps
;
j
++
)
{
if
(
is_yuv
){
if
(
is_yuv
)
{
pack_yuv
(
s
,
yuv_line
,
j
);
pack_yuv
(
s
,
yuv_line
,
j
);
memcpy
(
zbuf
+
zn
,
yuv_line
,
bytes_per_row
);
memcpy
(
zbuf
+
zn
,
yuv_line
,
bytes_per_row
);
j
+=
s
->
subsampling
[
1
]
-
1
;
j
+=
s
->
subsampling
[
1
]
-
1
;
}
}
else
else
memcpy
(
zbuf
+
j
*
bytes_per_row
,
memcpy
(
zbuf
+
j
*
bytes_per_row
,
p
->
data
[
0
]
+
j
*
p
->
linesize
[
0
],
bytes_per_row
);
p
->
data
[
0
]
+
j
*
p
->
linesize
[
0
],
bytes_per_row
);
zn
+=
bytes_per_row
;
zn
+=
bytes_per_row
;
...
@@ -367,7 +367,6 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -367,7 +367,6 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
strip_sizes
[
0
]
=
ptr
-
pkt
->
data
-
strip_offsets
[
0
];
strip_sizes
[
0
]
=
ptr
-
pkt
->
data
-
strip_offsets
[
0
];
}
else
}
else
#endif
#endif
{
if
(
s
->
compr
==
TIFF_LZW
)
{
if
(
s
->
compr
==
TIFF_LZW
)
{
s
->
lzws
=
av_malloc
(
ff_lzw_encode_state_size
);
s
->
lzws
=
av_malloc
(
ff_lzw_encode_state_size
);
if
(
!
s
->
lzws
)
{
if
(
!
s
->
lzws
)
{
...
@@ -377,18 +376,18 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -377,18 +376,18 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
}
}
for
(
i
=
0
;
i
<
s
->
height
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
height
;
i
++
)
{
if
(
strip_sizes
[
i
/
s
->
rps
]
==
0
)
{
if
(
strip_sizes
[
i
/
s
->
rps
]
==
0
)
{
if
(
s
->
compr
==
TIFF_LZW
){
if
(
s
->
compr
==
TIFF_LZW
)
{
ff_lzw_encode_init
(
s
->
lzws
,
ptr
,
s
->
buf_size
-
(
*
s
->
buf
-
s
->
buf_start
),
ff_lzw_encode_init
(
s
->
lzws
,
ptr
,
s
->
buf_size
-
(
*
s
->
buf
-
s
->
buf_start
),
12
,
FF_LZW_TIFF
,
put_bits
);
12
,
FF_LZW_TIFF
,
put_bits
);
}
}
strip_offsets
[
i
/
s
->
rps
]
=
ptr
-
pkt
->
data
;
strip_offsets
[
i
/
s
->
rps
]
=
ptr
-
pkt
->
data
;
}
}
if
(
is_yuv
)
{
if
(
is_yuv
)
{
pack_yuv
(
s
,
yuv_line
,
i
);
pack_yuv
(
s
,
yuv_line
,
i
);
ret
=
encode_strip
(
s
,
yuv_line
,
ptr
,
bytes_per_row
,
s
->
compr
);
ret
=
encode_strip
(
s
,
yuv_line
,
ptr
,
bytes_per_row
,
s
->
compr
);
i
+=
s
->
subsampling
[
1
]
-
1
;
i
+=
s
->
subsampling
[
1
]
-
1
;
}
}
else
else
ret
=
encode_strip
(
s
,
p
->
data
[
0
]
+
i
*
p
->
linesize
[
0
],
ret
=
encode_strip
(
s
,
p
->
data
[
0
]
+
i
*
p
->
linesize
[
0
],
ptr
,
bytes_per_row
,
s
->
compr
);
ptr
,
bytes_per_row
,
s
->
compr
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
...
@@ -397,39 +396,39 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -397,39 +396,39 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
}
}
strip_sizes
[
i
/
s
->
rps
]
+=
ret
;
strip_sizes
[
i
/
s
->
rps
]
+=
ret
;
ptr
+=
ret
;
ptr
+=
ret
;
if
(
s
->
compr
==
TIFF_LZW
&&
(
i
==
s
->
height
-
1
||
i
%
s
->
rps
==
s
->
rps
-
1
)){
if
(
s
->
compr
==
TIFF_LZW
&&
(
i
==
s
->
height
-
1
||
i
%
s
->
rps
==
s
->
rps
-
1
))
{
ret
=
ff_lzw_encode_flush
(
s
->
lzws
,
flush_put_bits
);
ret
=
ff_lzw_encode_flush
(
s
->
lzws
,
flush_put_bits
);
strip_sizes
[(
i
/
s
->
rps
)]
+=
ret
;
strip_sizes
[(
i
/
s
->
rps
)]
+=
ret
;
ptr
+=
ret
;
ptr
+=
ret
;
}
}
}
}
if
(
s
->
compr
==
TIFF_LZW
)
if
(
s
->
compr
==
TIFF_LZW
)
av_free
(
s
->
lzws
);
av_free
(
s
->
lzws
);
}
s
->
num_entries
=
0
;
s
->
num_entries
=
0
;
add_entry1
(
s
,
TIFF_SUBFILE
,
TIFF_LONG
,
0
);
add_entry1
(
s
,
TIFF_SUBFILE
,
TIFF_LONG
,
0
);
add_entry1
(
s
,
TIFF_WIDTH
,
TIFF_LONG
,
s
->
width
);
add_entry1
(
s
,
TIFF_WIDTH
,
TIFF_LONG
,
s
->
width
);
add_entry1
(
s
,
TIFF_HEIGHT
,
TIFF_LONG
,
s
->
height
);
add_entry1
(
s
,
TIFF_HEIGHT
,
TIFF_LONG
,
s
->
height
);
if
(
s
->
bpp_tab_size
)
if
(
s
->
bpp_tab_size
)
add_entry
(
s
,
TIFF_BPP
,
TIFF_SHORT
,
s
->
bpp_tab_size
,
bpp_tab
);
add_entry
(
s
,
TIFF_BPP
,
TIFF_SHORT
,
s
->
bpp_tab_size
,
bpp_tab
);
add_entry1
(
s
,
TIFF_COMPR
,
TIFF_SHORT
,
s
->
compr
);
add_entry1
(
s
,
TIFF_COMPR
,
TIFF_SHORT
,
s
->
compr
);
add_entry1
(
s
,
TIFF_INVERT
,
TIFF_SHORT
,
s
->
photometric_interpretation
);
add_entry1
(
s
,
TIFF_INVERT
,
TIFF_SHORT
,
s
->
photometric_interpretation
);
add_entry
(
s
,
TIFF_STRIP_OFFS
,
TIFF_LONG
,
strips
,
strip_offsets
);
add_entry
(
s
,
TIFF_STRIP_OFFS
,
TIFF_LONG
,
strips
,
strip_offsets
);
if
(
s
->
bpp_tab_size
)
if
(
s
->
bpp_tab_size
)
add_entry1
(
s
,
TIFF_SAMPLES_PER_PIXEL
,
TIFF_SHORT
,
s
->
bpp_tab_size
);
add_entry1
(
s
,
TIFF_SAMPLES_PER_PIXEL
,
TIFF_SHORT
,
s
->
bpp_tab_size
);
add_entry1
(
s
,
TIFF_ROWSPERSTRIP
,
TIFF_LONG
,
s
->
rps
);
add_entry1
(
s
,
TIFF_ROWSPERSTRIP
,
TIFF_LONG
,
s
->
rps
);
add_entry
(
s
,
TIFF_STRIP_SIZE
,
TIFF_LONG
,
strips
,
strip_sizes
);
add_entry
(
s
,
TIFF_STRIP_SIZE
,
TIFF_LONG
,
strips
,
strip_sizes
);
add_entry
(
s
,
TIFF_XRES
,
TIFF_RATIONAL
,
1
,
res
);
add_entry
(
s
,
TIFF_XRES
,
TIFF_RATIONAL
,
1
,
res
);
add_entry
(
s
,
TIFF_YRES
,
TIFF_RATIONAL
,
1
,
res
);
add_entry
(
s
,
TIFF_YRES
,
TIFF_RATIONAL
,
1
,
res
);
add_entry1
(
s
,
TIFF_RES_UNIT
,
TIFF_SHORT
,
2
);
add_entry1
(
s
,
TIFF_RES_UNIT
,
TIFF_SHORT
,
2
);
if
(
!
(
avctx
->
flags
&
CODEC_FLAG_BITEXACT
))
if
(
!
(
avctx
->
flags
&
CODEC_FLAG_BITEXACT
))
add_entry
(
s
,
TIFF_SOFTWARE_NAME
,
TIFF_STRING
,
add_entry
(
s
,
TIFF_SOFTWARE_NAME
,
TIFF_STRING
,
strlen
(
LIBAVCODEC_IDENT
)
+
1
,
LIBAVCODEC_IDENT
);
strlen
(
LIBAVCODEC_IDENT
)
+
1
,
LIBAVCODEC_IDENT
);
...
@@ -438,18 +437,19 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
...
@@ -438,18 +437,19 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt,
for
(
i
=
0
;
i
<
256
;
i
++
)
{
for
(
i
=
0
;
i
<
256
;
i
++
)
{
uint32_t
rgb
=
*
(
uint32_t
*
)
(
p
->
data
[
1
]
+
i
*
4
);
uint32_t
rgb
=
*
(
uint32_t
*
)
(
p
->
data
[
1
]
+
i
*
4
);
pal
[
i
]
=
((
rgb
>>
16
)
&
0xff
)
*
257
;
pal
[
i
]
=
((
rgb
>>
16
)
&
0xff
)
*
257
;
pal
[
i
+
256
]
=
((
rgb
>>
8
)
&
0xff
)
*
257
;
pal
[
i
+
256
]
=
((
rgb
>>
8
)
&
0xff
)
*
257
;
pal
[
i
+
512
]
=
(
rgb
&
0xff
)
*
257
;
pal
[
i
+
512
]
=
(
rgb
&
0xff
)
*
257
;
}
}
add_entry
(
s
,
TIFF_PAL
,
TIFF_SHORT
,
256
*
3
,
pal
);
add_entry
(
s
,
TIFF_PAL
,
TIFF_SHORT
,
256
*
3
,
pal
);
}
}
if
(
is_yuv
){
if
(
is_yuv
)
{
/** according to CCIR Recommendation 601.1 */
/** according to CCIR Recommendation 601.1 */
uint32_t
refbw
[
12
]
=
{
15
,
1
,
235
,
1
,
128
,
1
,
240
,
1
,
128
,
1
,
240
,
1
};
uint32_t
refbw
[
12
]
=
{
15
,
1
,
235
,
1
,
128
,
1
,
240
,
1
,
128
,
1
,
240
,
1
};
add_entry
(
s
,
TIFF_YCBCR_SUBSAMPLING
,
TIFF_SHORT
,
2
,
s
->
subsampling
);
add_entry
(
s
,
TIFF_YCBCR_SUBSAMPLING
,
TIFF_SHORT
,
2
,
s
->
subsampling
);
add_entry
(
s
,
TIFF_REFERENCE_BW
,
TIFF_RATIONAL
,
6
,
refbw
);
add_entry
(
s
,
TIFF_REFERENCE_BW
,
TIFF_RATIONAL
,
6
,
refbw
);
}
}
bytestream_put_le32
(
&
offset
,
ptr
-
pkt
->
data
);
// write offset to dir
// write offset to dir
bytestream_put_le32
(
&
offset
,
ptr
-
pkt
->
data
);
if
(
check_size
(
s
,
6
+
s
->
num_entries
*
12
))
{
if
(
check_size
(
s
,
6
+
s
->
num_entries
*
12
))
{
ret
=
AVERROR
(
EINVAL
);
ret
=
AVERROR
(
EINVAL
);
...
@@ -473,12 +473,12 @@ fail:
...
@@ -473,12 +473,12 @@ fail:
#define OFFSET(x) offsetof(TiffEncoderContext, x)
#define OFFSET(x) offsetof(TiffEncoderContext, x)
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static
const
AVOption
options
[]
=
{
static
const
AVOption
options
[]
=
{
{
"compression_algo"
,
NULL
,
OFFSET
(
compr
),
AV_OPT_TYPE_INT
,
{.
i64
=
TIFF_PACKBITS
},
TIFF_RAW
,
TIFF_DEFLATE
,
VE
,
"compression_algo"
},
{
"compression_algo"
,
NULL
,
OFFSET
(
compr
),
AV_OPT_TYPE_INT
,
{
.
i64
=
TIFF_PACKBITS
},
TIFF_RAW
,
TIFF_DEFLATE
,
VE
,
"compression_algo"
},
{
"packbits"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
TIFF_PACKBITS
},
0
,
0
,
VE
,
"compression_algo"
},
{
"packbits"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
TIFF_PACKBITS
},
0
,
0
,
VE
,
"compression_algo"
},
{
"raw"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
TIFF_RAW
},
0
,
0
,
VE
,
"compression_algo"
},
{
"raw"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
TIFF_RAW
},
0
,
0
,
VE
,
"compression_algo"
},
{
"lzw"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
TIFF_LZW
},
0
,
0
,
VE
,
"compression_algo"
},
{
"lzw"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
TIFF_LZW
},
0
,
0
,
VE
,
"compression_algo"
},
#if CONFIG_ZLIB
#if CONFIG_ZLIB
{
"deflate"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
TIFF_DEFLATE
},
0
,
0
,
VE
,
"compression_algo"
},
{
"deflate"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
TIFF_DEFLATE
},
0
,
0
,
VE
,
"compression_algo"
},
#endif
#endif
{
NULL
},
{
NULL
},
};
};
...
@@ -492,6 +492,7 @@ static const AVClass tiffenc_class = {
...
@@ -492,6 +492,7 @@ static const AVClass tiffenc_class = {
AVCodec
ff_tiff_encoder
=
{
AVCodec
ff_tiff_encoder
=
{
.
name
=
"tiff"
,
.
name
=
"tiff"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"TIFF image"
),
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_TIFF
,
.
id
=
AV_CODEC_ID_TIFF
,
.
priv_data_size
=
sizeof
(
TiffEncoderContext
),
.
priv_data_size
=
sizeof
(
TiffEncoderContext
),
...
@@ -504,6 +505,5 @@ AVCodec ff_tiff_encoder = {
...
@@ -504,6 +505,5 @@ AVCodec ff_tiff_encoder = {
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUV411P
,
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUV411P
,
AV_PIX_FMT_NONE
AV_PIX_FMT_NONE
},
},
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"TIFF image"
),
.
priv_class
=
&
tiffenc_class
,
.
priv_class
=
&
tiffenc_class
,
};
};
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