Trab1 - Tocador de AVI

Fornecido

O código fonte de duas aplicações simples mas funcionais (trab1.zip - 210Kb). Uma utilizando a Win32 API diretamente e outra usando IUP.

Em ambos os casos utilizamos os módulos AVIFile, WaveOut e DrawDib da biblioteca VFW (Video for Windows) da seção de multimídia da Win32 API.

O mecanismo de sincronia do som com vídeo já está implementado e sugiro que não seja modificado. Mesmo que não haja som no arquivo AVI o sincronismo funcionará.

O Formato AVI

O formato AVI segue a especificação de um arquivo RIFF (resource information file format) do Windows. Mas as funções AVIFile do VFW nos permitem acessar o formato de uma maneira mais transparente incluindo a descompressão do vídeo.

Nele podemos na realidade armazenar vários tipos de informação diferentes. O exemplo "aviinfo" que acompanha o arquivo de distribuição do trabalho mostra isso. Inclusive pode armazenar várias seqüencias de vídeo e som. No trabalho estaremos lendo apenas a primeira seqüência de cada tipo.

Cada seqüência é chamada de "Stream" e pode estar compactada com qualquer método de compressão. Basta que esse método (ou codec) esteja instalado no sistema. Assim pode ocorrer do vídeo ser compactado em um sistema e não conseguir ser reproduzido em outro pela falta do codec.

O maior problema de portabilidade do formato AVI é a falta de codecs para outros sistemas que não o Windows.

Enunciado

O objetivo do trabalho é se familiarizar com os mecanismos de reprodução de vídeo em Windows. E usá-los para controlar melhor a reprodução de um vídeo. O programa não deve ter diálogos complicados, nem controles de botões para o vídeo. Apenas um menu de contexto (right click) com as opções pedidas e suas respectivas teclas de atalho. Os diálogos necessários podem usar a MessageBox.

Independente do que estiver implementado no código fornecido a aplicação deverá criar uma janela com o tamanho de toda a tela (full screen).

Assim que o programa é executado ele verifica se um arquivo foi passado na linha de comando, caso contrário mostra o diálog de seleção de arquivo. Se não foi selecionado nenhum arquivo o programa termina. Se o arquivo selecionado apresentou erro na abertura uma mensagem informa o erro e retorna para o diálogo de seleção de arquivo. No caso de já existir um arquivo aberto e o diálogo cancelar permanece o arquivo anterior.

A visualização do vídeo deve ser com o tamanho atual no centro da tela. [Opcionalmente pode-se mostrá-lo ocupando a tela toda, mas sem deformar. Optionalmente pode-se fornecer algumas opções de zoom. Nesse caso se o vídeo ficar maior que a tela pode-se usar click+drag do mouse para mover a imagem para até as bordas. Opcionalmente pode aceitar arquivos via Drag&Drop.]

Deverão ser feitas as seguintes estatísticas:

número real de quadros/segundo
número de quadros perdidos
tempo médio, máximo e mínimo para ler cada quadro (logo antes e depois da aviaudioMessage)
tempo médio, máximo e mínimo para desenhar cada quadro (logo antes e depois da DrawDib)
tempo médio, máximo e mínimo para ler o som (logo antes e depois da AVIStreamGetFrame)

Para a contagem do tempo sugiro o uso da função GetTickCount.

Mostrar, se desejado pelo usuário, um feedback textual com a contagem de tempo sobre a janela no formato: 00:00:00:00 (HH:MM:SS:FF -  hora:minuto:segundo:frame). E junto um feedback da acão sendo executada "Play", "Fast Forward", "Rewind", "Pause"... [Opcionalmente esse segundo feedback pode ser feito independente da opção do usuário com um temporizador de alguns segundos apenas.]

O som só deve ser reproduzido quando em "Play". [Opcionalmente pode colocar uma opção em que o usuário escuta o som enquanto avança ou retroçede.]

Deverão existir 6 controles do vídeo: "Play/Pause" e "Stop" (Pause em 00:00); "Previous" e "Next Frame" (só quando em "Pause"); "Rewind" e "Fast Forward" (só quando em "Play"). [Opcionalmente pode tocar para tráz "Shift+Space", ir para o final "Shift+Enter", "Shift+"-"" diminui a velocidade de reprodução em uma fração do número de quadros/segundo, "Shift+"+"" aumenta a velocidade de reprodução da mesma forma. "Shift+Esc" volta para o modo normal de reprodução.]

Deve haver uma opção para visualizar informações resumidas sobre o vídeo. E uma opção para ver informações sobre o trabalho: AVI Player 1.0, nome do autor e data.

Você deve ainda escolher o toolkit de interface com o usuário. E organizar o código do módulo principal.

[Opcionalmente poderíamos ter um menu que mostrasse as outras seqüências de vídeo e som no arquivo.]

Os módulos opcionais só devem ser implementados depois do término de todo o trabalho incluindo a documentação. Os módulos opcionais podem contar pontos extras.

Menu

O primeiro item é apenas decorativo e deve estar desativado.

AVI Player
----------
File Open...\tCtrl+O
File Info...
----------
View  ->     Counter
Control  ->  Play/Pause\tSpace
             Stop\tEnter
             -----------
             Previous Frame\t{Left}
             Next Frame\t{Right}
             -----------
             Rewind\t{LessThan}
             Fast Forward\t{GreaterThan}
----------
Statistics...
About...
Exit\tEsc

Substitua o texto entre chaves pelo caracter da tecla correspondente.

Menu para os módulos opcionais:

AVI Player
----------
File Open...\tCtrl+O
File Info...
----------
View  ->     Counter
             -----------
             Zoom...\t
             Inc Zoom\t+
             Dec Zoom\t-
             -----------
             Fit Full Screen
Control  ->  Play/Pause\tSpace
             Stop\tEnter
             -----------
             Previous Frame\t{Left}
             Next Frame\t{Right}
             -----------
             Rewind\t{LessThan}
             Fast Forward\t{GreaterThan}
             -----------
             Frame Rate...\t
             Inc Frame Rate\tShift+"+"
             Dec Frame Rate\tShift+"-"
             Forward/Backward\tShift+Space
----------
Statistics...
About...
Exit\tEsc

Retorna para a página do curso: INF1378.