Newsgroup: it.comp.os.linux.development
Titolo: Librerie per JPEG e/o AVI

[Lunghetto]
Ciao a tutti,
    innanzitutto mi scuso di cercare la facile 'scorciatoia' del newgroup
per domandare informazioni, ma non ho mai fatto nulla di grafica e vorrei
sapere per lo meno da che parte guardare.
Vorrei sapere quali sono le librerie per eseguire le seguenti due procedure:
(due diversi livelli, per me, di risolvere lo stesso problema)
[in entrambi i casi se ci fosse una citazione a qualche tutorial o esempio
sarei felice......... ;-)]
********************************
1) SEMPLICE - Aprire due files jpeg (da disco) per elaborarli ed ottenere un
terzo file jpeg 'mix' dei due; in pratica l'elaborazione che devo fare sulle
immagini caricate in memoria è:
    jpgA e jpgB --> jpgC dove:
    righe_di_pixel_pari (jpegC ) = righe_di_pixel_pari (jpegA)
    righe_di_pixel_dispari (jpegC ) = righe_di_pixel_dispari (jpegB)
Fondamentalmente devo interlacciare i due files generandone un terzo. Una
serie di files jpeg da elaborare è in pratica un filmato AVI.
Quello che non so è quale libreria (e come) mi permetta di leggere un file
jpg caricandolo non compresso in RAM (e il viceversa: generarlo). E poi
quale libreria (e come) mi permetta di gestire una immagine in memoria per
leggerne e modificarne i pixel e/o le intere righe.
Importante è la velocità di elaborazione: non lo faccio in VB sotto Windows
perché altrimenti vado in pensione prima di finire le elaborazioni!
********************************
2) COMPLESSO - Aprire un file AVI in lettura (DV capture da DVGRAB, formato
DV2), ed uno in scrittura (qualsiasi formato). Leggere i frames dall'origine
e scriverli nella destinazione aggiungendo in mezzo ad ogni coppia di frames
della sorgente il loro interlacciamento secondo l'algoritmo al punto 1):
Devo ottenere il file AVI2 dal file AVI1:
AVI1(sorg.) --> AVI2(dest.)
(frames Sx)       (frames Dx)
25fps                 50fps
D0=S0
D1=RighePari(S0)+RigheDispari(S1)
D2=S1
D3=RighePari(S1)+RigheDispari(S2)
D4=S2
D5=RighePari(S2)+RigheDispari(S3)
D6=S3
.........
(non sono sicuro su pari/dispari, se vadano invertiti come criteri, ma ora
non importa)
C'è qualche documentazione di librerie per leggere i singoli fotogrammi da
un AVI caricandoli in memoria, modificarli e metterli in un altro file AVI?
O anche scriverli poi in una serie di JPEG, facendo una cosa ibrida con il
punto 1 e riconvertendo i files in AVI.
********************************
PICCOLA SPIEGAZIONE DEL MIO SCOPO PER I CURIOSI
Lo scopo è ottenere dei filmati fluidi dalla telecamera DV. Infatti non solo
c'è il problema di deinterlacciare (so come risolverlo), ma anche il
problema che invece di 50 semi-frame al secondo (uscita TV della telecamera)
avrei 25 full-frame al secondo, con una perdita di risoluzione temporale a
causa del deinterlacciamento. Il file in uscita che otterrei (AVI2, ottenuto
direttamente con il procedimento 2 o indirettamente con quello 1) sarebbe sì
interlacciato, ma con un numero di frames doppi, temporalmente + fluidi
circa come avrei nella visione diretta da Telecamera in TV.
Non ho trovato nessun software che svolga questa funzione, e mi pare molto
strano. Cmq sono disposto a realizzarlo.
********************************
Ringrazio anticipatamente per qualsiasi consiglio
    Osolemio

 l'algoritmo al punto 1):
Mentre questo, come sopra, lo devi fare a mano.
Bye.

 aprire praticamente tutto quello che e` AVI.
Spero sia altrettanto facile, proverň!!
Grazie mille,
    Osolemio

 della sorgente il loro interlacciamento secondo l'algoritmo al punto 1):
[...]
Proposta probabilmente sciocca: usare transcode + apposito filtro eventualmente
scritto ad hoc?
-- 
"Stupid people do stupid things smart people outsmart each others"
*** mailserver: 
freemail.it

 scritto ad hoc?
Per niente sciocca, ma non conosco minimamente transcode né so da che parte
iniziare per fare un filtro.
Ho provato imlib e mi piace, semplice e ben documentata.
Ho scaricato la libavifile-devel (e la avifile-devel) ma qui non c'è proprio
nulla (tutorials o esempi). Qualcuno ha qualche esempio per aprire un AVI,
leggerne i frames, e metterli su un altro file, con le libavifile? Tenendo
presente non ho mai fatto nulla di simile il meglio è avere un esempio da
compilare e su cui lavorare, come fatto con la imlib per i jpeg!!!
Grazie,
    Osolemio

 leggerne i frames, e metterli su un altro file, con le libavifile?
c'e` avilib (distribuita ancora con transcode) che e` molto semplice e
discretamente ('nsomma) documentata, ma a questo punto io punterei
ancora sul filtro per transcode. Ce ne sono di gia` fatti e potresti ispirarti.
-- 
Ikitt 


 leggerne i frames, e metterli su un altro file, con le libavifile? Tenendo
io le ho usate per scrivere due programmini che convertissero gli avi
in formato "raw" 8bpp e viceversa. Avevo fretta, non conoscevo le
avifile e non avevo nessuna dimestichezza col c++ (preferisco il c :)),
quindi non aspettarti un granche', mi sono fermato appena ho ottenuto
qualcosa di vagamente funzioante ;)
PS: chiedo scusa agli altri per la lunghezza del post, ma immagino
che 
nos...@softhome.net
 non sia il tuo vero indirizzo :)
==== raw8toavi.cc ====
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "avifile.h"
#include "fourcc.h"
#include "except.h"
main(int argc, char **argv){
BITMAPINFOHEADER bi;
fourcc_t codec;
IAviWriteFile *out;
IAviVideoWriteStream* str;
unsigned char *data, *data2;
FILE *f;
	if(argc != 5){
		cout << "Usage: raw8toavi w h input_raw output_avi" << endl;
		exit(0);
	}
	f = fopen(argv[3], "rb");
	try{
		codec = RIFFINFO_CVID;
		memset(&bi, 0, sizeof(bi));
		bi.biSize = sizeof(bi);
		bi.biWidth = atoi(argv[1]);
		bi.biHeight = atoi(argv[2]);
		bi.biSizeImage = bi.biWidth * bi.biHeight * 3;
		bi.biPlanes = 1;
		bi.biBitCount = 24;
		bi.biCompression = BI_RGB;
		data = (unsigned char *) malloc(bi.biWidth * bi.biHeight);
		data2 = (unsigned char *) malloc(bi.biWidth * bi.biHeight * 3);
		out = CreateIAviWriteFile(argv[4]);
		str = out->AddVideoStream(codec, &bi, 1000000/25);
		str->Start();
		int i=0;
		while(! feof(f)){
			cout << "." << flush; i++;
			fread(data, bi.biWidth * bi.biHeight, 1, f);
			for(int y=0; y<bi.biHeight; y++){
				for(int x=0; x<bi.biWidth; x++){
					data2[(y*bi.biWidth+x)*3] =
					data2[(y*bi.biWidth+x)*3 + 1] = 
					data2[(y*bi.biWidth+x)*3 + 2] = data[(bi.biHeight-y-1)*bi.biWidth+x];
				}
			}
			CImage frame(data2, bi.biWidth, bi.biHeight);
			str->AddFrame(&frame);
		}
		cout << "\ntotal frames: " << i << endl;
		str->Stop();
		delete out;
	}
	catch(FatalError& error) {
		error.Print();
	}
	fclose(f);
}
======================
==== avitowav8.cc ====
#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "avifile.h"
#include "fourcc.h"
#include "except.h"
using namespace std;
[... taglio la funzione convert(), che converte da RGB(15|16|14|32) a
scala di grigi 8bpp ...]
main(int argc, char **argv){
IAviReadFile *inp;
IAviReadStream *str;
CImage *img;
int old_getpos;
BITMAPINFOHEADER bh;
unsigned char *buf, *tmp;
FILE *f;
	if(argc != 3){
		cout << "Usage: avitoraw8 input_avi output_raw" << endl;
		exit(0);
	}
	f = fopen(argv[2], "wb");
	try{
		inp = CreateIAviReadFile(argv[1]);
		str = inp->GetStream(0, AviStream::Video);
		str->StartStreaming();
		str->GetOutputFormat(&bh, sizeof(bh));
		bh.biHeight *= (bh.biHeight > 0) ? 1 : -1;
		buf = (unsigned char *) malloc(bh.biHeight * bh.biWidth);
		cout << "Size is " << bh.biHeight << "x" << bh.biWidth << endl;
		cout << "Bits per pixel: " << bh.biBitCount << " Compression " << bh.biCompression << endl;
		while(!str->Eof() && str->GetPos() != old_getpos){		
			old_getpos = str->GetPos();
			cout << "." << flush;
			str->ReadFrame();
			img = str->GetFrame();
			tmp = img->Data();
			convert(buf, tmp, bh.biHeight, bh.biWidth, bh.biBitCount, bh.biCompression);
			fwrite(buf, bh.biHeight * bh.biWidth, 1, f);
			img->Release();
		}
		cout << "total frames: " << str->GetPos() + 1 << endl;
		str->StopStreaming();
		delete inp;
	}
	catch(FatalError& error) {
		error.Print();
	}
	fclose(f);
}
===============
-- 
There are only 10 kinds of people in the world --
Those who understand binary, and those who don't.

 che 
nos...@softhome.net
 non sia il tuo vero indirizzo :)
Infatti, grazie al quadrato.