mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-29 20:10:22 -04:00 
			
		
		
		
	ATV demod: use common code for horizontal sync and different vertical sync detections for HSkip and standard
This commit is contained in:
		
							parent
							
								
									432d6ed8fd
								
							
						
					
					
						commit
						8ae95f2e85
					
				| @ -325,11 +325,7 @@ void ATVDemodSink::demod(Complex& c) | ||||
| 
 | ||||
|     if (m_registeredTVScreen) // can process only if the screen is available (set via the GUI)
 | ||||
|     { | ||||
|         if (m_settings.m_atvStd == ATVDemodSettings::ATVStdHSkip) { | ||||
|             processHSkip(sample, sampleVideo); | ||||
|         } else { | ||||
|             processClassic(sample, sampleVideo); | ||||
|         } | ||||
|         processSample(sample, sampleVideo); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -195,7 +195,7 @@ private: | ||||
|     void demod(Complex& c); | ||||
|     void applyStandard(int sampleRate, const ATVDemodSettings& settings, float lineDuration); | ||||
| 
 | ||||
|     inline void processClassic(float& sample, int& sampleVideo) | ||||
|     inline void processSample(float& sample, int& sampleVideo) | ||||
|     { | ||||
|         // Filling pixel on the current line - reference index 0 at start of sync pulse
 | ||||
|         m_registeredTVScreen->setDataColor(m_sampleIndex - m_numberSamplesPerHSync, sampleVideo, sampleVideo, sampleVideo); | ||||
| @ -257,6 +257,20 @@ private: | ||||
|         if (m_sampleIndex >= m_samplesPerLine) | ||||
|         { | ||||
|             m_sampleIndex = 0; | ||||
| 
 | ||||
|             if (m_settings.m_atvStd == ATVDemodSettings::ATVStdHSkip) { | ||||
|                 processEOLHSkip(); | ||||
|             } else { | ||||
|                 processEOLClassic(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         prevSample = sample; | ||||
|     } | ||||
| 
 | ||||
|     // Standard vertical sync
 | ||||
|     inline void processEOLClassic() | ||||
|     { | ||||
|         m_lineIndex++; | ||||
| 
 | ||||
|         if (m_lineIndex == m_numberOfVSyncLines + 3 && m_fieldIndex == 0) | ||||
| @ -308,65 +322,9 @@ private: | ||||
|         m_registeredTVScreen->selectRow(rowIndex); | ||||
|     } | ||||
| 
 | ||||
|         prevSample = sample; | ||||
|     } | ||||
| 
 | ||||
|     // Vertical sync is obtained by skipping horizontal sync on the line that triggers vertical sync (new frame)
 | ||||
|     inline void processHSkip(float& sample, int& sampleVideo) | ||||
|     inline void processEOLHSkip() | ||||
|     { | ||||
|         // Filling pixel on the current line - reference index 0 at start of sync pulse
 | ||||
|         m_registeredTVScreen->setDataColor(m_sampleIndex - m_numberSamplesPerHSync, sampleVideo, sampleVideo, sampleVideo); | ||||
| 
 | ||||
|         if (m_settings.m_hSync) | ||||
|         { | ||||
|             // Horizontal Synchro detection
 | ||||
|             if ((prevSample >= m_settings.m_levelSynchroTop && | ||||
|                 sample < m_settings.m_levelSynchroTop) // horizontal synchro detected
 | ||||
|                 && (m_sampleIndexDetected > m_samplesPerLine - m_numberSamplesPerHTopNom)) | ||||
|             { | ||||
|                 double sampleIndexDetectedFrac = | ||||
|                     (sample - m_settings.m_levelSynchroTop) / (prevSample - sample); | ||||
|                 double hSyncShift = -m_sampleIndex - sampleIndexDetectedFrac; | ||||
|                 if (hSyncShift > m_samplesPerLine / 2) | ||||
|                     hSyncShift -= m_samplesPerLine; | ||||
|                 else if (hSyncShift < -m_samplesPerLine / 2) | ||||
|                     hSyncShift += m_samplesPerLine; | ||||
| 
 | ||||
|                 if (fabs(hSyncShift) > m_numberSamplesPerHTopNom) | ||||
|                 { | ||||
|                     m_hSyncErrorCount++; | ||||
|                     if (m_hSyncErrorCount >= 8) | ||||
|                     { | ||||
|                         // Fast sync: shift is too large, needs to be fixed ASAP
 | ||||
|                         m_sampleIndex = 0; | ||||
|                         m_hSyncShiftSum = 0.0; | ||||
|                         m_hSyncShiftCount = 0; | ||||
|                         m_hSyncErrorCount = 0; | ||||
|                     } | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     m_hSyncShiftSum += hSyncShift; | ||||
|                     m_hSyncShiftCount++; | ||||
|                     m_hSyncErrorCount = 0; | ||||
|                 } | ||||
|                 m_sampleIndexDetected = 0; | ||||
|             } | ||||
|             else | ||||
|                 m_sampleIndexDetected++; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             m_hSyncShiftSum = 0.0f; | ||||
|             m_hSyncShiftCount = 0; | ||||
|         } | ||||
| 
 | ||||
|         m_sampleIndex++; | ||||
| 
 | ||||
|         // end of line
 | ||||
|         if (m_sampleIndex >= m_samplesPerLine) | ||||
|         { | ||||
|             m_sampleIndex = 0; | ||||
|         m_lineIndex++; | ||||
|         m_rowIndex++; | ||||
| 
 | ||||
| @ -392,9 +350,6 @@ private: | ||||
| 
 | ||||
|         m_registeredTVScreen->selectRow(m_rowIndex); | ||||
|     } | ||||
| 
 | ||||
|         prevSample = sample; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user