diff --git a/Source/CLI/CommandLine_Parser.cpp b/Source/CLI/CommandLine_Parser.cpp index 8bbfde3f..3900e2e6 100644 --- a/Source/CLI/CommandLine_Parser.cpp +++ b/Source/CLI/CommandLine_Parser.cpp @@ -356,6 +356,14 @@ return_value Parse(Core &C, int argc, const char* argv_ansi[], const MediaInfoNa { OutputFrames_Concealed = false; } + else if (!strcmp(argv_ansi[i], "--merge-output-nodata")) + { + OutputFrames_NoData = true; + } + else if (!strcmp(argv_ansi[i], "--merge-ignore-nodata")) + { + OutputFrames_NoData = false; + } else if (!strcmp(argv_ansi[i], "--merge-log-missing")) { ShowFrames_Missing = true; diff --git a/Source/Common/Merge.cpp b/Source/Common/Merge.cpp index 69e638e3..485450a3 100644 --- a/Source/Common/Merge.cpp +++ b/Source/Common/Merge.cpp @@ -37,6 +37,7 @@ uint64_t Timeout = 0; uint8_t UseAbst = 0; bool OutputFrames_Speed = false; bool OutputFrames_Concealed = false; +bool OutputFrames_NoData = false; int ShowFrames_Missing = -1; int ShowFrames_Intermediate = -1; extern void timecode_to_string(string& Data, int Seconds, bool DropFrame, int Frames); @@ -113,6 +114,7 @@ namespace uint8_t RepeatCount = 0; int Speed = INT_MIN; int FullConcealed = false; + bool NoData = false; per_frame() = default; per_frame(status const& Status_, ::TimeCode const& TC_, uint8_t* const& BlockStatus_, size_t BlockStatus_Count_) : @@ -487,7 +489,8 @@ bool dv_merge_private::AppendFrameToList(size_t InputPos, const MediaInfo_Event_ CurrentFrame.TC_SMPTE = timecode(FrameData); CurrentFrame.AbstBf = abst_bf(FrameData->AbstBf); CurrentFrame.Speed = GetDvSpeed(*FrameData); - CurrentFrame.FullConcealed = coherency_flags(FrameData->Coherency_Flags).full_conceal(); + CurrentFrame.FullConcealed = coherency_flags(FrameData).full_conceal(); + CurrentFrame.NoData = coherency_flags(FrameData).no_data(); // Time code jumps - after first frame timecode TC_Temp(FrameData); @@ -1489,6 +1492,7 @@ bool dv_merge_private::Process(float Speed) if (true && (OutputFrames_Speed || (Speed && Speed != 1.0) || GetDvSpeedIsNormalPlayback(DvSpeed)) && (OutputFrames_Concealed || (Prefered_Frame != -1 && !Inputs[Prefered_Frame]->Segments[Segment_Pos].Frames[Frame_Pos].FullConcealed)) + && (OutputFrames_NoData || (Prefered_Frame != -1 && !Inputs[Prefered_Frame]->Segments[Segment_Pos].Frames[Frame_Pos].NoData)) && (ShowFrames_Intermediate || (Prefered_Frame != -1 && FirstBadFrame == -1)) ) { diff --git a/Source/Common/Merge.h b/Source/Common/Merge.h index e70519c7..fc9b92ec 100644 --- a/Source/Common/Merge.h +++ b/Source/Common/Merge.h @@ -36,6 +36,7 @@ extern uint64_t Timeout; extern uint8_t UseAbst; extern bool OutputFrames_Speed; extern bool OutputFrames_Concealed; +extern bool OutputFrames_NoData; extern int ShowFrames_Missing; extern int ShowFrames_Intermediate; extern bool InControl; diff --git a/Source/Common/Output.h b/Source/Common/Output.h index cc7a9c6f..fa25c86a 100644 --- a/Source/Common/Output.h +++ b/Source/Common/Output.h @@ -111,7 +111,8 @@ struct rec_date_time struct coherency_flags { public: - coherency_flags(decltype(MediaInfo_Event_DvDif_Analysis_Frame_1::Coherency_Flags) Value) : _Value(Value) {} + coherency_flags(const MediaInfo_Event_DvDif_Analysis_Frame_1& Frame) : _Value(Frame.Coherency_Flags), _Value2(Frame.MoreFlags) {} + coherency_flags(const MediaInfo_Event_DvDif_Analysis_Frame_1* Frame) : _Value(Frame->Coherency_Flags), _Value2(Frame->MoreFlags) {} inline bool no_pack_sub() { return ((_Value >> 0) & 0x1); } // 0 inline bool no_pack_vid() { return ((_Value >> 1) & 0x1); } // 1 inline bool no_pack_aud() { return ((_Value >> 2) & 0x1); } // 2 @@ -121,9 +122,11 @@ struct coherency_flags inline bool no_sourceorcontrol_aud() { return ((_Value >> 6) & 0x1); } // 6 inline bool no_pack() { return no_pack_sub() && no_pack_vid() && no_pack_aud() ; } inline bool full_conceal() { return full_conceal_vid() && full_conceal_aud(); } + inline bool no_data() { return (_Value2 >> 3) & 0x1; } // private: decltype(MediaInfo_Event_DvDif_Analysis_Frame_1::Coherency_Flags) _Value; + decltype(MediaInfo_Event_DvDif_Analysis_Frame_1::MoreFlags) _Value2; }; //*************************************************************************** diff --git a/Source/Common/Output_Xml.cpp b/Source/Common/Output_Xml.cpp index 185adf9f..8656baa2 100644 --- a/Source/Common/Output_Xml.cpp +++ b/Source/Common/Output_Xml.cpp @@ -226,7 +226,7 @@ return_value Output_Xml(ostream& Out, std::vector& PerFile, bitset