[Ffmpeg-devel] [PATCH]BMP encoder

Michel Bardiaux mbardiaux
Tue Jan 23 15:55:54 CET 2007


Alex Beregszaszi wrote:
> Hi,
> 
>> +#define read16(bits) bswap_16(get_bits(bits, 16))
>> +#define read32(bits) bswap_32(get_bits_long(bits, 32))
> ...
>> +#define write16(bits, val) put_bits(bits, 16, bswap_16(val))
>> +#define write32(bits, val) put_bits(bits, 32, bswap_32(val))
> 
> What about using bytestream.h or intreadwrite.h instead this? I dont see
> its putting/reading non-8bit aligned data:

Michael stated I could use whatever I wanted for the header. So I 
decided to use the same as Mans did for the decoder. It is conceivable 
to change *both* encoder and decoder to one of the byte-oriented APIs, 
but as Mans is the official maintainer, its his call.

> 
>> +    init_put_bits(&bits, buf, buf_size);
>> +
>> +    // STRUCTURE.field refer to the MSVC documentation for BITMAPFILEHEADER
>> +    // and related pages.
>> +    put_bits(&bits, 8, 'B');       // BITMAPFILEHEADER.bfType
>> +    put_bits(&bits, 8, 'M');       // do.
>> +    write32(&bits, n_bytes);       // BITMAPFILEHEADER.bfSize
>> +    write16(&bits, 0);             // BITMAPFILEHEADER.bfReserved1
>> +    write16(&bits, 0);             // BITMAPFILEHEADER.bfReserved2
>> +    hsize = 14 /* BITMAPFILEHEADER */ + 40;
>> +    write32(&bits, hsize);         // BITMAPFILEHEADER.bfOffBits
>> +    write32(&bits, 40);            // BITMAPINFOHEADER.biSize
>> +    write32(&bits, avctx->width);  // BITMAPINFOHEADER.biWidth
>> +    write32(&bits, avctx->height); // BITMAPINFOHEADER.biHeight
>> +    write16(&bits, 1);             // BITMAPINFOHEADER.biPlanes
>> +    write16(&bits, 24);            // BITMAPINFOHEADER.biBitCount
>> +    write32(&bits, BMP_RGB);       // BITMAPINFOHEADER.biCompression
>> +    write32(&bits, n_bytes_image); // BITMAPINFOHEADER.biSizeImage
>> +    write32(&bits, 0);             // BITMAPINFOHEADER.biXPelsPerMeter
>> +    write32(&bits, 0);             // BITMAPINFOHEADER.biYPelsPerMeter
>> +    write32(&bits, 0);             // BITMAPINFOHEADER.biClrUsed
>> +    write32(&bits, 0);             // BITMAPINFOHEADER.biClrImportant
>> +    // BMP files are bottom-to-top so we start from the end...
>> +    ptr = p->data[0] + (avctx->height - 1) * p->linesize[0];
>> +    buf += hsize;
>> +    for(i = 0; i < avctx->height; i++) {
>> +        n = 3*avctx->width;
>> +        memcpy(buf, ptr, n);
>> +        buf += n;
>> +        memset(buf, 0, n_bytes_per_row-n);
>> +        buf += n_bytes_per_row-n;
>> +        ptr -= p->linesize[0]; // ... and go back
>> +    }

-- 
Michel Bardiaux
R&D Director
T +32 [0] 2 790 29 41
F +32 [0] 2 790 29 02
E mailto:mbardiaux at mediaxim.be

Mediaxim NV/SA
Vorstlaan 191 Boulevard du Souverain
Brussel 1160 Bruxelles
http://www.mediaxim.com/




More information about the ffmpeg-devel mailing list