2015-03-10 6 views
0

У меня есть базовый RIFF AVI, сделанный в начале 1990-х годов, и я являюсь типичным, чтобы сделать основной видеопроигрыватель в собственном коде VB/C#. Согласно заголовку, он использует старый кодек MS RLE. Заголовок битмапа в AVI указывает, что он сжат RLE8.RIFF AVI RLE отличается от GDI RLE

bitmap rle

  1. является результатом сырой «xxdc» сжатых данных, записанных в растр прагматично, созданный с нуля и был открыт в средстве просмотра фотографий Windows
  2. тот же кадр извлекали с помощью VirtualDub
  3. в код ниже декомпрессирования растровой карты RLE8

Проблема заключается и в коде ниже И Windows делает то же самое, части пропускают whi ch приводит меня к следующему от старого VirtualDub blog post;

(RLE GDI не является такой же, как RLE AVI в)».

Проблема в том, что я не могу найти разницу :(. Я не могу найти никаких источников в интернете или какой-либо материал на сайте MSDN .

Я поместил образец декомпрессии RLE8 из htttp: //dirkbertels.net/computing/bitmap_decompression.php в VB (структуры растровых изображений опущены для краткости) .Это работает. Проблема в том, что он не работает правильно для AVI рамы, которые используют RLE8.

 Dim firstByte As Byte 
     Dim secondByte As Byte 
     Dim currX As UInteger = 0 
     Dim currY As UInteger = 0 
     Dim i As UInteger 

     Do 
      firstByte = br.ReadByte 
      If 0 <> firstByte Then 
       ' Encoded Mode 
       secondByte = br.ReadByte 
       For i = 0 To firstByte - 1 
        frame.SetPixel(currX, currY, _bitmap.biClut(secondByte)) 
        currX += 1 
       Next i 
      Else 
       ' Absolute Mode 
       firstByte = br.ReadByte ' store next byte 
       Select Case firstByte 
        Case 0 ' new line 
         currX = 0 
         currY += 1 ' move cursor to beginning of next line 
        Case 1 ' end of bitmap 
         Exit Do 
        Case 2 ' delta = goto X and Y 
         currX += CInt(br.ReadByte) ' read byte and add value to x value 
         currY += CInt(br.ReadByte) ' read byte and add value to y value 
        Case Else 
         For i = 0 To firstByte - 1 
          secondByte = br.ReadByte 
          frame.SetPixel(currX, currY, _bitmap.biClut(secondByte)) 
          currX += 1 
         Next i 
         'If 0 <> (firstByte And &H1) Then 
         ' br.ReadByte() 
         'End If 
         If firstByte And &H1 Then ' if the run doesn't end on a word boundary, 
          br.ReadByte() 
         End If 
       End Select 
      End If 
     Loop 

Теперь я в затруднении относительно того, как VirtualDub, FFMPEG и другие делают это без использования старого кодека MSRLE.DLL ... Есть ли у кого-нибудь идеи?

ответ

0

Я нашел решение, поэтому я отвечу на него, чтобы другие, подобные мне, имели отправную точку.

Данные фрейма правильно распаковываются. Проблема заключалась в том, что я неправильно следил за спецификациями RIFF AVI. Для моего видео каждый кадр распаковывается по сравнению с предыдущим.