Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
43da682c
Commit
43da682c
authored
Aug 22, 2012
by
Jordi Ortiz
Committed by
Diego Biurrun
Aug 24, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dirac: add Comments and references to the standard
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
06e751a4
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
61 additions
and
19 deletions
+61
-19
dirac.c
libavcodec/dirac.c
+61
-19
No files found.
libavcodec/dirac.c
View file @
43da682c
...
@@ -58,6 +58,7 @@ static const dirac_source_params dirac_source_parameters_defaults[] = {
...
@@ -58,6 +58,7 @@ static const dirac_source_params dirac_source_parameters_defaults[] = {
{
7680
,
4320
,
1
,
0
,
1
,
6
,
1
,
3840
,
2160
,
0
,
0
,
3
,
3
},
{
7680
,
4320
,
1
,
0
,
1
,
6
,
1
,
3840
,
2160
,
0
,
0
,
3
,
3
},
};
};
/* [DIRAC_STD] Table 10.4 - Available preset pixel aspect ratio values */
static
const
AVRational
dirac_preset_aspect_ratios
[]
=
{
static
const
AVRational
dirac_preset_aspect_ratios
[]
=
{
{
1
,
1
},
{
1
,
1
},
{
10
,
11
},
{
10
,
11
},
...
@@ -67,11 +68,16 @@ static const AVRational dirac_preset_aspect_ratios[] = {
...
@@ -67,11 +68,16 @@ static const AVRational dirac_preset_aspect_ratios[] = {
{
4
,
3
},
{
4
,
3
},
};
};
/* [DIRAC_STD] Values 9,10 of 10.3.5 Frame Rate.
* Table 10.3 Available preset frame rate values
*/
static
const
AVRational
dirac_frame_rate
[]
=
{
static
const
AVRational
dirac_frame_rate
[]
=
{
{
15000
,
1001
},
{
15000
,
1001
},
{
25
,
2
},
{
25
,
2
},
};
};
/* [DIRAC_STD] This should be equivalent to Table 10.5 Available signal
* range presets */
static
const
struct
{
static
const
struct
{
uint8_t
bitdepth
;
uint8_t
bitdepth
;
enum
AVColorRange
color_range
;
enum
AVColorRange
color_range
;
...
@@ -100,11 +106,14 @@ static const struct {
...
@@ -100,11 +106,14 @@ static const struct {
{
AVCOL_PRI_BT709
,
AVCOL_SPC_BT709
,
AVCOL_TRC_UNSPECIFIED
/* DCinema */
},
{
AVCOL_PRI_BT709
,
AVCOL_SPC_BT709
,
AVCOL_TRC_UNSPECIFIED
/* DCinema */
},
};
};
/* [DIRAC_STD] Table 10.2 Supported chroma sampling formats + luma Offset */
static
const
enum
PixelFormat
dirac_pix_fmt
[
2
][
3
]
=
{
static
const
enum
PixelFormat
dirac_pix_fmt
[
2
][
3
]
=
{
{
PIX_FMT_YUV444P
,
PIX_FMT_YUV422P
,
PIX_FMT_YUV420P
},
{
PIX_FMT_YUV444P
,
PIX_FMT_YUV422P
,
PIX_FMT_YUV420P
},
{
PIX_FMT_YUVJ444P
,
PIX_FMT_YUVJ422P
,
PIX_FMT_YUVJ420P
},
{
PIX_FMT_YUVJ444P
,
PIX_FMT_YUVJ422P
,
PIX_FMT_YUVJ420P
},
};
};
/* [DIRAC_STD] 10.3 Parse Source Parameters.
* source_parameters(base_video_format) */
static
int
parse_source_parameters
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
static
int
parse_source_parameters
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
dirac_source_params
*
source
)
dirac_source_params
*
source
)
{
{
...
@@ -112,13 +121,18 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -112,13 +121,18 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
unsigned
luma_depth
=
8
,
luma_offset
=
16
;
unsigned
luma_depth
=
8
,
luma_offset
=
16
;
int
idx
;
int
idx
;
/* [DIRAC_STD] 10.3.2 Frame size. frame_size(video_params) */
/* [DIRAC_STD] custom_dimensions_flag */
if
(
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
{
source
->
width
=
svq3_get_ue_golomb
(
gb
);
source
->
width
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] FRAME_WIDTH */
source
->
height
=
svq3_get_ue_golomb
(
gb
);
source
->
height
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] FRAME_HEIGHT */
}
}
// chroma subsampling
/* [DIRAC_STD] 10.3.3 Chroma Sampling Format.
* chroma_sampling_format(video_params) */
/* [DIRAC_STD] custom_chroma_format_flag */
if
(
get_bits1
(
gb
))
if
(
get_bits1
(
gb
))
/* [DIRAC_STD] CHROMA_FORMAT_INDEX */
source
->
chroma_format
=
svq3_get_ue_golomb
(
gb
);
source
->
chroma_format
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
chroma_format
>
2
)
{
if
(
source
->
chroma_format
>
2
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unknown chroma format %d
\n
"
,
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unknown chroma format %d
\n
"
,
...
@@ -126,34 +140,43 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -126,34 +140,43 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
/* [DIRAC_STD] 10.3.4 Scan Format. scan_format(video_params) */
/* [DIRAC_STD] custom_scan_format_flag */
if
(
get_bits1
(
gb
))
if
(
get_bits1
(
gb
))
/* [DIRAC_STD] SOURCE_SAMPLING */
source
->
interlaced
=
svq3_get_ue_golomb
(
gb
);
source
->
interlaced
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
interlaced
>
1
)
if
(
source
->
interlaced
>
1
)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
/
/ frame rate
/
* [DIRAC_STD] 10.3.5 Frame Rate. frame_rate(video_params) */
if
(
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
{
/* [DIRAC_STD] custom_frame_rate_flag */
source
->
frame_rate_index
=
svq3_get_ue_golomb
(
gb
);
source
->
frame_rate_index
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
frame_rate_index
>
10
)
if
(
source
->
frame_rate_index
>
10
)
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
if
(
!
source
->
frame_rate_index
)
{
if
(
!
source
->
frame_rate_index
)
{
/* [DIRAC_STD] FRAME_RATE_NUMER */
frame_rate
.
num
=
svq3_get_ue_golomb
(
gb
);
frame_rate
.
num
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] FRAME_RATE_DENOM */
frame_rate
.
den
=
svq3_get_ue_golomb
(
gb
);
frame_rate
.
den
=
svq3_get_ue_golomb
(
gb
);
}
}
}
}
/* [DIRAC_STD] preset_frame_rate(video_params, index) */
if
(
source
->
frame_rate_index
>
0
)
{
if
(
source
->
frame_rate_index
>
0
)
{
if
(
source
->
frame_rate_index
<=
8
)
if
(
source
->
frame_rate_index
<=
8
)
frame_rate
=
avpriv_frame_rate_tab
[
source
->
frame_rate_index
];
frame_rate
=
avpriv_frame_rate_tab
[
source
->
frame_rate_index
];
else
else
/* [DIRAC_STD] Table 10.3 values 9-10 */
frame_rate
=
dirac_frame_rate
[
source
->
frame_rate_index
-
9
];
frame_rate
=
dirac_frame_rate
[
source
->
frame_rate_index
-
9
];
}
}
av_reduce
(
&
avctx
->
time_base
.
num
,
&
avctx
->
time_base
.
den
,
av_reduce
(
&
avctx
->
time_base
.
num
,
&
avctx
->
time_base
.
den
,
frame_rate
.
den
,
frame_rate
.
num
,
1
<<
30
);
frame_rate
.
den
,
frame_rate
.
num
,
1
<<
30
);
// aspect ratio
/* [DIRAC_STD] 10.3.6 Pixel Aspect Ratio.
if
(
get_bits1
(
gb
))
{
* 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
);
source
->
aspect_ratio_index
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
aspect_ratio_index
>
6
)
if
(
source
->
aspect_ratio_index
>
6
)
...
@@ -164,19 +187,29 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -164,19 +187,29 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
avctx
->
sample_aspect_ratio
.
den
=
svq3_get_ue_golomb
(
gb
);
avctx
->
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
)
if
(
source
->
aspect_ratio_index
>
0
)
avctx
->
sample_aspect_ratio
=
avctx
->
sample_aspect_ratio
=
dirac_preset_aspect_ratios
[
source
->
aspect_ratio_index
-
1
];
dirac_preset_aspect_ratios
[
source
->
aspect_ratio_index
-
1
];
if
(
get_bits1
(
gb
))
{
/* [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
);
source
->
clean_width
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] CLEAN_HEIGHT */
source
->
clean_height
=
svq3_get_ue_golomb
(
gb
);
source
->
clean_height
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] CLEAN_LEFT_OFFSET */
source
->
clean_left_offset
=
svq3_get_ue_golomb
(
gb
);
source
->
clean_left_offset
=
svq3_get_ue_golomb
(
gb
);
/* [DIRAC_STD] CLEAN_RIGHT_OFFSET */
source
->
clean_right_offset
=
svq3_get_ue_golomb
(
gb
);
source
->
clean_right_offset
=
svq3_get_ue_golomb
(
gb
);
}
}
// Override signal range.
/* [DIRAC_STD] 10.3.8 Signal range. signal_range(video_params)
if
(
get_bits1
(
gb
))
{
* WARNING: Some adaptation seems to be done using the
* 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
);
source
->
pixel_range_index
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
pixel_range_index
>
4
)
if
(
source
->
pixel_range_index
>
4
)
...
@@ -186,12 +219,13 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -186,12 +219,13 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
if
(
!
source
->
pixel_range_index
)
{
if
(
!
source
->
pixel_range_index
)
{
luma_offset
=
svq3_get_ue_golomb
(
gb
);
luma_offset
=
svq3_get_ue_golomb
(
gb
);
luma_depth
=
av_log2
(
svq3_get_ue_golomb
(
gb
))
+
1
;
luma_depth
=
av_log2
(
svq3_get_ue_golomb
(
gb
))
+
1
;
svq3_get_ue_golomb
(
gb
);
// chroma offset
svq3_get_ue_golomb
(
gb
);
/* chroma offset */
svq3_get_ue_golomb
(
gb
);
// chroma excursion
svq3_get_ue_golomb
(
gb
);
/* chroma excursion */
avctx
->
color_range
=
luma_offset
?
AVCOL_RANGE_MPEG
:
AVCOL_RANGE_JPEG
;
avctx
->
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
)
{
if
(
source
->
pixel_range_index
>
0
)
{
idx
=
source
->
pixel_range_index
-
1
;
idx
=
source
->
pixel_range_index
-
1
;
luma_depth
=
pixel_range_presets
[
idx
].
bitdepth
;
luma_depth
=
pixel_range_presets
[
idx
].
bitdepth
;
...
@@ -203,8 +237,9 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -203,8 +237,9 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
avctx
->
pix_fmt
=
dirac_pix_fmt
[
!
luma_offset
][
source
->
chroma_format
];
avctx
->
pix_fmt
=
dirac_pix_fmt
[
!
luma_offset
][
source
->
chroma_format
];
// color spec
/* [DIRAC_STD] 10.3.9 Colour specification. colour_spec(video_params) */
if
(
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
{
/* [DIRAC_STD] custom_colour_spec_flag */
/* [DIRAC_STD] index */
idx
=
source
->
color_spec_index
=
svq3_get_ue_golomb
(
gb
);
idx
=
source
->
color_spec_index
=
svq3_get_ue_golomb
(
gb
);
if
(
source
->
color_spec_index
>
4
)
if
(
source
->
color_spec_index
>
4
)
...
@@ -215,12 +250,13 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -215,12 +250,13 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
avctx
->
color_trc
=
dirac_color_presets
[
idx
].
color_trc
;
avctx
->
color_trc
=
dirac_color_presets
[
idx
].
color_trc
;
if
(
!
source
->
color_spec_index
)
{
if
(
!
source
->
color_spec_index
)
{
/* [DIRAC_STD] 10.3.9.1 Colour primaries */
if
(
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
{
idx
=
svq3_get_ue_golomb
(
gb
);
idx
=
svq3_get_ue_golomb
(
gb
);
if
(
idx
<
3
)
if
(
idx
<
3
)
avctx
->
color_primaries
=
dirac_primaries
[
idx
];
avctx
->
color_primaries
=
dirac_primaries
[
idx
];
}
}
/* [DIRAC_STD] 10.3.9.2 Colour matrix */
if
(
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
{
idx
=
svq3_get_ue_golomb
(
gb
);
idx
=
svq3_get_ue_golomb
(
gb
);
if
(
!
idx
)
if
(
!
idx
)
...
@@ -228,7 +264,7 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -228,7 +264,7 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
else
if
(
idx
==
1
)
else
if
(
idx
==
1
)
avctx
->
colorspace
=
AVCOL_SPC_BT470BG
;
avctx
->
colorspace
=
AVCOL_SPC_BT470BG
;
}
}
/* [DIRAC_STD] 10.3.9.3 Transfer function */
if
(
get_bits1
(
gb
)
&&
!
svq3_get_ue_golomb
(
gb
))
if
(
get_bits1
(
gb
)
&&
!
svq3_get_ue_golomb
(
gb
))
avctx
->
color_trc
=
AVCOL_TRC_BT709
;
avctx
->
color_trc
=
AVCOL_TRC_BT709
;
}
}
...
@@ -242,6 +278,7 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -242,6 +278,7 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
return
0
;
return
0
;
}
}
/* [DIRAC_STD] 10. Sequence Header. sequence_header() */
int
avpriv_dirac_parse_sequence_header
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
int
avpriv_dirac_parse_sequence_header
(
AVCodecContext
*
avctx
,
GetBitContext
*
gb
,
dirac_source_params
*
source
)
dirac_source_params
*
source
)
{
{
...
@@ -249,10 +286,13 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -249,10 +286,13 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
unsigned
video_format
,
picture_coding_mode
;
unsigned
video_format
,
picture_coding_mode
;
int
ret
;
int
ret
;
/* [DIRAC_SPEC] 10.1 Parse Parameters. parse_parameters() */
version_major
=
svq3_get_ue_golomb
(
gb
);
version_major
=
svq3_get_ue_golomb
(
gb
);
svq3_get_ue_golomb
(
gb
);
/* version_minor */
svq3_get_ue_golomb
(
gb
);
/* version_minor */
avctx
->
profile
=
svq3_get_ue_golomb
(
gb
);
avctx
->
profile
=
svq3_get_ue_golomb
(
gb
);
avctx
->
level
=
svq3_get_ue_golomb
(
gb
);
avctx
->
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
)
if
(
version_major
<
2
)
...
@@ -266,7 +306,8 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -266,7 +306,8 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
// Fill in defaults for the source parameters.
// Fill in defaults for the source parameters.
*
source
=
dirac_source_parameters_defaults
[
video_format
];
*
source
=
dirac_source_parameters_defaults
[
video_format
];
// Override the defaults.
/* [DIRAC_STD] 10.3 Source Parameters
* Override the defaults. */
if
(
ret
=
parse_source_parameters
(
avctx
,
gb
,
source
))
if
(
ret
=
parse_source_parameters
(
avctx
,
gb
,
source
))
return
ret
;
return
ret
;
...
@@ -275,7 +316,8 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
...
@@ -275,7 +316,8 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
avcodec_set_dimensions
(
avctx
,
source
->
width
,
source
->
height
);
avcodec_set_dimensions
(
avctx
,
source
->
width
,
source
->
height
);
// currently only used to signal field coding
/* [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
)
{
if
(
picture_coding_mode
!=
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unsupported picture coding mode %d"
,
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unsupported picture coding mode %d"
,
...
...
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