Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
e02de9df
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e02de9df
编写于
7月 05, 2014
作者:
A
Anton Khirnov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
lavc: export Dirac parsing API used by the ogg demuxer as public
Also, stop using AVCodecContext for storing the stream parameters.
上级
8bcadaac
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
200 addition
and
96 deletion
+200
-96
configure
configure
+3
-1
doc/APIchanges
doc/APIchanges
+3
-1
libavcodec/Makefile
libavcodec/Makefile
+2
-0
libavcodec/dirac.c
libavcodec/dirac.c
+142
-80
libavcodec/dirac.h
libavcodec/dirac.h
+28
-5
libavformat/oggparsedirac.c
libavformat/oggparsedirac.c
+22
-9
未找到文件。
configure
浏览文件 @
e02de9df
...
...
@@ -1646,6 +1646,7 @@ CONFIG_EXTRA="
blockdsp
bswapdsp
cabac
dirac_parse
dvprofile
faandct
faanidct
...
...
@@ -1850,6 +1851,7 @@ threads_if_any="$THREADS_LIST"
# subsystems
dct_select
=
"rdft"
dirac_parse_select
=
"golomb"
error_resilience_select
=
"me_cmp"
faandct_deps
=
"faan fdctdsp"
faanidct_deps
=
"faan idctdsp"
...
...
@@ -2241,7 +2243,7 @@ mxf_d10_muxer_select="mxf_muxer"
nut_muxer_select
=
"riffenc"
nuv_demuxer_select
=
"riffdec"
oga_muxer_select
=
"ogg_muxer"
ogg_demuxer_select
=
"
golomb
"
ogg_demuxer_select
=
"
dirac_parse
"
opus_muxer_select
=
"ogg_muxer"
psp_muxer_select
=
"mov_muxer"
rtp_demuxer_select
=
"sdp_demuxer"
...
...
doc/APIchanges
浏览文件 @
e02de9df
...
...
@@ -13,10 +13,12 @@ libavutil: 2015-08-28
API changes, most recent first:
2015-xx-xx - xxxxxxx - lavc 57.11.0 - avcodec.h
2015-xx-xx - xxxxxxx - lavc 57.11.0 - avcodec.h
dirac.h
xxxxxxx - Add av_packet_add_side_data().
xxxxxxx - Add AVCodecContext.coded_side_data.
xxxxxxx - Add AVCPBProperties API.
xxxxxxx - Add a new public header dirac.h containing
av_dirac_parse_sequence_header()
2015-xx-xx - xxxxxxx - lavc 57.9.1 - avcodec.h
Deprecate rtp_callback without replacement, i.e. it won't be possible to
...
...
libavcodec/Makefile
浏览文件 @
e02de9df
...
...
@@ -4,6 +4,7 @@ HEADERS = avcodec.h \
avfft.h
\
dv_profile.h
\
d3d11va.h
\
dirac.h
\
dxva2.h
\
qsv.h
\
vaapi.h
\
...
...
@@ -20,6 +21,7 @@ OBJS = allcodecs.o \
bitstream_filter.o
\
codec_desc.o
\
d3d11va.o
\
dirac.o
\
dv_profile.o
\
imgconvert.o
\
log2_tab.o
\
...
...
libavcodec/dirac.c
浏览文件 @
e02de9df
...
...
@@ -33,6 +33,28 @@
#include "internal.h"
#include "mpeg12data.h"
#if CONFIG_DIRAC_PARSE
typedef
struct
dirac_source_params
{
unsigned
width
;
unsigned
height
;
uint8_t
chroma_format
;
///< 0: 444 1: 422 2: 420
uint8_t
interlaced
;
uint8_t
top_field_first
;
uint8_t
frame_rate_index
;
///< index into dirac_frame_rate[]
uint8_t
aspect_ratio_index
;
///< index into dirac_aspect_ratio[]
uint16_t
clean_width
;
uint16_t
clean_height
;
uint16_t
clean_left_offset
;
uint16_t
clean_right_offset
;
uint8_t
pixel_range_index
;
///< index into dirac_pixel_range_presets[]
uint8_t
color_spec_index
;
///< index into dirac_color_spec_presets[]
}
dirac_source_params
;
// defaults for source parameters
static
const
dirac_source_params
dirac_source_parameters_defaults
[]
=
{
{
640
,
480
,
2
,
0
,
0
,
1
,
1
,
640
,
480
,
0
,
0
,
1
,
0
},
...
...
@@ -116,8 +138,8 @@ static const enum AVPixelFormat dirac_pix_fmt[2][3] = {
/* [DIRAC_STD] 10.3 Parse Source Parameters.
* source_parameters(base_video_format) */
static
int
parse_source_parameters
(
AV
CodecContext
*
avctx
,
GetBitContext
*
gb
,
dirac_source_params
*
source
)
static
int
parse_source_parameters
(
AV
DiracSeqHeader
*
dsh
,
GetBitContext
*
gb
,
void
*
log_ctx
)
{
AVRational
frame_rate
=
{
0
,
0
};
unsigned
luma_depth
=
8
,
luma_offset
=
16
;
...
...
@@ -126,8 +148,8 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
/* [DIRAC_STD] 10.3.2 Frame size. frame_size(video_params) */
/* [DIRAC_STD] custom_dimensions_flag */
if
(
get_bits1
(
gb
))
{
source
->
width
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] FRAME_WIDTH */
source
->
height
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] FRAME_HEIGHT */
dsh
->
width
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] FRAME_WIDTH */
dsh
->
height
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] FRAME_HEIGHT */
}
/* [DIRAC_STD] 10.3.3 Chroma Sampling Format.
...
...
@@ -135,10 +157,11 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
/* [DIRAC_STD] custom_chroma_format_flag */
if
(
get_bits1
(
gb
))
/* [DIRAC_STD] CHROMA_FORMAT_INDEX */
source
->
chroma_format
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
chroma_format
>
2
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unknown chroma format %d
\n
"
,
source
->
chroma_format
);
dsh
->
chroma_format
=
svq3_get_ue_golomb
(
gb
);
if
(
dsh
->
chroma_format
>
2
)
{
if
(
log_ctx
)
av_log
(
log_ctx
,
AV_LOG_ERROR
,
"Unknown chroma format %d
\n
"
,
dsh
->
chroma_format
);
return
AVERROR_INVALIDDATA
;
}
...
...
@@ -146,18 +169,18 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
/* [DIRAC_STD] custom_scan_format_flag */
if
(
get_bits1
(
gb
))
/* [DIRAC_STD] SOURCE_SAMPLING */
source
->
interlaced
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
interlaced
>
1
)
dsh
->
interlaced
=
svq3_get_ue_golomb
(
gb
);
if
(
dsh
->
interlaced
>
1
)
return
AVERROR_INVALIDDATA
;
/* [DIRAC_STD] 10.3.5 Frame Rate. frame_rate(video_params) */
if
(
get_bits1
(
gb
))
{
/* [DIRAC_STD] custom_frame_rate_flag */
source
->
frame_rate_index
=
svq3_get_ue_golomb
(
gb
);
dsh
->
frame_rate_index
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
frame_rate_index
>
10
)
if
(
dsh
->
frame_rate_index
>
10
)
return
AVERROR_INVALIDDATA
;
if
(
!
source
->
frame_rate_index
)
{
if
(
!
dsh
->
frame_rate_index
)
{
/* [DIRAC_STD] FRAME_RATE_NUMER */
frame_rate
.
num
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] FRAME_RATE_DENOM */
...
...
@@ -165,45 +188,45 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
}
}
/* [DIRAC_STD] preset_frame_rate(video_params, index) */
if
(
source
->
frame_rate_index
>
0
)
{
if
(
source
->
frame_rate_index
<=
8
)
frame_rate
=
ff_mpeg12_frame_rate_tab
[
source
->
frame_rate_index
];
if
(
dsh
->
frame_rate_index
>
0
)
{
if
(
dsh
->
frame_rate_index
<=
8
)
frame_rate
=
ff_mpeg12_frame_rate_tab
[
dsh
->
frame_rate_index
];
else
/* [DIRAC_STD] Table 10.3 values 9-10 */
frame_rate
=
dirac_frame_rate
[
source
->
frame_rate_index
-
9
];
frame_rate
=
dirac_frame_rate
[
dsh
->
frame_rate_index
-
9
];
}
avctx
->
framerate
=
frame_rate
;
dsh
->
framerate
=
frame_rate
;
/* [DIRAC_STD] 10.3.6 Pixel Aspect Ratio.
* pixel_aspect_ratio(video_params) */
if
(
get_bits1
(
gb
))
{
/* [DIRAC_STD] custom_pixel_aspect_ratio_flag */
/* [DIRAC_STD] index */
source
->
aspect_ratio_index
=
svq3_get_ue_golomb
(
gb
);
dsh
->
aspect_ratio_index
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
aspect_ratio_index
>
6
)
if
(
dsh
->
aspect_ratio_index
>
6
)
return
AVERROR_INVALIDDATA
;
if
(
!
source
->
aspect_ratio_index
)
{
avctx
->
sample_aspect_ratio
.
num
=
svq3_get_ue_golomb
(
gb
);
avctx
->
sample_aspect_ratio
.
den
=
svq3_get_ue_golomb
(
gb
);
if
(
!
dsh
->
aspect_ratio_index
)
{
dsh
->
sample_aspect_ratio
.
num
=
svq3_get_ue_golomb
(
gb
);
dsh
->
sample_aspect_ratio
.
den
=
svq3_get_ue_golomb
(
gb
);
}
}
/* [DIRAC_STD] Take value from Table 10.4 Available preset pixel
* aspect ratio values */
if
(
source
->
aspect_ratio_index
>
0
)
avctx
->
sample_aspect_ratio
=
dirac_preset_aspect_ratios
[
source
->
aspect_ratio_index
-
1
];
if
(
dsh
->
aspect_ratio_index
>
0
)
dsh
->
sample_aspect_ratio
=
dirac_preset_aspect_ratios
[
dsh
->
aspect_ratio_index
-
1
];
/* [DIRAC_STD] 10.3.7 Clean area. clean_area(video_params) */
if
(
get_bits1
(
gb
))
{
/* [DIRAC_STD] custom_clean_area_flag */
/* [DIRAC_STD] CLEAN_WIDTH */
source
->
clean_width
=
svq3_get_ue_golomb
(
gb
);
dsh
->
clean_width
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] CLEAN_HEIGHT */
source
->
clean_height
=
svq3_get_ue_golomb
(
gb
);
dsh
->
clean_height
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] CLEAN_LEFT_OFFSET */
source
->
clean_left_offset
=
svq3_get_ue_golomb
(
gb
);
dsh
->
clean_left_offset
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] CLEAN_RIGHT_OFFSET */
source
->
clean_right_offset
=
svq3_get_ue_golomb
(
gb
);
dsh
->
clean_right_offset
=
svq3_get_ue_golomb
(
gb
);
}
/* [DIRAC_STD] 10.3.8 Signal range. signal_range(video_params)
...
...
@@ -211,121 +234,160 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
* AVCOL_RANGE_MPEG/JPEG values */
if
(
get_bits1
(
gb
))
{
/* [DIRAC_STD] custom_signal_range_flag */
/* [DIRAC_STD] index */
source
->
pixel_range_index
=
svq3_get_ue_golomb
(
gb
);
dsh
->
pixel_range_index
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
pixel_range_index
>
4
)
if
(
dsh
->
pixel_range_index
>
4
)
return
AVERROR_INVALIDDATA
;
// This assumes either fullrange or MPEG levels only
if
(
!
source
->
pixel_range_index
)
{
if
(
!
dsh
->
pixel_range_index
)
{
luma_offset
=
svq3_get_ue_golomb
(
gb
);
luma_depth
=
av_log2
(
svq3_get_ue_golomb
(
gb
))
+
1
;
svq3_get_ue_golomb
(
gb
);
/* chroma offset */
svq3_get_ue_golomb
(
gb
);
/* chroma excursion */
avctx
->
color_range
=
luma_offset
?
AVCOL_RANGE_MPEG
:
AVCOL_RANGE_JPEG
;
dsh
->
color_range
=
luma_offset
?
AVCOL_RANGE_MPEG
:
AVCOL_RANGE_JPEG
;
}
}
/* [DIRAC_STD] Table 10.5
* Available signal range presets <--> pixel_range_presets */
if
(
source
->
pixel_range_index
>
0
)
{
idx
=
source
->
pixel_range_index
-
1
;
if
(
dsh
->
pixel_range_index
>
0
)
{
idx
=
dsh
->
pixel_range_index
-
1
;
luma_depth
=
pixel_range_presets
[
idx
].
bitdepth
;
avctx
->
color_range
=
pixel_range_presets
[
idx
].
color_range
;
dsh
->
color_range
=
pixel_range_presets
[
idx
].
color_range
;
}
if
(
luma_depth
>
8
)
av_log
(
av
ctx
,
AV_LOG_WARNING
,
"Bitdepth greater than 8"
);
if
(
luma_depth
>
8
&&
log_ctx
)
av_log
(
log_
ctx
,
AV_LOG_WARNING
,
"Bitdepth greater than 8"
);
avctx
->
pix_fmt
=
dirac_pix_fmt
[
!
luma_offset
][
source
->
chroma_format
];
dsh
->
pix_fmt
=
dirac_pix_fmt
[
!
luma_offset
][
dsh
->
chroma_format
];
/* [DIRAC_STD] 10.3.9 Colour specification. colour_spec(video_params) */
if
(
get_bits1
(
gb
))
{
/* [DIRAC_STD] custom_colour_spec_flag */
/* [DIRAC_STD] index */
idx
=
source
->
color_spec_index
=
svq3_get_ue_golomb
(
gb
);
idx
=
dsh
->
color_spec_index
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
color_spec_index
>
4
)
if
(
dsh
->
color_spec_index
>
4
)
return
AVERROR_INVALIDDATA
;
avctx
->
color_primaries
=
dirac_color_presets
[
idx
].
color_primaries
;
avctx
->
colorspace
=
dirac_color_presets
[
idx
].
colorspace
;
avctx
->
color_trc
=
dirac_color_presets
[
idx
].
color_trc
;
dsh
->
color_primaries
=
dirac_color_presets
[
idx
].
color_primaries
;
dsh
->
colorspace
=
dirac_color_presets
[
idx
].
colorspace
;
dsh
->
color_trc
=
dirac_color_presets
[
idx
].
color_trc
;
if
(
!
source
->
color_spec_index
)
{
if
(
!
dsh
->
color_spec_index
)
{
/* [DIRAC_STD] 10.3.9.1 Colour primaries */
if
(
get_bits1
(
gb
))
{
idx
=
svq3_get_ue_golomb
(
gb
);
if
(
idx
<
3
)
avctx
->
color_primaries
=
dirac_primaries
[
idx
];
dsh
->
color_primaries
=
dirac_primaries
[
idx
];
}
/* [DIRAC_STD] 10.3.9.2 Colour matrix */
if
(
get_bits1
(
gb
))
{
idx
=
svq3_get_ue_golomb
(
gb
);
if
(
!
idx
)
avctx
->
colorspace
=
AVCOL_SPC_BT709
;
dsh
->
colorspace
=
AVCOL_SPC_BT709
;
else
if
(
idx
==
1
)
avctx
->
colorspace
=
AVCOL_SPC_BT470BG
;
dsh
->
colorspace
=
AVCOL_SPC_BT470BG
;
}
/* [DIRAC_STD] 10.3.9.3 Transfer function */
if
(
get_bits1
(
gb
)
&&
!
svq3_get_ue_golomb
(
gb
))
avctx
->
color_trc
=
AVCOL_TRC_BT709
;
dsh
->
color_trc
=
AVCOL_TRC_BT709
;
}
}
else
{
idx
=
source
->
color_spec_index
;
avctx
->
color_primaries
=
dirac_color_presets
[
idx
].
color_primaries
;
avctx
->
colorspace
=
dirac_color_presets
[
idx
].
colorspace
;
avctx
->
color_trc
=
dirac_color_presets
[
idx
].
color_trc
;
idx
=
dsh
->
color_spec_index
;
dsh
->
color_primaries
=
dirac_color_presets
[
idx
].
color_primaries
;
dsh
->
colorspace
=
dirac_color_presets
[
idx
].
colorspace
;
dsh
->
color_trc
=
dirac_color_presets
[
idx
].
color_trc
;
}
return
0
;
}
/* [DIRAC_STD] 10. Sequence Header. sequence_header() */
int
avpriv_dirac_parse_sequence_header
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
dirac_source_params
*
source
)
int
av_dirac_parse_sequence_header
(
AVDiracSeqHeader
**
pdsh
,
const
uint8_t
*
buf
,
size_t
buf_size
,
void
*
log_ctx
)
{
AVDiracSeqHeader
*
dsh
;
GetBitContext
gb
;
unsigned
version_major
;
unsigned
video_format
,
picture_coding_mode
;
int
ret
;
dsh
=
av_mallocz
(
sizeof
(
*
dsh
));
if
(
!
dsh
)
return
AVERROR
(
ENOMEM
);
ret
=
init_get_bits8
(
&
gb
,
buf
,
buf_size
);
if
(
ret
<
0
)
goto
fail
;
/* [DIRAC_SPEC] 10.1 Parse Parameters. parse_parameters() */
version_major
=
svq3_get_ue_golomb
(
gb
);
svq3_get_ue_golomb
(
gb
);
/* version_minor */
avctx
->
profile
=
svq3_get_ue_golomb
(
gb
);
avctx
->
level
=
svq3_get_ue_golomb
(
gb
);
version_major
=
svq3_get_ue_golomb
(
&
gb
);
svq3_get_ue_golomb
(
&
gb
);
/* version_minor */
dsh
->
profile
=
svq3_get_ue_golomb
(
&
gb
);
dsh
->
level
=
svq3_get_ue_golomb
(
&
gb
);
/* [DIRAC_SPEC] sequence_header() -> base_video_format as defined in
* 10.2 Base Video Format, table 10.1 Dirac predefined video formats */
video_format
=
svq3_get_ue_golomb
(
gb
);
video_format
=
svq3_get_ue_golomb
(
&
gb
);
if
(
version_major
<
2
)
av_log
(
avctx
,
AV_LOG_WARNING
,
"Stream is old and may not work
\n
"
);
else
if
(
version_major
>
2
)
av_log
(
avctx
,
AV_LOG_WARNING
,
"Stream may have unhandled features
\n
"
);
if
(
log_ctx
)
{
if
(
version_major
<
2
)
av_log
(
log_ctx
,
AV_LOG_WARNING
,
"Stream is old and may not work
\n
"
);
else
if
(
version_major
>
2
)
av_log
(
log_ctx
,
AV_LOG_WARNING
,
"Stream may have unhandled features
\n
"
);
}
if
(
video_format
>
20
)
return
AVERROR_INVALIDDATA
;
if
(
video_format
>
20
)
{
ret
=
AVERROR_INVALIDDATA
;
goto
fail
;
}
// Fill in defaults for the source parameters.
*
source
=
dirac_source_parameters_defaults
[
video_format
];
dsh
->
width
=
dirac_source_parameters_defaults
[
video_format
].
width
;
dsh
->
height
=
dirac_source_parameters_defaults
[
video_format
].
height
;
dsh
->
chroma_format
=
dirac_source_parameters_defaults
[
video_format
].
chroma_format
;
dsh
->
interlaced
=
dirac_source_parameters_defaults
[
video_format
].
interlaced
;
dsh
->
top_field_first
=
dirac_source_parameters_defaults
[
video_format
].
top_field_first
;
dsh
->
frame_rate_index
=
dirac_source_parameters_defaults
[
video_format
].
frame_rate_index
;
dsh
->
aspect_ratio_index
=
dirac_source_parameters_defaults
[
video_format
].
aspect_ratio_index
;
dsh
->
clean_width
=
dirac_source_parameters_defaults
[
video_format
].
clean_width
;
dsh
->
clean_height
=
dirac_source_parameters_defaults
[
video_format
].
clean_height
;
dsh
->
clean_left_offset
=
dirac_source_parameters_defaults
[
video_format
].
clean_left_offset
;
dsh
->
clean_right_offset
=
dirac_source_parameters_defaults
[
video_format
].
clean_right_offset
;
dsh
->
pixel_range_index
=
dirac_source_parameters_defaults
[
video_format
].
pixel_range_index
;
dsh
->
color_spec_index
=
dirac_source_parameters_defaults
[
video_format
].
color_spec_index
;
/* [DIRAC_STD] 10.3 Source Parameters
* Override the defaults. */
if
(
ret
=
parse_source_parameters
(
avctx
,
gb
,
source
))
return
ret
;
ret
=
ff_set_dimensions
(
avctx
,
source
->
width
,
source
->
height
);
ret
=
parse_source_parameters
(
dsh
,
&
gb
,
log_ctx
);
if
(
ret
<
0
)
return
ret
;
ff_set_sar
(
avctx
,
avctx
->
sample_aspect_ratio
);
goto
fail
;
/* [DIRAC_STD] picture_coding_mode shall be 0 for fields and 1 for frames
* currently only used to signal field coding */
picture_coding_mode
=
svq3_get_ue_golomb
(
gb
);
picture_coding_mode
=
svq3_get_ue_golomb
(
&
gb
);
if
(
picture_coding_mode
!=
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unsupported picture coding mode %d"
,
picture_coding_mode
);
return
AVERROR_INVALIDDATA
;
if
(
log_ctx
)
{
av_log
(
log_ctx
,
AV_LOG_ERROR
,
"Unsupported picture coding mode %d"
,
picture_coding_mode
);
}
ret
=
AVERROR_INVALIDDATA
;
goto
fail
;
}
*
pdsh
=
dsh
;
return
0
;
fail:
av_freep
(
&
dsh
);
*
pdsh
=
NULL
;
return
ret
;
}
#else
int
av_dirac_parse_sequence_header
(
AVDiracSeqHeader
**
pdsh
,
const
uint8_t
*
buf
,
size_t
buf_size
,
void
*
log_ctx
)
{
return
AVERROR
(
ENOSYS
);
}
#endif
libavcodec/dirac.h
浏览文件 @
e02de9df
...
...
@@ -29,9 +29,8 @@
*/
#include "avcodec.h"
#include "get_bits.h"
typedef
struct
dirac_source_params
{
typedef
struct
AVDiracSeqHeader
{
unsigned
width
;
unsigned
height
;
uint8_t
chroma_format
;
///< 0: 444 1: 422 2: 420
...
...
@@ -49,9 +48,33 @@ typedef struct dirac_source_params {
uint8_t
pixel_range_index
;
///< index into dirac_pixel_range_presets[]
uint8_t
color_spec_index
;
///< index into dirac_color_spec_presets[]
}
dirac_source_params
;
int
avpriv_dirac_parse_sequence_header
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
dirac_source_params
*
source
);
int
profile
;
int
level
;
AVRational
framerate
;
AVRational
sample_aspect_ratio
;
enum
AVPixelFormat
pix_fmt
;
enum
AVColorRange
color_range
;
enum
AVColorPrimaries
color_primaries
;
enum
AVColorTransferCharacteristic
color_trc
;
enum
AVColorSpace
colorspace
;
}
AVDiracSeqHeader
;
/**
* Parse a Dirac sequence header.
*
* @param dsh this function will allocate and fill an AVDiracSeqHeader struct
* and write it into this pointer. The caller must free it with
* av_free().
* @param buf the data buffer
* @param buf_size the size of the data buffer in bytes
* @param log_ctx if non-NULL, this function will log errors here
* @return 0 on success, a negative AVERROR code on failure
*/
int
av_dirac_parse_sequence_header
(
AVDiracSeqHeader
**
dsh
,
const
uint8_t
*
buf
,
size_t
buf_size
,
void
*
log_ctx
);
#endif
/* AVCODEC_DIRAC_H */
libavformat/oggparsedirac.c
浏览文件 @
e02de9df
...
...
@@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libav
codec/get_bits
.h"
#include "libav
util/intreadwrite
.h"
#include "libavcodec/dirac.h"
#include "avformat.h"
#include "internal.h"
...
...
@@ -29,21 +29,34 @@ static int dirac_header(AVFormatContext *s, int idx)
struct
ogg
*
ogg
=
s
->
priv_data
;
struct
ogg_stream
*
os
=
ogg
->
streams
+
idx
;
AVStream
*
st
=
s
->
streams
[
idx
];
dirac_source_params
source
;
GetBitContext
gb
;
AVDiracSeqHeader
*
dsh
;
int
ret
;
// already parsed the header
if
(
st
->
codec
->
codec_id
==
AV_CODEC_ID_DIRAC
)
return
0
;
init_get_bits
(
&
gb
,
os
->
buf
+
os
->
pstart
+
13
,
(
os
->
psize
-
13
)
*
8
);
if
(
avpriv_dirac_parse_sequence_header
(
st
->
codec
,
&
gb
,
&
source
)
<
0
)
return
-
1
;
ret
=
av_dirac_parse_sequence_header
(
&
dsh
,
os
->
buf
+
os
->
pstart
+
13
,
(
os
->
psize
-
13
)
*
8
,
s
);
if
(
ret
<
0
)
return
ret
;
st
->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
st
->
codec
->
codec_id
=
AV_CODEC_ID_DIRAC
;
st
->
codec
->
width
=
dsh
->
width
;
st
->
codec
->
height
=
dsh
->
height
;
st
->
codec
->
pix_fmt
=
dsh
->
pix_fmt
;
st
->
codec
->
color_range
=
dsh
->
color_range
;
st
->
codec
->
color_trc
=
dsh
->
color_trc
;
st
->
codec
->
color_primaries
=
dsh
->
color_primaries
;
st
->
codec
->
colorspace
=
dsh
->
colorspace
;
st
->
codec
->
profile
=
dsh
->
profile
;
st
->
codec
->
level
=
dsh
->
level
;
st
->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
st
->
codec
->
codec_id
=
AV_CODEC_ID_DIRAC
;
// dirac in ogg always stores timestamps as though the video were interlaced
avpriv_set_pts_info
(
st
,
64
,
st
->
codec
->
time_base
.
num
,
2
*
st
->
codec
->
time_base
.
den
);
avpriv_set_pts_info
(
st
,
64
,
dsh
->
framerate
.
den
,
2
*
dsh
->
framerate
.
num
);
av_freep
(
&
dsh
);
return
1
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录