dirac: add Comments and references to the standard
Signed-off-by: Diego Biurrun <diego@biurrun.de>
This commit is contained in:
		
							parent
							
								
									06e751a40f
								
							
						
					
					
						commit
						43da682c87
					
				| @ -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 }, | ||||
| }; | ||||
| 
 | ||||
| /* [DIRAC_STD] Table 10.4 - Available preset pixel aspect ratio values */ | ||||
| static const AVRational dirac_preset_aspect_ratios[] = { | ||||
|     {1, 1}, | ||||
|     {10, 11}, | ||||
| @ -67,11 +68,16 @@ static const AVRational dirac_preset_aspect_ratios[] = { | ||||
|     {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[] = { | ||||
|     {15000, 1001}, | ||||
|     {25, 2}, | ||||
| }; | ||||
| 
 | ||||
| /* [DIRAC_STD] This should be equivalent to Table 10.5 Available signal
 | ||||
|  * range presets */ | ||||
| static const struct { | ||||
|     uint8_t             bitdepth; | ||||
|     enum AVColorRange   color_range; | ||||
| @ -100,11 +106,14 @@ static const struct { | ||||
|     { 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] = { | ||||
|     { PIX_FMT_YUV444P,  PIX_FMT_YUV422P,  PIX_FMT_YUV420P  }, | ||||
|     { 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, | ||||
|                                    dirac_source_params *source) | ||||
| { | ||||
| @ -112,13 +121,18 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb, | ||||
|     unsigned luma_depth = 8, luma_offset = 16; | ||||
|     int idx; | ||||
| 
 | ||||
|     /* [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); | ||||
|         source->height = svq3_get_ue_golomb(gb); | ||||
|         source->width  = svq3_get_ue_golomb(gb); /* [DIRAC_STD] FRAME_WIDTH  */ | ||||
|         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)) | ||||
|         /* [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", | ||||
| @ -126,34 +140,43 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb, | ||||
|         return AVERROR_INVALIDDATA; | ||||
|     } | ||||
| 
 | ||||
|     /* [DIRAC_STD] 10.3.4 Scan Format. scan_format(video_params) */ | ||||
|     /* [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) | ||||
|         return AVERROR_INVALIDDATA; | ||||
| 
 | ||||
|     // frame rate
 | ||||
|     if (get_bits1(gb)) { | ||||
|     /* [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); | ||||
| 
 | ||||
|         if (source->frame_rate_index > 10) | ||||
|             return AVERROR_INVALIDDATA; | ||||
| 
 | ||||
|         if (!source->frame_rate_index) { | ||||
|             /* [DIRAC_STD] FRAME_RATE_NUMER */ | ||||
|             frame_rate.num = svq3_get_ue_golomb(gb); | ||||
|             /* [DIRAC_STD] FRAME_RATE_DENOM */ | ||||
|             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 <= 8) | ||||
|             frame_rate = avpriv_frame_rate_tab[source->frame_rate_index]; | ||||
|         else | ||||
|              /* [DIRAC_STD] Table 10.3 values 9-10 */ | ||||
|             frame_rate = dirac_frame_rate[source->frame_rate_index-9]; | ||||
|     } | ||||
|     av_reduce(&avctx->time_base.num, &avctx->time_base.den, | ||||
|               frame_rate.den, frame_rate.num, 1<<30); | ||||
| 
 | ||||
|     // aspect ratio
 | ||||
|     if (get_bits1(gb)) { | ||||
|     /* [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); | ||||
| 
 | ||||
|         if (source->aspect_ratio_index > 6) | ||||
| @ -164,19 +187,29 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *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) | ||||
|         avctx->sample_aspect_ratio = | ||||
|                 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); | ||||
|          /* [DIRAC_STD] CLEAN_HEIGHT */ | ||||
|         source->clean_height       = svq3_get_ue_golomb(gb); | ||||
|          /* [DIRAC_STD] CLEAN_LEFT_OFFSET */ | ||||
|         source->clean_left_offset  = svq3_get_ue_golomb(gb); | ||||
|         /* [DIRAC_STD] CLEAN_RIGHT_OFFSET */ | ||||
|         source->clean_right_offset = svq3_get_ue_golomb(gb); | ||||
|     } | ||||
| 
 | ||||
|     // Override signal range.
 | ||||
|     if (get_bits1(gb)) { | ||||
|     /* [DIRAC_STD] 10.3.8 Signal range. signal_range(video_params)
 | ||||
|      * 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); | ||||
| 
 | ||||
|         if (source->pixel_range_index > 4) | ||||
| @ -186,12 +219,13 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb, | ||||
|         if (!source->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
 | ||||
| 
 | ||||
|             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; | ||||
|         } | ||||
|     } | ||||
|     /* [DIRAC_STD] Table 10.5
 | ||||
|      * Available signal range presets <--> pixel_range_presets */ | ||||
|     if (source->pixel_range_index > 0) { | ||||
|         idx                = source->pixel_range_index-1; | ||||
|         luma_depth         = pixel_range_presets[idx].bitdepth; | ||||
| @ -203,8 +237,9 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb, | ||||
| 
 | ||||
|     avctx->pix_fmt = dirac_pix_fmt[!luma_offset][source->chroma_format]; | ||||
| 
 | ||||
|     // color spec
 | ||||
|     if (get_bits1(gb)) { | ||||
|     /* [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); | ||||
| 
 | ||||
|         if (source->color_spec_index > 4) | ||||
| @ -215,12 +250,13 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb, | ||||
|         avctx->color_trc       = dirac_color_presets[idx].color_trc; | ||||
| 
 | ||||
|         if (!source->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]; | ||||
|             } | ||||
| 
 | ||||
|             /* [DIRAC_STD] 10.3.9.2 Colour matrix */ | ||||
|             if (get_bits1(gb)) { | ||||
|                 idx = svq3_get_ue_golomb(gb); | ||||
|                 if (!idx) | ||||
| @ -228,7 +264,7 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb, | ||||
|                 else if (idx == 1) | ||||
|                     avctx->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; | ||||
|         } | ||||
| @ -242,6 +278,7 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb, | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| /* [DIRAC_STD] 10. Sequence Header. sequence_header() */ | ||||
| int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb, | ||||
|                                    dirac_source_params *source) | ||||
| { | ||||
| @ -249,10 +286,13 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb, | ||||
|     unsigned video_format, picture_coding_mode; | ||||
|     int ret; | ||||
| 
 | ||||
|     /* [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); | ||||
|     /* [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); | ||||
| 
 | ||||
|     if (version_major < 2) | ||||
| @ -266,7 +306,8 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb, | ||||
|     // Fill in defaults for the source parameters.
 | ||||
|     *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)) | ||||
|         return ret; | ||||
| 
 | ||||
| @ -275,7 +316,8 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb, | ||||
| 
 | ||||
|     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); | ||||
|     if (picture_coding_mode != 0) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "Unsupported picture coding mode %d", | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user