//--------------------------------------------------------------------------- void File_Dirac::picture_Fill() { Stream_Prepare(Stream_General); Fill(Stream_General, 0, General_Format, "Dirac"); Stream_Prepare(Stream_Video); Fill(Stream_Video, 0, Video_Format, "Dirac"); Fill(Stream_Video, 0, Video_Codec, "Dirac"); if (clean_width) Fill(Stream_Video, StreamPos_Last, Video_Width, clean_width); if (clean_height) Fill(Stream_Video, StreamPos_Last, Video_Height, clean_height); if (pixel_aspect_ratio) { Fill(Stream_Video, 0, Video_PixelAspectRatio, pixel_aspect_ratio); if (clean_height!=0) Fill(Stream_Video, StreamPos_Last, Video_DisplayAspectRatio, ((float)clean_width)/clean_height*pixel_aspect_ratio); } if (frame_rate) Fill(Stream_Video, StreamPos_Last, Video_FrameRate, frame_rate); Fill(Stream_Video, 0, Video_Colorimetry, Dirac_chroma_format(chroma_format)); Fill(Stream_Video, 0, Video_ScanType, Dirac_source_sampling(source_sampling)); Fill(Stream_Video, 0, Video_Interlacement, Dirac_source_sampling(source_sampling)); if (File_Offset+Buffer_Size<File_Size) { NextCode_Clear(); Accept("Dirac"); Finish("Dirac"); } }
//--------------------------------------------------------------------------- void File_Dirac::picture_Fill() { Stream_Prepare(Stream_General); Fill("Format", "Dirac"); Stream_Prepare(Stream_Video); Fill("Codec", "Dirac"); Fill("Width", clean_width); Fill("Height", clean_height); if (pixel_aspect_ratio) { Fill("PixelAspectRatio", pixel_aspect_ratio); if (clean_height!=0) Fill("DisplayAspectRatio", ((float)clean_width)/clean_height*pixel_aspect_ratio); } if (frame_rate) Fill("FrameRate", frame_rate); Fill("Chroma", Dirac_chroma_format(chroma_format)); Fill("Interlacement", Dirac_source_sampling(source_sampling)); if (File_Offset+Buffer_Size<File_Size) { NextCode_Clear(); Info("Dirac, Jumping to end of file"); Finnished(); } }
//--------------------------------------------------------------------------- // Packet "B0" void File_AvsV::video_sequence_start() { Element_Name("video_sequence_start"); //Parsing int32u bit_rate_upper, bit_rate_lower; Get_B1 ( profile_id, "profile_id"); Get_B1 ( level_id, "level_id"); BS_Begin(); Get_SB ( progressive_sequence, "progressive_sequence"); Get_S2 (14, horizontal_size, "horizontal_size"); Get_S2 (14, vertical_size, "vertical_size"); Get_S1 ( 2, chroma_format, "chroma_format"); Skip_S1( 3, "sample_precision"); Get_S1 ( 4, aspect_ratio, "aspect_ratio"); Param_Info(AvsV_aspect_ratio[aspect_ratio]); Get_S1 ( 4, frame_rate_code, "frame_rate_code"); Param_Info(AvsV_frame_rate[frame_rate_code]); Get_S3 (18, bit_rate_lower, "bit_rate_lower"); Mark_1 (); Get_S3 (12, bit_rate_upper, "bit_rate_upper"); bit_rate=(bit_rate_upper<<18)+bit_rate_lower; Param_Info(bit_rate*8, " bps"); Get_SB ( low_delay, "low_delay"); Mark_1 (); Skip_S3(18, "bbv_buffer_size"); Skip_SB( "reserved"); Skip_SB( "reserved"); Skip_SB( "reserved"); BS_End(); //Not sure, but the 3 first official files have this if (Element_Size-Element_Offset) { BS_Begin(); Mark_1(); BS_End(); } FILLING_BEGIN(); //NextCode NextCode_Clear(); NextCode_Add(0xB2); //user_data_start NextCode_Add(0xB3); //picture_start (I) NextCode_Add(0xB5); //extension_start //Autorisation of other streams Streams[0xB1].Searching_Payload=true, //video_sequence_end Streams[0xB2].Searching_Payload=true; //user_data_start Streams[0xB3].Searching_Payload=true, //picture_start (I) Streams[0xB4].Searching_Payload=true, //reserved Streams[0xB5].Searching_Payload=true; //extension_start Streams[0xB6].Searching_Payload=true, //picture_start (P or B) Streams[0xB7].Searching_Payload=true; //video_edit Streams[0xB8].Searching_Payload=true, //reserved video_sequence_start_IsParsed=true; FILLING_END(); }
//--------------------------------------------------------------------------- // Packet "B1" void File_AvsV::video_sequence_end() { Element_Name("video_sequence_start"); FILLING_BEGIN(); //NextCode NextCode_Clear(); NextCode_Add(0xB0); //SeqenceHeader FILLING_END(); }
//--------------------------------------------------------------------------- // Packet "10" void File_Dirac::End_of_Sequence() { Element_Name("End of Sequence"); //Parsing if (!Ignore_End_of_Sequence) { NextCode_Clear(); Accept("Dirac"); Finish("Dirac"); } }
//--------------------------------------------------------------------------- // Packet "0E" void File_Vc1::EntryPointHeader() { Element_Name("EntryPointHeader"); //Parsing bool extended_mv; BS_Begin(); Skip_SB( "broken_link"); Skip_SB( "closed_entry"); Get_SB ( panscan_flag, "panscan_flag"); Skip_SB( "refdist_flag"); Skip_SB( "loopfilter"); Skip_SB( "fastuvmc"); Get_SB ( extended_mv, "extended_mv"); Skip_S1( 2, "dquant"); Skip_SB( "vstransform"); Skip_SB( "overlap"); Skip_S1( 2, "quantizer"); if (hrd_param_flag) for (int8u Pos=0; Pos<hrd_num_leaky_buckets; Pos++) { Element_Begin("leaky_bucket"); Skip_S2( 8, "hrd_full"); Element_End(); } TEST_SB_SKIP( "coded_size_flag"); Info_S2(12, coded_width, "coded_width"); Param_Info((coded_width+1)*2, " pixels"); Info_S2(12, coded_height, "coded_height"); Param_Info((coded_height+1)*2, " pixels"); TEST_SB_END(); if (extended_mv) Skip_SB( "extended_dmv"); TEST_SB_SKIP( "luma_sampling"); Skip_S1( 3, "y_range"); TEST_SB_END(); TEST_SB_SKIP( "chroma_sampling"); Skip_S1( 3, "uv_range"); TEST_SB_END(); BS_End(); FILLING_BEGIN(); //NextCode NextCode_Test(); NextCode_Clear(); NextCode_Add(0x0D); //Autorisation of other streams Streams[0x0D].Searching_Payload=true; EntryPoint_Parsed=true; FILLING_END(); }
//--------------------------------------------------------------------------- void File_Dirac::picture() { //Parsing Skip_XX(Element_Size, "Data"); FILLING_BEGIN(); //Counting if (File_Offset+Buffer_Offset+Element_Size==File_Size) Frame_Count_Valid=Frame_Count; //Finalize frames in case of there are less than Frame_Count_Valid frames //Name Element_Info1(Ztring::ToZtring(Frame_Count)); //Filling only if not already done Frame_Count++; Frame_Count_InThisBlock++; if (Frame_Count>=Frame_Count_Valid && Count_Get(Stream_Video)==0) { NextCode_Clear(); Accept("Dirac"); Finish("Dirac"); } FILLING_END(); }
//--------------------------------------------------------------------------- // Packet "B3" or "B6" void File_AvsV::picture_start() { //Counting if (File_Offset+Buffer_Offset+Element_Size==File_Size) Frame_Count_Valid=Frame_Count; //Finalize frames in case of there are less than Frame_Count_Valid frames Frame_Count++; //Name Element_Name("picture_start"); Element_Info(Ztring::ToZtring(Frame_Count)); if (Element_Code==0xB3) Element_Info(_T("I")); //Parsing int8u picture_coding_type=(int8u)-1; bool time_code_flag, progressive_frame, picture_structure=true, top_field_first, repeat_first_field, skip_mode_flag=false, loop_filter_disable; Skip_B2( "bbv_delay"); BS_Begin(); if (Element_Code==0xB3) //Only I { Get_SB ( time_code_flag, "time_code_flag"); if (time_code_flag) { Skip_SB( "time_code_dropframe"); Skip_S1(5, "time_code_hours"); Skip_S1(6, "time_code_minutes"); Skip_S1(6, "time_code_seconds"); Skip_S1(6, "time_code_pictures"); } } if (Element_Code==0xB6) //Only P or B { Get_S1 ( 2, picture_coding_type, "picture_coding_type"); Element_Info(AvsV_picture_coding_type[picture_coding_type]); } Skip_S1( 8, "picture_distance"); if (low_delay) Skip_UE( "bbv_check_times"); Get_SB ( progressive_frame, "progressive_frame"); if (!progressive_frame) { Get_SB( picture_structure, "picture_structure"); if (Element_Code==0xB6) //Only P or B { if (picture_structure) Skip_SB( "advanced_pred_mode_disable"); } } Get_SB ( top_field_first, "top_field_first"); Get_SB ( repeat_first_field, "repeat_first_field"); Skip_SB( "fixed_picture_qp"); Skip_S1( 6, "picture_qp"); if (Element_Code==0xB3) //Only I { if (!progressive_frame && !picture_structure) Get_SB( skip_mode_flag, "skip_mode_flag"); } if (Element_Code==0xB6) //Only P or B { if (picture_coding_type!=2 || !picture_structure) Skip_SB( "picture_reference_flag"); } Skip_SB( "reserved"); Skip_SB( "reserved"); Skip_SB( "reserved"); Skip_SB( "reserved"); if (Element_Code==0xB6) //Only P or B { Get_SB( skip_mode_flag, "skip_mode_flag"); } Get_SB ( loop_filter_disable, "loop_filter_disable"); if (!loop_filter_disable) { bool loop_filter_parameter_flag; Get_SB ( loop_filter_parameter_flag, "loop_filter_parameter_flag"); if (loop_filter_parameter_flag) { Skip_SE( "alpha_c_offset"); Skip_SE( "beta_offset"); } } BS_End(); if (Element_Size-Element_Offset) Skip_XX(Element_Size-Element_Offset, "Unknown"); FILLING_BEGIN(); if (progressive_frame==false) { if (picture_structure==true) //Frame { if (top_field_first) Interlaced_Top++; else Interlaced_Bottom++; } } else progressive_frame_Count++; //NextCode NextCode_Test(); NextCode_Clear(); for (int8u Pos=0x00; Pos<=0xAF; Pos++) NextCode_Add(Pos); //slice NextCode_Add(0xB0); //video_sequence_start NextCode_Add(0xB3); //picture_start NextCode_Add(0xB6); //picture_start //Autorisation of other streams for (int8u Pos=0x00; Pos<=0xAF; Pos++) Streams[Pos].Searching_Payload=true; //slice //Filling only if not already done if (Frame_Count>=Frame_Count_Valid && Count_Get(Stream_Video)==0) { //No need of more Accept("AVS Video"); Finish("AVS Video"); } FILLING_END(); }
//--------------------------------------------------------------------------- // Packet "0F" void File_Vc1::SequenceHeader() { Element_Name("SequenceHeader"); //Parsing BS_Begin(); Get_S1 ( 2, profile, "profile"); Param_Info(Vc1_Profile[profile]); if (profile==0 || profile==1) //Simple or Main { Skip_S1( 2, "res_sm"); Skip_S1( 3, "frmrtq_postproc"); Skip_S1( 5, "bitrtq_postproc"); Skip_SB( "loopfilter"); Skip_SB( "res_x8"); Skip_SB( "multires"); Skip_SB( "res_fasttx"); Skip_SB( "fastuvmc"); Skip_SB( "extended_mv"); Skip_S1( 2, "dquant"); Skip_SB( "vtransform"); Skip_SB( "res_transtab"); Skip_SB( "overlap"); Skip_SB( "syncmarker"); Skip_SB( "rangered"); Skip_S1( 2, "maxbframes"); Skip_S1( 2, "quantizer"); Skip_SB( "finterpflag"); Skip_SB( "res_rtm_flag"); } else if (profile==3) //Advanced { Get_S1 ( 3, level, "level"); Get_S1 ( 2, colordiff_format, "colordiff_format"); Param_Info(Vc1_ColorimetryFormat[colordiff_format]); Skip_S1( 3, "frmrtq_postproc"); Skip_S1( 5, "bitrtq_postproc"); Skip_SB( "postprocflag"); Get_S2 (12, coded_width, "max_coded_width"); Param_Info((coded_width+1)*2, " pixels"); Get_S2 (12, coded_height, "max_coded_height"); Param_Info((coded_height+1)*2, " pixels"); Get_SB ( pulldown, "pulldown"); Get_SB ( interlace, "interlace"); Get_SB ( tfcntrflag, "tfcntrflag - frame counter"); Get_SB ( finterpflag, "finterpflag"); Skip_SB( "reserved"); Get_SB ( psf, "psf - progressive segmented frame"); TEST_SB_SKIP( "display_ext"); Info_S2(14, display_x, "display_horiz_size"); Param_Info(display_x+1, " pixels"); Info_S2(14, display_y, "display_vert_size"); Param_Info(display_y+1, " pixels"); TEST_SB_SKIP( "aspectratio_flag"); Get_S1 ( 4, AspectRatio, "aspect_ratio"); Param_Info(Vc1_PixelAspectRatio[AspectRatio]); if (AspectRatio==0x0F) { Get_S1 ( 8, AspectRatioX, "aspect_horiz_size"); Get_S1 ( 8, AspectRatioY, "aspect_vert_size"); } TEST_SB_END(); TEST_SB_GET(framerate_present, "framerate_flag"); TESTELSE_SB_GET(framerate_form, "framerateind"); Get_S2 (16, framerateexp, "framerateexp"); Param_Info((float32)((framerateexp+1)/32.0), 3, " fps"); TESTELSE_SB_ELSE( "framerateind"); Get_S1 ( 8, frameratecode_enr, "frameratenr"); Param_Info(Vc1_FrameRate_enr(frameratecode_enr)); Get_S1 ( 4, frameratecode_dr, "frameratedr"); Param_Info(Vc1_FrameRate_dr(frameratecode_dr)); TESTELSE_SB_END(); TEST_SB_END(); TEST_SB_SKIP( "color_format_flag"); Skip_S1( 8, "color_prim"); Skip_S1( 8, "transfer_char"); Skip_S1( 8, "matrix_coef"); TEST_SB_END(); TEST_SB_END(); TEST_SB_GET (hrd_param_flag, "hrd_param_flag"); Get_S1 ( 5, hrd_num_leaky_buckets, "hrd_num_leaky_buckets"); Skip_S1( 4, "bitrate_exponent"); Skip_S1( 4, "buffer_size_exponent"); for (int8u Pos=0; Pos<hrd_num_leaky_buckets; Pos++) { Element_Begin("leaky_bucket"); Skip_S2(16, "hrd_rate"); Skip_S2(16, "hrd_buffer"); Element_End(); } TEST_SB_END(); } else //forbidden { Element_DoNotTrust("Forbidden value"); } Mark_1(); BS_End(); FILLING_BEGIN(); //NextCode NextCode_Clear(); NextCode_Add(0x0D); NextCode_Add(0x0E); //Autorisation of other streams Streams[0x0D].Searching_Payload=true; Streams[0x0E].Searching_Payload=true; if (From_WMV3) FrameHeader_Fill(); FILLING_END(); }
//--------------------------------------------------------------------------- // Packet "0D" void File_Vc1::FrameHeader() { //Counting if (File_Offset+Buffer_Offset+Element_Size==File_Size) Frame_Count_Valid=Frame_Count; //Finalize frames in case of there are less than Frame_Count_Valid frames Frame_Count++; Frame_Count_InThisBlock++; //Name Element_Name("FrameHeader"); Element_Info(Ztring(_T("Frame ")+Ztring::ToZtring(Frame_Count))); //Parsing BS_Begin(); int8u ptype; if (profile==3) //Advanced { int8u PictureFormat=0; //Default=Progressive frame if (interlace) { bool fcm_1; Get_SB ( fcm_1, "fcm_1"); if (fcm_1) { bool fcm_2; Get_SB ( fcm_2, "fcm_2"); PictureFormat=fcm_2?2:1; //Interlaced Field : Interlaced Frame } } Param_Info(Vc1_PictureFormat[PictureFormat]); PictureFormat_Count[PictureFormat]++; if (PictureFormat==2) //Interlaced Field { int8u ptype_; Get_S1 ( 3, ptype_, "ptype"); if (ptype_<5) { Param_Info(Vc1_Type[Vc1_FieldTypeTable[ptype_][0]]); Element_Info(Vc1_Type[Vc1_FieldTypeTable[ptype_][0]]); //First field Param_Info(Vc1_Type[Vc1_FieldTypeTable[ptype_][1]]); Element_Info(Vc1_Type[Vc1_FieldTypeTable[ptype_][1]]); //Second field ptype=Vc1_FieldTypeTable[ptype_][0]; //Saving the ptype from the first field } else { Trusted_IsNot("ptype is out of range"); ptype=0; //Error } } else { int32u ptype_; Get_VL (Vc1_ptype, ptype_, "ptype"); if (ptype_<5) {Param_Info(Vc1_Type[(size_t)ptype_]); Element_Info(Vc1_Type[(size_t)ptype_]);} ptype=(int8u)ptype_; } if (ptype!=4) //!=Skipping { if (tfcntrflag) { Skip_S1( 8, "tfcntr - frame counter"); } } if (interlace && !psf) { bool tff=true, rff=false; if (pulldown) { Get_SB (tff, "tff - top field first"); Get_SB (rff, "rff - repeat first field"); if (tff) Interlaced_Top++; else Interlaced_Bottom++; if (TemporalReference.size()<30) { if (ptype!=2 && ptype!=3 //if not B and BI-frame && !TemporalReference_Waiting.empty()) //We must have 2 I or P pictures to be sure not having B picture later { //We have 2 I or P pictures for (size_t Pos=1; Pos<TemporalReference_Waiting.size(); Pos++) //All B frames (not the first frame, which is I or P) { TemporalReference_Offset++; TemporalReference[TemporalReference_Offset]=TemporalReference_Waiting[Pos]; } TemporalReference_Offset++; TemporalReference[TemporalReference_Offset]=TemporalReference_Waiting[0]; TemporalReference_Waiting.clear(); } //We must wait for having another I or P picture temporalreference Temp; Temp.top_field_first=tff; Temp.repeat_first_field=rff; TemporalReference_Waiting.push_back(Temp); } } } else { int8u rptfrm=0; if (pulldown) { Get_S1 ( 2, rptfrm, "rptfrm - repeate frame"); } } /* if (panscan_flag) { //TODO } if (ptype!=4) //!=Skipping { bool rndctrl; Get_SB( rndctrl, "rndctrl - rounding control"); if (rndctrl && (ptype==0 || ptype==3)) //I or BI type Trusted_IsNot("Should not be true!"); if (interlace) Skip_SB( "uvsamp - uv sampling mode"); if (finterpflag && PictureFormat==0) //Progressive frame Skip_SB( "interrpfrm"); if (PictureFormat!=1) //!=Interlaced frame { if (ptype==2 //Type B || (ptype==3 && PictureFormat==2)) //Type BI and Interlaced field Skip_VL(Vc1_bfraction, "bfraction"); } } */ } BS_End(); if (Element_Size-Element_Offset) Skip_XX(Element_Size-Element_Offset, "Data"); FILLING_BEGIN(); //NextCode NextCode_Test(); NextCode_Clear(); NextCode_Add(0x0D); NextCode_Add(0x0F); //Filling only if not already done if (!IsFilled && Frame_Count>=Frame_Count_Valid) FrameHeader_Fill(); //Autorisation of other streams Streams[0x0D].Searching_Payload=true; Streams[0x0F].Searching_Payload=true; FILLING_END(); }