21 dicembre 2011 mattina
Fondamenti di Informatica modulo A
Prof. Marco Gavanelli
21 dicembre 2011
Esercizio (punti 16)
Un flusso video, codificato con alta fedeltà, può essere adattato per ridurre la quantità di dati da trasmettere.
Ciò è possibile diminuendo la velocità di riproduzione del video e/o la qualità delle immagini da riprodurre. Al tal fine, un server multimediale ha estratto le informazioni dei pacchetti (numero massimo di pacchetti pari a 300) contenuti nel flusso video e le ha salvate nel file di testo traccia.txt.
Il file traccia.txt contiene le seguente informazioni per ogni pacchetto:
- un numero che identifica quale immagine è associata al pacchetto (int)
- la quantità di byte contenuta in ogni pacchetto (int)
- un numero che identifica il livello temporale del pacchetto (
int
che va da 0 a 3) - un numero che identifica il livello di qualità del pacchetto (
int
che va da 0 a 10) - un valore che quantifica la qualità apportata dal pacchetto (float).
Per adattare la velocità di riproduzione del video il server può eliminare un pacchetto, e dunque la riga ad esso associata nel file, che ha un livello temporale maggiore di zero. I pacchetti, però, presentano delle dipendenze: l'eliminazione di un pacchetto associato ad un livello temporale comporta necessariamente l'eliminazione di tutti i pacchetti dei livelli temporali uguali o più alti. Ad esempio se elimino un pacchetto del livello temporale identificato dal numero 2 è necessario eliminare nel file tutti i pacchetti a cui è associato un livello temporale uguale a 2 o 3.
Si codifichi un programma C che dia la possibilità ad un utente di effettuare l'adattamento secondo le regole sopracitate, e indichi all'utente, rispettivamente, la differenza di grandezza in byte tra il file originale e il file modificato.
Si utilizzi il seguente algoritmo:
- Il
main
deve invocare una funzione di lettura (punto 2), poi deve:- stampare a video la grandezza totale in byte del flusso video originale, invocando la funzione al punto 3.
- chiedere all'utente l'adattamento voluto in termini di velocità di riproduzione (un
int
da 1 a 3) e chiamare la funzione definita al punto 4 che effettui l'adattamento e fornisca il nuovo flusso in un nuovo array di strutture - mostrare a video il nuovo array di strutture
- calcolare per il nuovo flusso modificato la grandezza totale in byte, invocando la funzione al punto 3 sul nuovo array di strutture
- infine, salvare sul file traccia_mod.txt il nuovo flusso (il contenuto del nuovo array).
- Si crei una funzione che preso in ingresso il nome del file, ne salvi i dati in un array di strutture opportunamente definito; la funzione deve anche visualizzare a video il contenuto dell'array.
- Si crei una funzione che preso in ingresso l'array di strutture letto al punto 2 (più, eventualmente, altri parametri) restituisca la grandezza totale in byte del video (sommando le singole grandezze di ogni pacchetto).
- Si crei una funzione che preso in ingresso
- l'array di strutture letto al punto 2
- un intero X che rappresenta l'adattamento richiesto di velocità di riproduzione
main
un nuovo array di strutture che contiene solo i pacchetti che hanno un livello temporale strettamente minore del valore X preso in ingresso.
Facoltativo (punti 4)
Si modifichi il programma facendo in modo che la funzione di adattamento (punto 4), invece di creare un nuovo array, elimini direttamente dall'array di strutture i pacchetti con livello temporale superiore (o uguale) a quello richiesto dall'utente. La funzione non dovrà utilizzare un ulteriore array di strutture, ma eliminare direttamente gli elementi dall'array. Infine, nel main
, si invochi una funzione che salva l'array modificato nel file traccia_mod.txt.
Si consegnino i file:
- un file
funzioni.c
che contiene le funzioni comuni - un file
main.c
che contiene ilmain
e le funzioni usate solo nell'esercizio base - un file
facoltativo.c
che contiene ilmain
e le funzioni usate solo nell'esercizio facoltativo
più tutti i file header ritenuti necessari.