RIFF AVI RLE отличается от GDI RLE

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

bitmap rle

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

Проблема в том, что приведенный ниже код И Windows делают то же самое, части отсутствуют, что приводит меня к следующему из старого Запись в блоге VirtualDub;

(RLE GDI отличается от RLE AVI)».

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

Я перенес пример распаковки RLE8 с http://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... У кого-нибудь есть идеи?


person Alex Guerin    schedule 10.03.2015    source источник


Ответы (1)


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

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

person Alex Guerin    schedule 11.03.2015