Você está na página 1de 191

TIAGO CESAR KATCIPIS

INSERCAO DE METADADOS REFERENTES A DETECCAO DE PADROES NO H.264

Florian polis o 15 de Julho de 2011

TIAGO CESAR KATCIPIS

INSERCAO DE METADADOS REFERENTES A DETECCAO DE PADROES NO H.264

Trabalho de Conclus o de Curso submetido ao a Programa de graduacao da Universidade Fede ral de Santa Catarina para a obtencao do Grau de Bacharel em Ci ncias da Computacao. e

Orientador: Ant nio Augusto Fr hlich o o Coorientador: Paulo Jorge C mara Pizarro a

U NIVERSIDADE F EDERAL DE S ANTA C ATARINA C ENTRO T ECNOL OGICO D EPARTAMENTO DE I NFORM ATICA E E STATSTICA I

Florian polis o 15 de Julho de 2011

AGRADECIMENTOS

Primeiramente gostaria de agradecer a minha amada esposa e melhor amiga Stephanie, que ` al m de me mostrar o real signicado do amor e me apresentar a felicidade de uma maneira e que eu nao conhecia, cooperou no desenvolvimento do trabalho desde o seu incio, suportando amorosamente a minha aus ncia, se sobrecarregando com trabalho (inclusive o de revisar esse e texto) permitindo que eu me dedicasse integralmente ao desenvolvimento do mesmo. Aos meus pais agradeco por todo o esforco e sacrifcio que zeram para que eu pudesse chegar aqui, sem eles eu certamente n o teria oportunidade de realizar este trabalho nem de a viver todas as experi ncias maravilhosas que tive at hoje. e e Ao professor Guto agradeco pela ajuda na escolha de um tema que al m de interessante e tamb m e relacionado ao meu trabalho, e pela orientacao em momentos crticos, onde o camie nho a se seguir n o era t o claro. a a Pela oportunidade de desenvolver este trabalho em parceria com a Dgitro agradeco ao Rafael Pina que acreditou na proposta do trabalho e ao Paulo Pizarro, que al m de acreditar no e trabalho, co-orientou ele, fornecendo ajuda valiosa em decis es crticas ao longo do projeto e o na formulacao do texto nal. Agradeco ao Mateus Ludwich pela ajuda fundamental no desenvolvimento do trabalho, aju dando a escolher o melhor rumo a seguir em momentos crticos, esclarecendo d vidas a respeito u do software de refer ncia do H.264, revisando o texto, revisando apresentacoes, apontando mee lhoramentos que podiam ser feitos. Certamente o resultado n o teria sido o mesmo sem a sua a ajuda. Pelas correcoes na apresentacao e no texto nal agradeco tamb m ao Hugo Marcondes. e Ao Alexis Tourapis devo um agradecimento pela ajuda no entendimento de estruturas de dados e funcoes importantes do codicador do software de refer ncia do H.264. e Acima de tudo agradeco a Jeov Deus, o dador de toda boa d diva e todo presente per a a feito. (Tiago 1:17)

RESUMO

Para realizar o armazenamento e transmiss o de vdeo tem se utilizado cada vez mais codia cadores, dentre esses codicadores se destaca o MPEG 4 parte 10, tamb m conhecido como e H.264. Este trabalho integra um classicador Haar ao codicador de refer ncia do padr o e a MPEG 4 parte 10 para realizar a deteccao de objetos e explora o algoritmo de estimativa de movimento do codicador para realizar o tracking do objeto. Os objetos detectados e as informacoes de tracking s o representados na forma de metadados e s o transportados no bits a a tream do vdeo utilizando mensagens Supplemental Enhancement Information. No decodicador de refer ncia esses metadados s o recuperados e apresentados de forma sae a tisfat ria a m de realizar a constatacao do bom funcionamento da implementacao de deteccao o de objetos no codicador. Os testes realizados mostram que o codicador gerou vdeos em conformidade com o padr o MPEG 4 parte 10, junto com um desempenho computacional saa tisfat rio. Os resultados obtidos no decodicador, ao recuperar os metadados e apresent -los, o a tamb m foram satisfat rios mostrando a viabilidade de construir um sistema de tracking de e o objetos embutido no codicador.

ABSTRACT

To store and transmit video the use of encoders has been increasing, MPEG 4 part 10, also known as H.264, stands out among these encoders. This work integrates the Haar classier to the reference MPEG 4 part 10 encoder to detect objects and explores the motion estimation algorithm of the encoder to track the detected objects. Detected objects and tracking information are represented in the form of metadata and bitstream are transported in the video messages using Supplemental Enhancement Information. In the reference decoder, metadata is retrieved and presented in order to satisfactorily carry out the verication of the proper functioning of the object detection implemented in the encoder. The tests showed that the generated video is in accordance with the MPEG 4 part 10, together with a satisfactory computational performance. The results obtained in the decoder, retrieving the metadata and presenting them, were also satisfactory, showing the viability of building a object tracking system embedded on the encoder.

LISTA DE FIGURAS

Figura 1 Padr es de amostragem 4:2:0, 4:2:2, 4:4:4 (progressivo). . . . . . . . . . . . . . . . . . . . o

Figura 2 Tpico codicador H.264 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Figura 3 Tpico decodicador H.264 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Figura 4 Encapsulamento de elementos de sintaxe do H.264 em um NALU . . . . . . . . . . . . 12 Figura 5 Exemplo de 3 NALUs sendo transmitidos/armazenados com orientacao a bits tream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Figura 6 Exemplo de 3 NALUs sendo transmitidos/armazenados com orientacao a paco tes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Figura 7 Possveis classicacoes de um NALU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Figura 8 Exemplo de mensagens SEI encapsuladas em um SEI NALU . . . . . . . . . . . . . . . . 14 Figura 9 Cascata de rejeicao utilizada no classicador Viola-Jones: Cada nodo representa um classicador Multitree AdaBoostedtreinado para raramente perder o objeto de interesse, rejeitando por m apenas uma pequena parte das regi es que e o n o representam o objeto de interesse. At chegar o nal da cascata a maior a e parte das regi es que n o representam o objeto de interesse j foram descartao a a das. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Figura 10 Diagrama de classe dos objetos denidos no m dulo extracted metadata. . . . . . 24 o Figura 11 Metadado serializado dentro de um NALU do tipo SEI. Cabecalho em verde, payload em azul. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Figura 12 Objeto ExtractedYImage serializado dentro de um NALU do tipo SEI. Cabecalho em verde, payload em azul. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Figura 13 Objeto ExtractedObjectBoundingBox serializado dentro de um NALU do tipo SEI. Cabecalho em verde, payload em azul. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Figura 14 Exemplo de problemas que podem ocorrer na recuperacao dos metadados se eles forem inseridos de maneira errada no bitstream. Metadados em verde, quadros em vermelho. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Figura 15 Fluxograma do m todo extract object bounding box. . . . . . . . . . . . . . . . . . . . . . . . 32 e Figura 16 Exemplo do funcionamento da histerese de busca. . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Figura 17 Exemplo do funcionamento da histerese de tracking. . . . . . . . . . . . . . . . . . . . . . . . . 33 Figura 18 Comparacao entre as coordenadas dos blocos (em azul) da estimativa de movi mento e as coordenadas reais (em vermelho) que elas representam. . . . . . . . . . . 36 Figura 19 Como os vetores de movimento de um bloco representam a sua movimentacao no vdeo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Figura 20 Estimativa de movimento de um objeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Figura 21 Vis o geral do codicador H.264 modicado. Os blocos vermelhos representam a os processos adicionados ao codicador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Figura 22 Vis o geral do decodicador H.264 modicado. Os blocos vermelhos represena tam os processos adicionados ao decodicador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Figura 23 Face detectada no vdeo Akiyo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Figura 24 Face detectada no vdeo Crew. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Figura 25 Face detectada no vdeo Foreman. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Figura 26 Face detectada no vdeo Pedestrian area. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Figura 27 Face detectada no vdeo Speed bag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

LISTA DE TABELAS

Tabela 1 Desempenho do sistema com o vdeo Akiyo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Tabela 2 Desempenho do sistema com o vdeo Coast Guard. . . . . . . . . . . . . . . . . . . . . . . . . . 53 Tabela 3 Desempenho do sistema com o vdeo Crew. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Tabela 4 Desempenho do sistema com o vdeo Foreman. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Tabela 5 Desempenho do sistema com o vdeo Pedestrian area. . . . . . . . . . . . . . . . . . . . . . . 58 Tabela 6 Desempenho do sistema com o vdeo Pedestrian area - 720p. . . . . . . . . . . . . . . . . 61 Tabela 7 Desempenho do sistema com o vdeo Speed bag - 1080p. . . . . . . . . . . . . . . . . . . . . 63 Tabela 8 Desempenho do sistema com o vdeo Speed bag - 720p. . . . . . . . . . . . . . . . . . . . . . 65

LISTA DE ABREVIATURAS E SIGLAS

H.264 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Padr o de compress o de vdeo a a MPEG-4 Parte 10 . . . . . . . . . Padr o de compress o de vdeo, tamb m conhecido como H.264 a a e H.263 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Padr o de compress o de vdeo a a VLC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variable Length Coding VCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Video Coding Layer AVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Advanced Video Coding, tamb m conhecido como H.264 e CCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Charged Coupled Device 4:2:0(amostragem) M todo de amostragem: Componentes de cromin ncia possuem metade e a da resolucao horizontal e vertical do componente de lumin ncia a 4:2:2(amostragem) M todo de amostragem: Componentes de cromin ncia possuem metade e a da resolucao horizontal do componente de lumin ncia a 4:4:4(amostragem) M todo de amostragem: Componentes de cromin ncia possuem mesma e a resolucao que o componente de lumin ncia a CODEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Par de COder / DECoder, codicador e decodicador OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Open Computer Vision JM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Joint Model SEI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Supplemental Enhancement Information MPEG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Motion Picture Experts Group, um comit da ISO/IEC e MPEG-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Padr o de compress o multimedia a a MPEG-2 TS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MPEG-2 Transport Stream MPEG-4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Padr o de compress o multimedia a a ISO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . International Standards Organization ISO/IEC . . . International Standards Organization/International Electrotechnical Commission ITU-T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . International Telecommunication Union NAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Network Abstraction Layer NALU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Network Abstraction Layer Unit RBSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Raw Byte Sequence Payload UUID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Universally Unique Identier QPel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quarter Pel renement FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Field-programmable Gate Array

SUMARIO

1 INTRODUCAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 1.1.1 1.1.2 1.2 OBJETIVOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . OBJETIVO GERAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . OBJETIVOS ESPECIFICOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ESTRUTURA DO TRABALHO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1 2 2 2 2 4 4 4 7

2 REVISAO TEORICA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 2.1.1 2.2 2.2.1 V IDEO DIGITAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ESPACOS DE COR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CODIFICACAO DE V IDEO DIGITAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PREDICAO DE UM MACROBLOCO UTILIZANDO COMPENSACAO DE MOVI MENTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.2 2.2.3 2.3 2.3.1 2.3.2 2.4 2.4.1 2.4.2 2.4.3 ESTIMATIVA DE MOVIMENTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . COMPENSACAO DE MOVIMENTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MPEG 4 PARTE 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8 9 9 9

SINTAXE GERAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 SUPPLEMENTAL ENHANCEMENT INFORMATION . . . . . . . . . . . . . . . . . . . . . . . . . . 13 CLASSIFICADOR HAAR - OPENCV. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 INTRODUCAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 TEORIA DO CLASSIFICADOR VIOLA-JONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 USO DO CLASSIFICADOR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3 PROJETO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.1 3.1.1 3.1.2 3.1.3 3.2 3.2.1 3.2.2 3.2.3 3.2.4 3.3 3.3.1 3.3.2 3.3.3 3.4 3.4.1 3.4.2 3.4.3 3.5 3.5.1 3.5.2 4 4.1 4.2 4.3 4.4 4.5

INSERINDO USERDATA NO BITSTREAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 AMBIENTE DE TESTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 ENVIANDO UMA MENSAGEM SEI USERDATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 ENVIANDO DIVERSAS MENSAGENS SEI USERDATA DE TAMANHO VARIADO 21 MODULO EXTRACTED METADATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 EXTRACTED METADATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 EXTRACTED Y IMAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 EXTRACTED OBJECT BOUNDING BOX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 EXTRACTED METADATA BUFFER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 MODULO METADATA EXTRACTOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 METADATA EXTRACTOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 UTILIZANDO O CLASSIFICADOR HAAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 REALIZANDO ESTIMATIVA DE MOVIMENTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 ALTERACOES REALIZADAS NO CODIFICADOR . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 PROCESSANDO O QUADRO BRUTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 OBTENDO ESTIMATIVA DE MOVIMENTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 CONFIGURACOES ADICIONADAS AO CODIFICADOR . . . . . . . . . . . . . . . . . . . . . 45 ALTERACOES REALIZADAS NO DECODIFICADOR . . . . . . . . . . . . . . . . . . . . . . . . 46 RECUPERANDO METADADOS A PARTIR DO BITSTREAM . . . . . . . . . . . . . . . . . . 47 APLICANDO O METADADO AO QUADRO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

TESTES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 V IDEO AKIYO - QCIF - 300 QUADROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 IDEO COAST GUARD - QCIF - 300 QUADROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 V V IDEO CREW - CIF - 300 QUADROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 V IDEO FOREMAN - CIF - 300 QUADROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 V IDEO PEDESTRIAN AREA - 375 QUADROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

4.5.1 4.5.2 4.6 4.6.1 4.6.2 4.7 5 5.1

TESTES COM RESOLUCAO 1080P (1920 X 1080) . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 TESTES COM RESOLUCAO 720P (1280 X 720) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 V IDEO SPEED BAG - 570 QUADROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 TESTES COM RESOLUCAO 1080P (1920 X 1080) . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 TESTES COM RESOLUCAO 720P (1280 X 720) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 CONCLUSAO DA AVALIACAO DO SISTEMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

CONCLUSOES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 TRABALHOS FUTUROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

REFERENCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 6 APENDICE A CODIGO FONTE DO PROCEDIMENTO DE TESTE DA INSERCAO DE NALUS SEI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 6.1 6.1.1 6.1.2 6.2 6.2.1 6.2.2 6.3 6.3.1 6.3.2 6.4 6.4.1 MODULO ADICIONADO AO CODIFICADOR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 ARQUIVO UDATA GEN.H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 ARQUIVO UDATA GEN.C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 ALTERACOES NO CODIFICADOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 ARQUIVO FILEHANDLE.C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 ARQUIVO LENCOD.C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 MODULO ADICIONADO AO DECODIFICADOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 ARQUIVO UDATA PARSER.H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 ARQUIVO UDATA PARSER.C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 ALTERACOES NO DECODIFICADOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 ARQUIVO SEI.C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

7 APENDICE B CODIGO FONTE DO MODULO EXTRACTED METADATA . . 90 7.1 7.2 EXTRACTED METADATA.H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 EXTRACTED METADATA.C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

8 APENDICE C CODIGO FONTE DO MODULO METADATA EXTRACTOR . .112 8.1 8.2 METADATA EXTRACTOR.H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .112 METADATA EXTRACTOR.C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .116

9 ANEXO A CODIGO FONTE DO CODIFICADOR DO SOFTWARE DE RE FERENCIA - ALTERACOES REALIZADAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129 9.1 9.2 9.3 9.4 ALTERACOES REALIZADAS NO ARQUIVO LENCOD/INC/CONFIGFILE.H . . .129 ALTERACOES REALIZADAS NO ARQUIVO LENCOD/INC/GLOBAL.H . . . . . . .131 ALTERACOES REALIZADAS NO ARQUIVO LENCOD/SRC/LENCOD.C . . . . . . .132 ALTERACOES REALIZADAS NO ARQUIVO LENCOD/SRC/IMAGE.C . . . . . . . . 133

10 ANEXO B CODIGO FONTE DO DECODIFICADOR DO SOFTWARE DE RE FERENCIA - ALTERACOES REALIZADAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .144 10.1 ALTERACOES REALIZADAS NO ARQUIVO LDECOD/INC/GLOBAL.H . . . . . . .144 10.2 ALTERACOES REALIZADAS NO ARQUIVO LDECOD/SRC/DECODER TEST.C144 10.3 ALTERACOES REALIZADAS NO ARQUIVO LDECOD/SRC/OUTPUT.C . . . . . . . 146 10.4 ALTERACOES REALIZADAS NO ARQUIVO LDECOD/SRC/SEI.C . . . . . . . . . . . .157 11 ANEXO C CODIGO FONTE DO MODULO COMMON DO SOFTWARE DE REFERENCIA - ARQUIVOS MODIFICADOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .161 11.1 ALTERACOES REALIZADAS NO ARQUIVO LCOMMON/INC/PARAMS.H . . . . 161 12 ANEXO D ALTERACOES REALIZADAS NA CONFIGURACAO DO CODI FICADOR DO SOFTWARE DE REFERENCIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174

INTRODUCAO

Atualmente tem se tornado comum, em solucoes de seguranca, o uso de deteccao de padr es o como deteccao facial, deteccao de objetos especcos, cercas virtuais, alarmes, etc. Dispositivos de gravacao de vdeo em alta denicao est o se tornando cada vez mais acessveis, estando a presentes at mesmo em celulares, por m como e invi vel dispor de longos trechos de vdeo e e a em alta resolucao sem compactacao pois estes consomem um grande espaco de armazenamento e n o e possvel transmiti-los em larga escala com os meios de comunicacao existentes, esses a vdeos em alta denicao s o usualmente compactados. a A maior parte dos algoritmos de identicacao de objetos e algoritmos biom tricos traba e lham com informacoes n o codicadas, nesse caso, o processamento de m ltiplos vdeos exigi a u ria que esses vdeos fossem decodicados primeiro e ent o processados. Alguns algoritmos de a identicacao de objetos trabalham com informacoes codicadas, um exemplo e o detector de faces proposto em [1], mas na conclus o do mesmo e possvel se observar que apesar do resula tado ser satisfat rio, o processamento em um identicador de objetos utilizando informacoes o brutas foi superior (no caso a comparacao foi realizada com o classicador Haar do OpenCV). Considerando que a busca por objetos de interesse fosse realizada no vdeo compactado (n o sendo necess rio decodicar o vdeo), em um caso de uso como o de um aeroporto onde a a existem muitas c meras de seguranca, ainda seria necess rio um grande poder computacional a a para realizar a busca de objetos de interesse em todos vdeos ao mesmo tempo, j que normal a mente se espera que um sistema de seguranca tenha um tempo de resposta r pido. a Dessa maneira e interessante obter a maior quantidade possvel de metadados a respeito de objetos de interesse, na fonte do vdeo, de maneira integrada ao processo de codicacao, reaproveitando ao m ximo qualquer informacao que o processo de codicacao possa fornecer. a Ao inv s de analisar os vdeos, ser realizada uma an lise dos metadados. Se um vdeo muito e a a longo n o possui nenhum metadado, n o ser necess rio analis -lo. Como metadados podea a a a a se citar a presenca de um objeto de interesse (sua posicao e tamanho), padr es de movimento o ( til em cercas virtuais) ou o objeto de interesse em alta resolucao n o compactado (facilita o u a

processamento posterior desse objeto em um algoritmo biom trico). e Ao utilizar ao m ximo as informacoes que o pr prio codicador gera para realizar a identicacao a o de padr es e interessante transportar os metadados gerados dentro do pr prio bitstream do o o vdeo, isso facilita o desenvolvimento de um chip codicador na solucao, pois n o e necess rio a a que os metadados encontrados sejam enviados a aplicacao para serem transportados de outra maneira. No presente trabalho ser realizado um estudo da integracao de um algoritmo de deteccao a de padr es com as informacoes de estimativa de movimento calculadas pelo codicador MPEG o 4 parte 10, gerando um tracker de objetos, capaz de enviar tamb m objetos de interesse n o e a compactados.

1.1 OBJETIVOS
1.1.1 OBJETIVO GERAL Modicar um codicador H.264 para torn -lo capaz de detectar e realizar o tracking de a objetos, utilizando um detector de padr es e informacoes de estimativa de movimento, e inserir o essas informacoes como metadados no pr prio bitstream de vdeo. o 1.1.2 OBJETIVOS ESPECIFICOS Detectar e enviar objetos de interesse n o comprimidos na forma de metadados, uteis para a um p s-processamento. o Realizar o tracking de objetos de interesse durante o processo de codicacao do vdeo, utilizando informacoes de estimativa de movimento calculadas pelo pr prio codicador o para auxiliar o tracking. Inserir os metadados obtidos no processo de codicacao diretamente no bitstream do vdeo H.264 sem alterar o vdeo e a conformidade dele com o padr o. a Recuperar os metadados no processo de decodicacao e apresent -los de forma util. a

1.2 ESTRUTURA DO TRABALHO


Os captulos que seguem est o organizados da seguinte maneira. No captulo 2 apresenta-se a a fundamentacao te rica do trabalho, sendo dividida em 3 secoes principais. A secao 2.1 traz o

uma vis o dos conceitos gerais de vdeo digital, da necessidade de compress o do mesmo e de a a compress o de vdeo em geral. A secao 2.2 traz conceitos gerais a respeito de codicacao de a vdeo. A secao 2.3, realiza um estudo do padr o de compress o de vdeo MPEG-4 parte 10, a a focando na insercao de metadados no bitstream. Na secao 2.4 e descrito em detalhes o algoritmo de deteccao de objetos utilizado no trabalho. O captulo 3 descreve o desenvolvimento pr tico do trabalho, sendo dividido em 6 secoes. a A secao 3.1 fala sobre o uso pr tico das mensagens SEI Unregistered Userdata no software a de refer ncia, incluindo testes de insercao e recuperacao das mensagens no bitstream. A secao e a 3.2 fala a respeito do m dulo extracted metadata, onde s o denidos os tipos de metadados o utilizados ao longo do trabalho e como eles s o serializados e desserializados. a A secao 3.3 explica o m dulo metadata extractor, onde e realizada tanto a deteccao como o o tracking de objetos. A secao 3.4 explica em detalhes as alteracoes realizadas no codicar de refer ncia para integrar o codicador com os m dulos extracted metadata e metadata extrace o tor. A secao 3.5 detalha as alteracoes realizadas no decodicador de refer ncia para realizar a e apresentacao dos metadados inseridos no bitstream. O captulo 4 descreve e apresenta os resultados dos testes realizados no sistema proposto. O captulo 5 faz as consideracoes nais e conclui o trabalho.

REVISAO TEORICA

2.1 VIDEO DIGITAL


Como consta em [2], vdeo digital e a representacao de uma cena do mundo real, amostrada espacialmente e temporalmente. Tipicamente uma cena e amostrada em um certo ponto no tempo para produzir um quadro, que representa a cena inteira naquele ponto no tempo. A amostragem e realizada em intervalos (ex. 1/25 ou 1/30 vezes por segundo). Uma cena do mundo real costuma ser composta de m ltiplos objetos, cada um com suas u pr prias caractersticas como forma, profundidade, textura e iluminacao. A cor e o brilho de o uma cena pode variar com diferentes graus de lisura ao longo da cena. As caractersticas de uma cena mais relevantes para o processamento e compress o de vdeo incluem caractersticas a espaciais como variacao de textura na cena, quantidade de forma dos objetos, cor, etc, e carac tersticas temporais como o movimento de um determinado objeto, mudancas na iluminacao e no movimento da c mera. a Usualmente uma cena e amostrada espacialmente sendo representada como uma grade re tangular ou quadrada, o n mero de pontos amostrados no momento da captura inu ncia a u e qualidade nal da imagem. Essa quantidade de pontos amostrados normalmente e chamada de resolucao da imagem. Uma vdeo em movimento e formado por se tirar retratos retangulares do sinal anal gico o que est sendo capturado em intervalos de tempo peri dicos. Reproduzir uma s rie desses a o e retratos ou quadros produz uma apar ncia de movimento. Uma taxa de amostragem alta fornece e uma apar ncia de movimento mais suave, mas requer que mais amostras sejam capturadas e e armazenadas. 2.1.1 ESPACOS DE COR A maior parte das aplicacoes de vdeo precisam representar cores, portanto precisam de um mecanismo de captura e representacao de informacoes de cor. Uma imagem monocrom tica a

requer apenas um n mero para indicar o brilho ou lumin ncia de cada amostra espacial. Por m u a e imagens coloridas necessitam de no mnimo tr s n meros por pixel para representar a cor de e u forma precisa. O m todo escolhido para representar brilho, lumin ncia ou luma e cor e descrito e a como espaco de cor. Um dos espacos de cor mais conhecidos e o RGB, nesse formato uma amostra de imagem colorida e representada por tr s n meros que indicam a porcao de vermelho, verde e azul, as 3 e u cores prim rias. Combinar essas tr s cores pode produzir qualquer outra cor, dessa maneira o a e espaco de cor RGB consegue capturar e exibir imagens coloridas com sucesso. Capturar uma imagem RGB envolve ltrar os componentes vermelho, verde e azul de cada cena sem sensores separados (normalmente s o utilizados CCDs na captura de imagens). Displays coloridos a exibem uma imagem RGB por iluminarem o componente vermelho, verde e azul de cada pixel de acordo com a intensidade de cada componente de cor. De uma distancia normal, esses componentes separados se misturam e formam a apar ncia de uma cor de verdade. e Apesar de tamb m ser muito utilizado, o espaco de cor RGB n o e o mais bem adaptado e a a vis o humana, que e mais sensvel a lumin ncia do que a cor, dessa maneira o RGB acaba a a ignorando informacoes importantes para a vis o humana (lumin ncia) e armazenando outras a a menos importantes (cores). E possvel guardar uma cor de maneira mais eciente por separar a informacao de lumin ncia da informacao de cor e representar a informacao de lumin ncia a a (tamb m chamada de luma) com um resolucao mais alta. e O espaco de cor Y:Cr:Cb normalmente e utilizado para representar cores de forma eciente, otimizando as informacoes para serem mais relevantes a vis o humana. Nesse espaco de cor o ` a Y representa a lumin ncia e pode ser calculado como a m dia ponderada dos valores do canal a e R,G e B.

Y = krR + kgG + kbB onde k s o os pesos para cada canal. a

(2.1)

A informacao de cor pode ser representada como componentes de diferenca de cor (cro min ncia ou croma). Onde cada componente de cromin ncia e a diferenca entre R,G ou B e a a a lumin ncia Y: a

Cr = R Y

(2.2)

Cb = B Y

(2.3)

Cg = G Y

(2.4)

Como Cr + Cb + Cg e uma constante somente dois dos valores de cromin ncia precisam a ser armazenados ou transmitidos, j que o terceiro componente pode ser calculado a partir dos a outros dois. No Y:Cr:Cb somente o luma (Y) e o croma vermelho e azul s o transmitidos. a Os componentes de croma Cr e Cb podem ser representados com uma resolucao menor que o luma j que o olho humano e menos sensvel a cor do que a luz. Dessa maneira reduzimos a a ` quantidade necess ria para representar os componentes de cromin ncia sem ter efeitos muito a a obvios na qualidade visual. O YCbCr possui tr s modos de amostragem suportados pelo H.264, esses modos s o o e a 4:2:0, 4:2:2, 4:4:4. No 4:4:4 para cada quatro amostras de lumin ncia temos quatro Cr e quatro a Cb, no 4:2:2, tamb m conhecido como YUY2, os componentes de cromin ncia possuem a e a mesma resolucao vertical que a lumin ncia mas metade da resolucao horizontal, 4:2:2 signica a assim que para cada quatro amostras de lumin ncia na direcao horizontal existem duas amostras a de Cr e duas de Cb. 4:2:2 normalmente e utilizado para reproducao de vdeos em alta qualidade de cor.

Figura 1: Padr es de amostragem 4:2:0, 4:2:2, 4:4:4 (progressivo). o

O formato mais popular para codicacao de vdeo, normalmente utilizado em aplicacoes como vdeo confer ncia, televis o digital e DVD e o 4:2:0, tamb m conhecido como YV12, Cr e e a e Cb possuem metade da resolucao horizontal e vertical do Y. Cada componente de cor possui um quarto das amostras que existem no componente luma, dessa maneira um vdeo 4:2:0 necessita da metade das amostras necess rias em um vdeo 4:4:4 ou RGB. As diferencas entre cada um a dos formatos pode ser melhor vista em []

2.2 CODIFICACAO DE V IDEO DIGITAL


Como consta em [2], compress o e o ato ou processo de compactar dados em um menor a n mero de bits que o original. Compress o de vdeo e o processo de converter vdeo digital em u a um formato mais adequado para envio ou armazenamento. A compress o baseia-se na remocao a

de redund ncia, removendo assim componentes que n o s o necess rios para a reproducao do a a a a vdeo, normalmente utiliza-se uma abordagem de compactacao com perda, buscando remover redund ncia temporal e espacial. a No domnio temporal existe uma alta correlacao entre quadros que foram capturados em instantes similares de tempo, principalmente quando a taxa de amostragem e alta, existindo muita informacao redundante que pode ser removida entre esses quadros. No domnio espacial existe uma correlacao entre os pixels que est o perto um do outro, sendo mais uma fonte de a informacoes redundantes que pode vir a ser comprimida. Por isso normalmente os modelos de CODEC, como o H.264, MPEG-2 Vdeo, MPEG-4 Visual, H.263, VC-1, etc, utilizam predicao e/ou compensacao de movimento para remover redund ncia inerente tanto no pr prio quadro (espacial) como entre quadros (temporal). Este a o trabalho e realizado no m dulo de predicao que tem por objetivo formar uma predicao do quadro o e ent o subtrair a predicao deste mesmo quadro, gerando assim uma amostra residual do quadro. a A predicao pode ser formada a partir de quadros que j foram processados (nesse caso ela e a temporal) ou a partir de amostras j processadas do mesmo quadro (nesse caso ela e espacial). a Para realizar a predicao o codicador deve utilizar apenas informacoes que est o disponveis a ao decodicador, ou seja, dados que j foram codicados e transmitidos, sen o o decodicador a a n o ser capaz de reconstruir o quadro, pois ele necessita recriar a mesma predicao feita no a a codicador para adicion -la ao resduo recebido e gerar o quadro. a Com excecao de regi es descobertas e mudancas dr sticas de iluminacao, a maior parte o a das diferencas que ocorrem entre os quadros de um vdeo se d pelo movimento dos pixels a entre os quadros, dessa maneira e possvel calcular a trajet ria de cada pixel entre sucessivos o quadros do vdeo, gerando uma matriz de vetores de movimento para cada pixel. Por m realizar e com precis o esse c lculo para cada pixel exige um esforco computacional muito grande, se a a tornando impratic vel. Para contornar esse problema a estimativa e compensacao de movimento a e realizada em macro blocos e n o por pixel. a 2.2.1 PREDICAO DE UM MACROBLOCO UTILIZANDO COMPENSACAO DE MOVIMENTO O macrobloco, que normalmente corresponde a uma regi o de 16 x 16 pixels de um quadro, a e a unidade b sica do processo de predicao por compensacao de movimento em v rios padr es a a o de codicacao de vdeo como MPEG-1, MPEG-2, MPEG-3, MPEG-4 Visual, H.261, H.263 e H.264. Um macrobloco no formato de vdeo mais comum, que e o 4:2:0, e formado por uma regi o de 16 x 16 pixels, onde temos 256 amostras de lumin ncia organizadas em 4 blocos de 8 a a x 8 pixels, 64 amostras de cromin ncia vermelha em um bloco de 8 x 8 pixels e 64 amostras de a

cromin ncia azul tamb m arranjadas como um bloco de 8 x 8. No H.264 cada quadro de vdeo a e e processado como um conjunto de macroblocos. 2.2.2 ESTIMATIVA DE MOVIMENTO A estimativa de movimento de um macrobloco envolve,a partir de um quadro de refer ncia e previamente selecionado, encontrar uma regi o 16 x 16 neste quadro que seja o mais semea lhante possvel com o macrobloco atual. O quadro de refer ncia deve ser um quadro que j foi e a codicado e deve ser anterior ou posterior ao quadro atual em relacao a ordem de amostragem. A partir da posicao do macrobloco corrente dene-se uma area de busca por uma outra regi o a que se assemelhe a ele no quadro de refer ncia, dentro dessa area de busca procura-se a regi o e a de 16 x 16 que mais se assemelha com o macrobloco. 2.2.3 COMPENSACAO DE MOVIMENTO As amostras de lumin ncia e cromin ncia da regi o selecionada no quadro de refer ncia a a a e s o subtradas do macrobloco corrente para produzir um macrobloco residual que e codicado a e transmitido junto com um vetor de movimento descrevendo a posicao da regi o selecionada a em relacao a posicao do macrobloco corrente. Existem variacoes no processo de estimativa e compensacao de movimento. O quadro de refer ncia pode ser um quadro anterior, posterior ou uma combinacao da predicao de dois ou e mais quadros que j foram codicados. Se um quadro posterior ao corrente e selecionado, e a necess rio codicar esse quadro antes que o corrente, ou seja os quadros ter o de ser codia a cados fora da ordem de apresentacao. Quando ocorre uma mudanca brusca entre o quadro de refer ncia e o quadro corrente, por exemplo uma grande area foi descoberta, pode ser mais e eciente codicar o macrobloco sem realizar a compensacao de movimento. Dessa maneira o codicador pode utilizar predicao interna (espacial) ou a predicao externa com compensacao de movimento para cada macrobloco de acordo com a situacao do quadro corrente.

2.3 MPEG 4 PARTE 10


O MPEG 4 Parte 10 (tamb m conhecido como H.264 ou AVC) e um padr o de compress o e a a de vdeo documentado e publicado por duas organizacoes padronizadoras, a ITU-T e a ISO/IEC [3]. Um codicador H.264 funciona realizando predicao, transformacao e codicacao do resul tado nal, produzindo assim um bitstream. O decodicador realiza o processo complementar,

10

decodicando a informacao, realizando uma transformada inversa e reconstrucao dos quadros previamente codicados.

Figura 2: Tpico codicador H.264

Figura 3: Tpico decodicador H.264

Todas as informacoes produzidas pelo codicador tem de ser codicadas e comprimidas em um bitstream que possa ser armazenado/transmitido para ser decodicado posteriormente. Essas informacoes incluem: Coecientes gerados pela transformacao (quantizados). Informacao que habilita o decoder a recriar a predicao.

11

Informacao da estrutura dos dados comprimidos, e das ferramentas de compress o utili a zadas no processo de codicacao. Informacao a respeito da sequ ncia de vdeo como um todo. e Esses valores e par metros, tamb m conhecidos como elementos de sintaxe, s o convera e a tidos em c digo bin rio utilizando codicacao de tamanho variado (VLC) e/ou codicacao o a aritm tica. Cada um desses m todos produz uma representacao bin ria eciente e compacta e e a das informacoes. 2.3.1 SINTAXE GERAL H.264 prov uma sintaxe clara de como representar o vdeo comprimido e informacoes e relacionadas ao vdeo, essa sintaxe e hier rquica. No nvel mais alto, uma sequ ncia H.264 a e consiste de uma s rie de pacotes ou Network Abstraction Layer Units (NALUs). e Um NALU (Network Abstraction Layer Unit) contem um RBSP (Raw Byte Sequence Payload), que e uma sequ ncia de bytes contendo os elementos da sintaxe. No H.264 os elementos e da sintaxe s o c digos bin rios de tamanho variado, portanto uma sequ ncia de elementos de a o a e sintaxe dentro de um NALU n o vai necessariamente possuir um n mero de bits divisivel por a u 8, bits com valor zero s o adicionados ao nal do RBSP para garantir que a quantidade de bits a e dvisivel por 8 (esta t cnica e chamada de padding). e Cada NALU consiste de um cabecalho de 1 byte, seguido de um stream de bytes con tendo informacoes de controle ou vdeo codicado. O cabecalho indica o tipo do NALU e a import ncia dele. NALUs utilizados como refer ncia, por exemplo na predicao de quadros a e futuros, s o considerados como de alta prioridade, j que a perda de um desses poderia dicultar a a o processo de decodicacao. J os NALUs que n o s o utilizados como refer ncia s o conside a a a e a rados como tendo uma prioridade mais baixa. Esse tipo de informacao pode ser utilizada para priorizar os NALUs mais importantes no momento da transmiss o. a

12

Figura 4: Encapsulamento de elementos de sintaxe do H.264 em um NALU

De acordo com [4] p gina 563, um NALU pode ser transmitido usando um protocolo de a transporte, onde cada NALU se torna o payload do pacote (orientado a pacote), ou em um stream de bytes, onde cada NALU ser transmitido sequencialmente em uma s rie de bytes a e (orientado a byte stream), utilizando como prexo um c digo de inicio (start code) de 3 bytes o indicando que est comecando um novo NALU no bitstream. a Sempre que ocorre de uma sequ ncia de 3 bytes ser similar ao start code, e inserido um e emulation prevention byte para prevenir que o decoder confunda essa sequ ncia de bytes com e um start code. Quando se utiliza orientacao a pacote e desnecess ria a utilizacao do start code a e do emulation prevention byte. A sintaxe completa de um NALU pode ser encontrada em [3] secao 7.3.1 e sua sem ntica na secao 7.4.1. a
NALU 1 NALU 2 NALU 2 NALU 3

Start code prefix (3 bytes)

Start code prefix (3 bytes)

Emulation prevention byte

Start code prefix (3 bytes)

Figura 5: Exemplo de 3 NALUs sendo transmitidos/armazenados com orientacao a bitstream

Figura 6: Exemplo de 3 NALUs sendo transmitidos/armazenados com orientacao a pacotes

Como consta em [4] p gina 564, NALUs podem ser classicados como VCL (pertencem a ao video coding layer) ou n o-VCL NALUs (n o pertencem a Video Coding Layer). a a

13

NALUs VCL possuem as amostras de vdeo (slices) enquanto que NALUs n o-VCL pos a suem informacoes adicionais associadas ao vdeo como par metros (Parameter Sets) que for a necem informacoes de controle ao decodicador ou SEI (Supplemental Enhancement Informa tion). Os Parameter Sets existentes s o os SPS (Sequence Parameter Sets), que podem ser aplia cados a uma inteira sequ ncia de vdeo, e os PPS (Picture Parameter Sets) que s o aplic veis e a a somente a um ou mais quadros de uma determinada sequ ncia, mas n o todos. e a

Figura 7: Possveis classicacoes de um NALU

2.3.2 SUPPLEMENTAL ENHANCEMENT INFORMATION Como consta em [3] cl usula 7.4.2.3, SEI (Supplemental Enhancement Information) NAa LUs cont m informacoes que n o s o essenciais ao processo de decodicacao mas que poe a a dem ser utilizadas para auxiliar a decodicacao. Um NALU do tipo SEI pode conter uma ou mais mensagens SEI dentro do seu RBSP. A sub-cl usula 7.3.2.3 dene a sintaxe do RBSP de a um NALU do tipo SEI, mais informacoes sobre SEI podem ser encontrados no anexo D da recomendacao.

14

Figura 8: Exemplo de mensagens SEI encapsuladas em um SEI NALU

N o existe um limite m ximo no tamanho de um SEI NALU, por m existem algumas a a e limitacoes de buffer que podem resultar em um limite implcito no tamanho do SEI NALU (tabela A.1 do anexo A da [3] traz os limites que podem existir de acordo com o nvel/perl que o codicador implemente). A sub-cl usula 7.3.2.3.1 da recomendacao [3] dene a sintaxe de uma mensagem SEI e a a sub-cl usula 7.4.2.3.1 dene a sua sem ntica, nestas sub-cl usulas pode se encontrar informacoes a a a mais detalhadas de como o decodicador consegue obter o tamanho das mensagens SEI. Uma mensagem SEI e composta basicamente do tipo do payload e o pr prio payload. Nor o malmente as mensagens SEI s o utilizadas para auxiliar o processo de decodicacao, por isso a existem v rios tipos de mensagens pr -denidas. a e Uma mensagem SEI do tipo UserData pode carregar qualquer tipo de dados de aplicacao. Existem dois tipos de mensagem SEI UserData, a registrada e a n o registrada, ambas podem a possuir dados que n o s o denidos na recomendacao [3]. Na mensagem SEI UserData regisa a trada a mensagem deve ser precedida por um c digo registrado na ITU-T e a mensagem deve o seguir a sintaxe e a sem ntica estipuladas por esse c digo informado. a o J a mensagem SEI UserData n o registrada necessita de um UUID (Universally unia a que identier, ou seja um identicador unico para a mensagem) precedendo a mensagem e o conte do da mensagem n o precisa obedecer nenhuma sintaxe ou sem ntica especca. A u a a sintaxe do payload de uma mensagem SEI UserData n o registrada pode ser encontrada em [3] a na secao D.1.6 e a denicao sem ntica na secao D.2.6. a

15

Uma lista completa de todos os tipos de mensagens SEI se encontra em [3] na secao D.1.

2.4 CLASSIFICADOR HAAR - OPENCV


2.4.1 INTRODUCAO OpenCV inclui diversas implementacoes de algoritmos de aprendizagem de m quina (uma a lista completa dos algoritmos disponveis encontra-se em [5] p ginas 462 e 463), que e um a sub-campo da intelig ncia articial que visa transformar dados brutos em informacao, tornando e possvel que a m quina responda a perguntas como: Que outra informacao e similar a esta? a Existe um carro nessa imagem? Um desses algoritmos de aprendizagem de m quina e o classicador Haar, esse algoritmo a e uma implementacao da t cnica conhecida como detector Viola-Jones [6] e que depois foi e estendido por Rainer Lienhart e Jochen Maydt [7]. Ele e um classicador supervisionado (para mais informacoes sobre tipos de classicadores veja [5] p ginas 460 e 461), ou seja, ap s trein a o a lo e necess rio apenas fornecer a imagem ao classicador e ele ir rotular ela como contendo a a ou n o contendo o objeto de interesse. a 2.4.2 TEORIA DO CLASSIFICADOR VIOLA-JONES O detector Viola-Jones utiliza uma forma de AdaBoost ([5] p gina 497) mas o organiza a como uma arvore, onde cada nodo desse e um classicador Multitree AdaBoosted, desenvol vido para ter uma alta (digamos 99,9%) taxa de deteccao (poucos falsos negativos), as custas de uma baixa (perto de 50%) taxa de rejeicao (grande quantidade de falsos positivos). A arvore, que e organizada como uma cascata, funciona como uma cascata de rejeicao, para cada nodo na cascata, um n o pertence a classe encerra a computacao e o algoritmo a responder que n o existe o objeto de pesquisa na regi o determinada para busca. A regi o s a a a a o e classicada como possuindo um objeto de determinada classe se a computacao ocorrer com sucesso por toda a cascata. Em casos onde o objeto de interesse e raro (por exemplo uma face em uma foto), cascatas de rejeicao aceleram o processo de busca por um objeto, j que a maior parte das regi es de a o busca ser marcada como n o possuindo o objeto rapidamente, sem ter de percorrer a maior a a parte da cascata. Em cada nodo da cascata de rejeicao existe um conjunto de classicadores fracos, que s o arvores de decis o. O conjunto de arvores em cada nodo e acelerado com a a a t cnica de Boosting (mais informacoes sobre a t cnica de Boosting podem ser encontradas em e e

16

[5] p gina 495). a Essas arvores normalmente possuem profundidade um, sendo tamb m chamadas de deci e sion stumps, s o o caso mais simples de arvores de decis o o qual consiste de um unico nodo a a de decis o e duas folhas. Cada decision stump deve tomar apenas uma decis o, da seguinte a a forma: Est o valor V de um determinado recurso R acima ou abaixo de um limite L; Nesse a caso um sim indica que o objeto de interesse est presente, um n o indica a sua aus ncia. a a e A quantidade de recursos Haar que o classicador Viola-Jones utiliza em cada classicador fraco pode ser congurado no momento do treinamento, normalmente se utiliza apenas um recurso (uma arvore com apenas uma divis o) ou no m ximo 3 recursos. Incrementar es a a ses classicadores iterativamente (t cnica de Boosting) constr i um classicador que e a soma e o ponderada dos classicadores fracos. Ao analisar pela primeira vez o conjunto de dados, o classicador aprende o limite que melhor classica a entrada. A t cnica de Boosting utiliza os erros e para realizar o calculo ponderado de w1. Cada vetor de recursos e reavaliado como tendo menos peso (se ele foi classicado corretamente) ou mais peso (se ele foi classicado incorretamente). Pode parecer estranho diminuir o peso do vetor de dados quando ele e classicado correta mente, e aumentar o peso quando a classicacao falha. A raz o do treinamento ocorrer assim a e que a t cnica de Boosting tem como objetivo corrigir os pontos onde existem problemas e e ignorar os pontos que j funcionam bem. Depois que o nodo e ensinado, os dados sobreviventes a da parte superior da cascata s o usados para treinar o pr ximo nodo, e assim por diante. a o Um detalhe importante e o uso de recursos Haar como entrada do algoritmo, em vez de dados brutos. Esses recursos Haar s o basicamente um limite aplicado as somas e diferencas a ` de regi es retangulares da imagem. Para acelerar o c lculo desses recursos e utilizada a t cnica o a e de imagem integral (para mais detalhes veja [5] p gina 182) que acelera o c lculo do valor de a a regi es retangulares e dessas mesmas regi es rotacionadas em 45 graus. o o Viola e Jones organizaram cada grupo classicador boosted em nodos, formando uma cascata de rejeicao, como mostrado na gura 9. Na gura , cada nodo F contem uma inteira cascata boosted de grupos de decision stumps (ou arvores) treinadas utilizando recursos Haar. Normal mente os nodos s o ordenados do menos complexo ao mais complexo, assim o custo compua tacional e minimizado (os nodos mais simples s o executados primeiro) ao analisar regi es da a o imagem que com certeza n o possuem o objeto de interesse. a

17

F1

Rejeita

F2

Rejeita

Fn

Rejeita

Aceita

Figura 9: Cascata de rejeicao utilizada no classicador Viola-Jones: Cada nodo representa um classicador Multitree AdaBoosted treinado para raramente perder o objeto de interesse, rejeitando por m apenas uma pequena parte das regi es que n o representam o objeto de intee o a resse. At chegar o nal da cascata a maior parte das regi es que n o representam o objeto de e o a interesse j foram descartadas. a

2.4.3 USO DO CLASSIFICADOR O classicador Haar funciona bem em objetos como faces frontais, olhos, boca, traseira de carros, lateral de carros, frente de carros; Mas objetos como o perl de um rosto (ou qualquer outro objeto em que o contorno seja a caracterstica principal de identicacao), j n o funciona a a t o bem, principalmente porque essa perspectiva insere variacoes no padr o que os recursos em a a forma de bloco do Haar n o conseguem lidar muito bem. a Por exemplo, para modelar a curva de um rosto visto de lado (seu contorno) e necess rio a inserir no modelo informacoes a respeito do fundo da imagem, para realizar essa modelagem de maneira adequada seria necess rio um conjunto de treinamento muito maior, com diferentes a fundos na imagem, ou rostos de lado com fundos diferentes do modelado seriam rejeitados. Ou seja, o contorno de um objeto e difcil de modelar nesse classicador porque os recursos Haar funcionam em bloco, dessa maneira o classicador e obrigado a aprender as variacoes do fundo da imagem que formam a borda do objeto. Para treinar o classicador e necess rio ter um grande conjunto de dados, com boa qua a

18

lidade, bem segmentado, para deteccao de objetos rgidos onde o contorno n o e a principal a caracterstica do objeto. O treinamento desse classicador e lento, por m gracas a modelagem e em cascata de rejeicao ele e bem r pido para realizar a deteccao do objeto em si. a Por grande conjunto de dados entende-se milhares de imagens com o objeto de interesse e dezenas de milhares de objetos sem o objeto de interesse. Por boa qualidade dos dados entende-se que os dados n o devem conter o mesmo objeto em perspectivas diferentes, para a cada perspectiva diferente e melhor treinar um classicador especifco para aquela perspectiva. Por bem segmentado entende-se imagens que representam corretamente o objeto sem variacoes desnecess rias, isso faria com que o classicador corrigisse essa variacao ctcia, levando a rea sultados imprecisos. Por exemplo, ao treinar o classicador para detectar faces frontais, se a localizacao dos olhos no rosto variar demais (algo fora do normal) o classicador vai assumir que a localizacao dos olhos n o e xa e que e normal que os olhos possam estar em qualquer a posicao, isso degrada muito o desempenho j que o classicador precisa se ajustar a fatores que a n o existem nos dados reais. a

19

PROJETO

Este captulo descreve o desenvolvimento pr tico do projeto, que e composto da deteccao a e tracking de objetos dentro do software de refer ncia, da utilizacao dos vetores calculados na e estimativa de movimento para auxiliar no tracking de objetos e da insercao dos metadados ex trados no bitstream. Primeiro s o apresentados resultados pr ticos da insercao de mensagens a a SEI Userdata Unregistered no bitstream de um vdeo codicado. Em seguida ser o apresenta a dos os novos m dulos adicionados para realizar a extracao e o armazenamento dos metadados e o como eles foram integrados ao software de refer ncia. Por m ser apresentada uma avaliacao e a dos resultados obtidos.

3.1 INSERINDO USERDATA NO BITSTREAM


O H.264 possui uma sintaxe especca para o envio de mensagens n o necess rias ao pro a a cesso de decodicacao, embutidas no bitstream de vdeo, s o mensagens SEI (Supplemental a Enhanced Information). Ao longo dessa secao ser estudada a utilizacao pr tica das mensagens a a SEI do tipo UserData n o registrada em pontos diferentes no processo de codicacao. a 3.1.1 AMBIENTE DE TESTE Todos os testes foram realizados com o mesmo trecho de vdeo obtido a partir do site http://media.xiph.org/video/derf. O vdeo possui a seguinte conguracao: quadros por segundo = 29.97. total de quadros = 300. comprimento = 176 pixels. altura = 144 pixels.

20

espaco de cor = YUV, 4:2:0. Para testar a conformidade do bitstream gerado foi utilizado o decodicador de refer ncia, e ap s utilizar o decodicador de refer ncia para transformar o bitstream H.264 em vdeo raw foi o e utilizado o Gstreamer para exibir o vdeo e constatar visualmente que o vdeo foi decodicado sem problemas. O bitstream tamb m foi testado diretamente no Gstreamer, pra vericar se o bitstream toe caria em um player usual (muitos players open source utilizam gstreamer como framework de multimedia). Gstreamer utiliza internamente o ffmpeg para fazer o decoding do bitstream H.264. 3.1.2 ENVIANDO UMA MENSAGEM SEI USERDATA Inicialmente foi utilizada a opcao GenerateSEIMessage do pr prio codicador, onde e o possvel ativar o envio de uma mensagem e congurar a mensagem que ser enviada. Mas a isso serve apenas para testes bem simples j que apenas uma mensagem e enviada ao longo de a todo o bitstream de vdeo, e em forma de texto. Essa funcao e invocada no m dulo lehandle, o por isso ele foi escolhido como ponto de partida para testes de insercao de mensagens SEI no bitstream. A partir do que foi observado na presente implementacao de envio de mensagens SEI n o a registradas foi desenvolvida uma nova funcao que consegue criar uma mensagem SEI com qualquer tipo de dado, n o sendo necessariamente texto. Para testar essa nova funcao foram a feitas pequenas alteracoes no m dulo lehandle do codicador, na funcao start sequence, e foi o adicionado um novo m dulo udata gen para possibilitar a criacao de mensagens SEI a partir de o um char* e do seu tamanho. Tamb m foram realizadas alteracoes no decodicador para realizar a extracao da mensagem e SEI, para isso foi criado um novo m dulo udata parser que faz a extracao dos dados a partir de o um SEI NALU que possui uma mensagem SEI do tipo UserData n o registrada. a O m dulo udata parser e chamado dentro do m dulo sei (sei.c) do decodicador (ldeo o cod), na funcao InterpretSEIMessage que trata a recepcao de mensagens SEI. Nesse ponto as informacoes s o enviadas para o stdout, para constatar se as mensagens foram extradas corre a tamente. Com essas duas alteracoes prontas foi possvel testar o envio de um SEI User Data n o re a gistrado contendo informacao que n o e necessariamente texto (nesse caso a ideia e que fossem a

21

par metros extrados do video). a Foi constatado que: As informacoes persistiram no bitstream e foram extradas com sucesso pelo decodica dor de refer ncia modicado. e O decodica de refer ncia realizou a decodicacao do vdeo com sucesso, gerando um e arquivo de vdeo bruto v lido com todo o vdeo original. a O bitstream H.264 gerado mostrou ser compatvel com Gstreamer. Portanto n o seria um problema enviar dados de qualquer natureza utilizando mensagens a SEI User Data n o registradas, o decodicador de refer ncia continuou funcionando sem proa e blemas e a mensagem permaneceu ntegra. At mesmo um decodicador de terceiro (ffmpeg + e Gstreamer) funcionou com o bitstream gerado. 3.1.3 ENVIANDO DIVERSAS MENSAGENS SEI USERDATA DE TAMANHO VARIADO Ap s ter enviado uma mensagem com sucesso o pr ximo passo foi enviar v rias mensagens o o a no mesmo bitstream, com tamanhos variados. Por m surgiram dois problemas, a quantidade de e mensagens SEI Userdata que podem ser enviadas no mesmo bitstream e o tamanho m ximo a delas. De acordo com [3] n o existe um limite explicito nem na quantidade, nem no tamanho a das mensagens SEI. Por m na pr tica, al m dos limites implcitos que podem existir por causa do nvel de e a e conformidade do codicador, muitos decodicadores possuem limites no que eles suportam que est o relacionados com a maneira como eles foram implementados e n o com a recomendacao a a em si. Alguns decodicadores possuem limites de quantas mensagens SEI podem receber, outros simplesmente descartam mensagens SEI. Como a variedade de decodicadores e muito grande, o foco da implementacao ser o codicador/decodicador de refer ncia. a e No codicador de refer ncia existe um limite explicito no tamanho m ximo de um NALU, e a esse limite e denido no arquivo lcommon/inc/nalucommon.h como MAXNALUSIZE. O valor desse limite e 64000 bytes. Ao longo dos testes esse ser o tamanho m ximo utilizado. a a Para testar o envio de m ltiplos SEI NALUS com mensagens SEI Userdata de tamanhos u variados, respeitando o limite de 64000 bytes, foi criada uma nova funcao no m dulo udata gen o que gera uma string maior a cada nova chamada.

22

Ao atingir o tamanho limite a funcao retorna ao tamanho inicial e reinicia o processo de aumento da string. Dessa maneira e possvel enviar diversas mensagens todas de tamanho diferente, explorando desde mensagens de tamanho pequeno como de mensagens que cheguem perto do tamanho m ximo. a Foi feita uma alteracao no m dulo lehandle do codicador, para criar e escrever no bits o tream 1000 mensagens de tamanho variado. Nenhuma alteracao foi necess ria no decodicador. a Foi constatado que: Os 1000 SEI NALUs persistiram no bitstream e foram extrados com sucesso pelo deco dicador de refer ncia modicado. e O decodica de refer ncia realizou a decodicacao do vdeo com sucesso, gerando um e arquivo de vdeo bruto v lido com todo o vdeo original. a O bitstream H.264 gerado com os 1000 SEI NALUS mostrou ser compatvel com Gstre amer. Portanto n o seria um problema enviar m ltiplos SEI NALUs no mesmo bitstream, e de a u tamanho variado, desde que se respeite o tamanho m ximo denido pelo software de refer ncia. a e A unica limitacao deste teste e que os SEI NALUs s o escritos no bitstream sequencialmente, a n o est o intercalados com os NALUs de vdeo e s o todos escritos no inicio do bitstream, antes a a a dos quadros de vdeo. Foi realizado um teste para constatar se m ltiplos SEI NALUs v o funcionar bem intercau a lados com quadros de vdeo. Para isso foram utilizadas as mesmas funcoes j existentes nos a testes anteriores, mas ao inv s de os SEI NALUs serem inseridos no m dulo lehandle eles s o e o a inseridos no m dulo lencod, ap s a geracao de cada quadro. o o Como o vdeo consiste em 300 quadros, foram inseridos exatamente 300 SEI NALUs, sempre que um quadro e escrito no bitstream um SEI NALU de tamanho vari vel e escrito ap s a o ele. Foi constatado que: Os 300 SEI NALUs persistiram no bitstream e foram extrados com sucesso pelo decodi cador de refer ncia modicado. e O decodicador de refer ncia realizou a decodicacao do vdeo com sucesso, gerando e um arquivo de vdeo bruto v lido com todo o vdeo original. a

23

O bitstream H.264 gerado com os 300 SEI NALUS mostrou ser compatvel com Gstrea mer. Utilizando mensagens SEI Userdata n o registradas e possvel enviar dados que n o fazem a a parte do processo de decodicacao, de tamanhos variados (respeitando o tamanho m ximo esti a pulado pelo software de refer ncia), em posicoes variadas dentro do bitstream e em quantidades e variadas. O c digo fonte de todos os m dulos alterados no software de refer ncia e dos novos o o e m dulos, que foram utilizados para realizar esse teste, se encontra no ap ndice A. o e

3.2

MODULO EXTRACTED METADATA


Esta secao explica detalhadamente a implementacao do m dulo extracted metadata. Ele e o

escrito em linguagem C e foi adicionado no diret rio lcommon do software de refer ncia j que o e a ele e utilizado tanto pelo codicador como pelo decodicador. Todas as funcoes s o declaradas a no cabecalho lcommon/inc/extracted metadata.h e implementadas em lcommon/src/extracted metadata.c. Apesar de ser escrito em C, foi utilizada uma abordagem orientada a objetos. A orientacao a objetos e feita internamente de uma maneira bem simples, a classe pai possui uma lista de ponteiros de funcao e na construcao da classe lho ela fornece a implementacao para essas funcoes. A classe pai pode realizar alguma atividade antes ou depois da chamada da funcao imple mentada pela classe lho. Dessa maneira ca f cil a classe pai executar c digo que e comum a o a todas as subclasses, antes de chamar a funcao implementada pela subclasse. Isso foi es pecialmente util na implementacao da serializacao, cada implementacao de metadado deve se preocupar apenas com a serializacao dos seus dados, sem se preocupar com os dados da classe pai, j que a classe pai ir serializar esses dados antes de chamar a funcao de serializacao da a a classe lho, simplicando a implementacao de novos metadados. Funcoes da famlia hton, denidas em arpa/inet.h, foram utilizadas na serializacao dos metadados para garantir que ao serializar os dados os bytes estejam de acordo com o padr o a para rede. Na desserializacao, funcoes da famlia ntoh foram utilizadas para garantir que os bytes ordenados de acordo com o padr o para rede fossem convertidos para a ordenacao de a bytes do host. e O padr o utilizado nos nomes das funcoes e nome do tipo m todo. Por exemplo a implementacao a em C do m todo new da classe ExtractedMetadataBuffer ser extracted metadata buffer new. e a

24

Por classe entende-se a estrutura denida com o determinado nome, e sempre ao chamar uma funcao que e m todo desta classe, o primeiro par metro e um ponteiro para a estrutura que e a representa a classe. Ao longo dessa secao ser feita refer ncia apenas ao nome dos m todos, e a e e n o ao nome completo da funcao que est implementada em C. a a Na gura 10 pode ser visto o diagrama de classe dos objetos denidos no m dulo. A o descricao de cada um dos objetos s o apresentados nessa secao. a

Figura 10: Diagrama de classe dos objetos denidos no m dulo extracted metadata. o

A implementacao deste m dulo encontra-se no ap ndice B. o e 3.2.1 EXTRACTED METADATA

Esta classe abstrai a serializacao, desserializacao, salvamento e destruicao dos diferentes tipos de metadados. O m todo serialize e respons vel pela serializacao, que e utilizada na e a insercao de um metadado no bitstream (utilizado em conjunto com o m dulo udata gen). o O m todo get serialized size e utilizado para auxiliar a alocacao de mem ria necess ria e o a pelo processo de serializacao, dessa maneira ca a cargo de quem est serializando o metadado a alocar a mem ria necess ria para a serializacao e liberar a mem ria ap s o uso. o a o o

25

Figura 11: Metadado serializado dentro de um NALU do tipo SEI. Cabecalho em verde, payload em azul.

Como pode ser visto na gura 11, um metadado serializado sempre comeca com o seu tipo e o n mero do quadro (em ordem de apresentacao) do qual ele foi extrado. O payload do u metadado ser denido pela classe que herdar ExtractedMetadata. a O m todo save salva o metadado em um le descriptor, sendo util para realizar depuracao. e O m todo free libera todos os recursos utilizados pelo metadado. e 3.2.2 EXTRACTED Y IMAGE

Esta classe herda ExtractedMetadata e representa o plano luma de um objeto de interesse, e composto basicamente do plano luma com o seu comprimento e altura. O plano luma e um array bidimensional de bytes, onde cada byte e o valor de um pixel. A primeira dimens o do a array e a linha (Y) que vai de 0 a altura - 1. A segunda dimens o e a coluna (X), que vai de 0 a a comprimento - 1. Ao detectar um objeto de interesse e possvel extrair apenas o objeto e inserir ele no bits tream. O objeto pode ser recuperado no decodicador e salvo em um arquivo. Como ele e composto apenas do plano luma s e possvel visualizar o objeto monocrom tico. Muitos algoo a ritmos trabalham com imagens monocrom ticas, esse metadado pode ser utilizado para presera var no bitstream o objeto original antes que parte das informacoes dele possam ser destrudas pelo processo de codicacao, dependendo do nvel de perda do processo da codicacao. Em alguns casos para economizar largura de banda na transmiss o, ou espaco no armazea namento, o vdeo e obtido em alta denicao mas tem seu tamanho reduzido, utilizando esse

26

metadado seria possvel dispor de um banco de objetos de interesse em alta resolucao apesar dos vdeos terem seu tamanho reduzido. Para criar um objeto ExtractedYImage basta utilizar o m todo new passando como par metro e a o n mero do quadro, seu comprimento e sua altura. Pela altura e comprimento informados ser u a alocado o plano, que pode ser obtido atrav s do m todo get y, tendo obtido o plano basta escree e ver nele o plano luma do objeto e o metadado estar pronto para ser serializado e inserido no a bitstream.

Figura 12: Objeto ExtractedYImage serializado dentro de um NALU do tipo SEI. Cabecalho em verde, payload em azul.

3.2.3

EXTRACTED OBJECT BOUNDING BOX

Esta classe herda ExtractedMetadata e representa uma caixa delimitadora envolta de um objeto de interesse. Ela e composta de um identicador unico do objeto, as coordenadas (x, y) da caixa, sua altura e seu comprimento. Ao ocorrer a deteccao de um objeto de interesse e possvel inserir no bitstream um meta dado ExtractedObjectBoundingBox, ao ser recuperado no decodicador, utilizando o identicador unico, e possvel realizar a indexacao de todos os objetos diferentes detectados ao longo do vdeo. Como a classe pai ExtractedMetadata possui o n mero do quadro em ordem de u apresentacao, e possvel dizer em que momento do vdeo o objeto foi detectado pela primeira

27

vez e qual o momento que ele foi identicado pela ultima vez, tendo assim todo o intervalo de tempo em que o objeto esteve no vdeo. Com as informacoes da caixa delimitadora tamb m e possvel desenhar a caixa diretamente e no vdeo, facilitando a constatacao visual de que um objeto de interesse est presente no trecho a de vdeo. Se para cada quadro que possui o objeto de interesse for inserido um metadado ExtractedObjectBoundingBox no bitstream ser possvel realizar o tracking do objeto ao longo a do vdeo. Para criar um objeto ExtractedObjectBoundingBox basta utilizar o m todo new passando e como par metro o identicador do objeto, o n mero do quadro (em ordem de apresentacao), a a u coordenada x, a coordenada y, seu comprimento e sua altura. Ap s a construcao basta serializar o e inserir o objeto ExtractedObjectBoundingBox no bitstream. Ao recuperar o metadado do bitstream o m todo get data pode ser utilizado para se obter e informacoes como o identicador unico do objeto, suas coordenadas e seu tamanho.

Figura 13: Objeto ExtractedObjectBoundingBox serializado dentro de um NALU do tipo SEI. Cabecalho em verde, payload em azul.

3.2.4

EXTRACTED METADATA BUFFER

Esta classe e utilizada para bufferizar diversos metadados extrados no processo de decodicacao. O m todo add adiciona um novo metadado no buffer, os metadados podem ser recuperados do e

28

buffer utilizando o m todo get, neste m todo deve ser informado o n mero do quadro em ordem e e u de apresentacao, se houver algum metadado referente a este quadro ele ser retornado, se n o a a existir o m todo retornar NULL. e a O buffer foi construdo porque nem sempre os metadados cam no bitstream exatamente antes do quadro ao qual eles pertencem. Dependendo do vdeo v rios metadados podem ser a inseridos no bitstream antes que um quadro seja escrito no bitstream, dessa maneira e necess rio a bufferizar os metadados no decodicador at terminar a decodicacao de um quadro e chegar e o momento de apresent -lo. Ao terminar a decodicacao o buffer pode ser consultado para a vericar se existe algum metadado referente ao quadro que ser apresentado. a Para tornar a bufferizacao eciente e simples n o existe nenhum tipo de ordenacao dos a metadados dentro do buffer, ao se obter o metadado para um determinado quadro, qualquer metadado que for referente a um quadro anterior ser descartado pelo buffer. Portanto um mea tadado deve ser gravado no bitstream antes do quadro do qual ele foi extrado. E os metadados devem sempre ser gravados no bitstream na ordem correta (os metadados referentes a quadros menores primeiro). Isso e f cil de garantir j que no codicador temos total controle de quando a a o metadado e gravado no bitstream, o que j n o e verdade para os quadros que dependem de a a v rios outros processos internos do codicador. a

29

Figura 14: Exemplo de problemas que podem ocorrer na recuperacao dos metadados se eles forem inseridos de maneira errada no bitstream. Metadados em verde, quadros em vermelho.

A gura 14 exemplica alguns problemas que podem ocorrer ao bufferizar metadados que n o foram inseridos no bitstream de maneira adequada. a

3.3

MODULO METADATA EXTRACTOR


Este m dulo e respons vel pela extracao de metadados a partir de quadros brutos e das o a

informacoes de estimativa de movimento fornecidas. Na atual implementacao ele pode extrair metadados do tipo ExtractedObjectBoundingBox e ExtractedYImage. E escrito em linguagem C e se encontra no diret rio lencod do software de refer ncia j que o e a ele e utilizado tanto pelo codicador como pelo decodicador. Todas as funcoes s o declara a das no cabecalho lencod/inc/metadata extractor.h e implementadas em lencod/src/metadata extractor.c. Nele tamb m foi utilizada a mesma abordagem orientada a objetos utilizada no m dulo e o extracted metadata e as mesmas regras foram utilizadas para os nomes das funcoes que repre sentam m todos da classe MetadataExtractor. e

30

O uso do classicador Haar na implementacao do extrator de metadados ser comentado a nessa secao. A implementacao completa do m dulo encontra-se no ap ndice C. o e 3.3.1 METADATA EXTRACTOR

E o unico objeto exportado publicamente pelo m dulo e possui todo o contexto da extracao o de metadados. O m todo new cria um novo extrator de metadados, na criacao v rias carace a tersticas do extrator podem ser conguradas por meio dos seguintes par metros: a min width - Comprimento mnimo do objeto de interesse. min height - Altura mnima do objeto de interesse. search hysteresis - Histerese (em quadros) para realizacao da busca de um novo objeto de interesse. tracking hysteresis - Histerese (em quadros) para realizar a conrmacao de que o ob jeto de interesse do qual est sendo feito tracking ainda se encontra no vdeo, e corrigir a possveis erros causados pela estimativa de movimento. a training le - Arquivo de treinamento que ser utilizado ao criar o classicador Haar desse extrator. Ele dene qual e o objeto de interesse. O termo histerese tem diferentes signicados de acordo com o contexto e a area em que e utilizado, pode ser utilizado na biologia, tratamento de materiais, mec nica, entre outros. a No presente trabalho a histerese se refere a quantidade de quadros necess rios para realizar a a execucao do classicador Haar, gerando um atraso congur vel na deteccao de um novo objeto, a ou ao conrmar a exist ncia de um objeto previamente detectado. e O m todo extract raw object extrai do quadro o plano luma do objeto de interesse (se ele e existir no quadro) e retorna como um objeto ExtractedMetadata. Para realizar a extracao e necess rio passar os seguintes par metros: a a extractor - Objeto MetadataExtractor. u a frame number - N mero do quadro (em ordem de apresentacao) do qual ser extrado o metadado. y - Plano luma, array bidimensional[y][x] de bytes, onde y vai de 0 a altura - 1 e x vai de 0 a comprimento - 1.

31

width - Comprimento do quadro. height - Altura do quadro. Se o objeto de interesse n o se encontrar no quadro, esse m todo retorna NULL. As conguracoes a e de histerese e as informacoes de estimativa de movimento n o s o utilizadas nesse m todo. a a e O m todo extract object bounding box extrai do quadro uma caixa delimitadora que ree presenta a area onde se encontra o objeto de interesse no quadro e retorna como um objeto ExtractedMetadata. Para realizar a extracao e necess rio passar os seguintes par metros: a a extractor - Objeto MetadataExtractor. frame number - N mero do quadro (em ordem de apresentacao) do qual ser extrado o u a metadado. y - Plano luma, array bidimensional[y][x] de bytes, onde y vai de 0 a altura - 1 e x vai de ` 0 ao comprimento - 1. width - Comprimento do quadro. height - Altura do quadro. Se o objeto de interesse n o se encontrar no quadro, esse m todo retorna NULL. As conguracoes a e de histerese e as informacoes de estimativa de movimento s o utilizadas nesse m todo de acordo a e com o estado interno do extrator. O comportamento do m todo depende do estado interno do e extrator: N o realizando tracking - Ser consultada a histerese de busca, se a histerese foi ultraa a passada, o classicador Haar ser utilizado para realizar a busca do objeto de interesse a neste quadro. Se o objeto existir, o extrator cria um objeto TrackedBoundingBox que ser a utilizado internamente para realizar o tracking do objeto, passa para o estado Realizando tracking e retorna um objeto ExtractedObjectBoundingBox. Se o objeto n o existir o exa trator reinicia a histerese de busca, continua no estado atual e retorna NULL. Se a histerese n o foi ultrapassada o extrator continua no estado atual e retorna NULL. a Realizando tracking - Ser consultada a histerese de tracking, se a histerese foi ultrapasa sada, o classicador Haar ser utilizado para vericar se o objeto ainda se encontra no a quadro atual, se o objeto n o for encontrado o extrator volta ao estado N o realizando a a

32

tracking e retorna NULL. Se o objeto de interesse est no quadro o objeto TrackedBouna dingBox e atualizado de acordo com a posicao encontrada pelo classicador Haar e um ExtractedObjectBoundingBox e retornado. Se a histerese n o foi ultrapassada ser retor a a nado um objeto ExtractedObjectBoundingBox utilizando as informacoes de estimativa de movimento para calcular a posicao atual do objeto TrackedBoundingBox.

Figura 15: Fluxograma do m todo extract object bounding box. e

As histereses conguradas, junto com as informacoes de estimativa de movimento, visam utilizar os algoritmos j existentes no codicador para reduzir o custo computacional do traca king de um objeto no vdeo. Ao inv s de realizar o processamento de todos os quadros brutos e no classicador Haar para realizar o tracking do objeto ao longo do vdeo, a histerese diminui o custo computacional por atualizar a posicao do objeto em intervalos xos. Os vetores de mo vimento calculados pelo codicador s o utilizados para suavizar o tracking, estimando a nova a posicao do objeto enquanto a histerese de tracking n o estoura. a Por exemplo, em um vdeo com 300 quadros sem nenhum objeto de interesse, com uma histerese de busca de 10 quadros, o classicador Haar ser chamado apenas 30 vezes, ao inv s a e

33

de 300 vezes. A conguracao e especialmente util em vdeos com framerate muito alto, j que a determinados objetos t m uma velocidade de locomocao esperada em um vdeo, logo n o e e a necess rio processar todos os quadros. a

Figura 16: Exemplo do funcionamento da histerese de busca.

O mesmo se d quando o objeto j foi detectado, n o e necess rio executar o classicador a a a a em todos os quadros, os vetores de estimativa de movimento nos d o uma ideia aproximada da a posicao do objeto, at que seja alcancada a histerese de tracking. e

Figura 17: Exemplo do funcionamento da histerese de tracking.

Cada extrator s pode realizar a monitoracao de um objeto de interesse, se existirem divero sos objetos de interesse no quadro ele ir detectar apenas um e realizar o tracking desse objeto. a Criar v rios extratores para detectar o mesmo tipo de objeto geraria problemas como detectar a v rias vezes o mesmo objeto, mas seria possvel criar v rios extratores para detectar objetos a a diferentes e utiliz -los em paralelo. a

34

3.3.2

UTILIZANDO O CLASSIFICADOR HAAR

O classicador Haar foi escolhido como algoritmo de deteccao de padr es a ser utilizado o nesse trabalho. Como ele cou completamente oculto na implementacao do m dulo meta o o data extractor e possvel alterar a implementacao do m dulo, utilizando outro algoritmo de deteccao de padr es, sem realizar qualquer alteracao na API p blica do m dulo, ou simples o u o mente remov -lo. A unica limitacao da API atual e que ela trabalha apenas com as informacoes e de lumin ncia, para trabalhar com algoritmos que utilizem informacoes de cor ser necess ria a a a uma alteracao na API do m dulo atual. o A implementacao do classicador Haar do OpenCV foi escolhida para realizar a deteccao de objetos por ser bem documentada e f cil de utilizar, sem contar que o OpenCV j disp e a a o de uma s rie de outras funcoes que facilitam trabalhar com o quadro bruto. Outra vantagem e e que ele trabalha com imagens em escala de cinza, independente da conguracao do vdeo bruto o plano de lumin ncia sempre possui a maior resolucao possvel. T cnicas que utilizam a e informacoes de cor teriam a desvantagem de ter de trabalhar com informacoes de cor com resolucao reduzida. Outra motivacao e a possibilidade de acelerar o classicador Haar diretamente em hard ware, como pode ser visto em [8], onde a parte mais complexa do classicador Haar (90% do tempo de processamento) foi implementando em hardware, o que se alinha com a ideia de construir um chip codicador H.264 com deteccao de objetos integrada em tempo real. A principal funcao que e utilizada na deteccao de um objeto e cvHaarDetectObjects( const CvArr* image, CvHaarClassierCascade* cascade, CvMemStorage* storage, double scale factor, int min neighbors, int ags, CvSize min size). O primeiro par metro e a imagem onde ser realizada a busca, em escala de cinza, que ser a a a obtida atrav s do plano luma original do codicador. O segundo par metro e o classicador e a que e criado no m todo new do objeto MetadataExtractor. O terceiro par metro e o buffer de e a trabalho do classicador que tamb m e criado no m todo new. e e O classicador busca pelo objeto de interesse em todas as escalas possveis, o quarto par metro signica o qu o grande ser o pulo entre cada escala, um valor alto vai tornar o a a a classicador mais r pido por m aumentar as chances de falso negativo. O quinto par metro a e a a e um controle para prevenir falsos positivos. Na area onde se encontra o objeto de interesse costuma ocorrer v rias deteccoes com sucesso para o mesmo objeto, j que os pixels ao redor a a da area e em escalas diferentes indicam que existe o objeto de interesse. Por exemplo, o valor 3 indica que o classicador s considerar o objeto como presente se ocorrerem 3 deteccoes o a

35

sobrepostas na mesma area. O sexto par metro s o as ags do processo de busca, existem 4 ags que podem ser coma a postas com o operador OR: a o CV HAAR DO CANNY PRUNING - Far com que regi es planas da imagem (sem linhas) sejam ignoradas. CV HAAR SCALE IMAGE - Faz com que o classicador escalone a imagem em vez de escalonar ele mesmo. CV HAAR FIND BIGGEST OBJECT - Faz com que o classicador retorne apenas o maior objeto detectado (se houver mais de um). o CV HAAR DO ROUGH SEARCH - S pode ser utilizado em conjunto com a ag CV HAAR FIND BIGGEST OBJECT, faz com que o classicador encerre a busca assim que ele encontrar o objeto de interesse (nesse caso o maior). O s timo par metro e o tamanho mnimo que o objeto deve possuir para ser detectado pelo e a classicador. Quanto maior for o tamanho mnimo mais r pido o classicador ir executar, mas a a maior ser a possibilidade de ocorrer falso negativo. a 3.3.3 REALIZANDO ESTIMATIVA DE MOVIMENTO

A estimativa de movimento de um objeto e realizada por um trabalho em conjunto entre o e m todo extract object bounding box e o m todo add motion estimation info. Um Metadatae Extractor recebe as informacoes de estimativa de movimento atrav s do m todo add motion e e a e estimation info, essas informacoes por sua vez ser o utilizadas na execucao do m todo extract object bounding box. O m todo add motion estimation info recebe os seguintes par metros: e a extractor - Objeto MetadataExtractor. block x - X do bloco, em coordenada de bloco. block y - Y do bloco, em coordenada de bloco. x motion estimation - Estimativa de movimento para a coordenada x do bloco. y motion estimation - Estimativa de movimento para a coordenada y do bloco.

36

Se o extrator n o estiver realizando tracking de um objeto a chamada para este m todo a e e ignorada. Se o extrator est realizando tracking, ser avaliado se este bloco faz parte da a a caixa delimitadora (representada pela classe TrackedBoundingBox) do objeto de interesse. Se qualquer parte do bloco estiver dentro da caixa delimitadora, as informacoes de estimativa de movimento dele ser o utilizadas para estimar o movimento da caixa delimitadora do objeto de a interesse. Essa abordagem e eciente j que bastam algumas comparacoes bem simples para vericar a se a area do bloco tem uma intersecao com a area da caixa delimitadora do objeto de interesse, por m a caixa delimitadora nem sempre representa perfeitamente o objeto (o objeto teria de ter e a forma de uma caixa tamb m), dessa maneira acaba-se utilizando a estimativa de movimento e de blocos que fazem parte da caixa delimitadora mas n o do objeto, gerando um erro que a se acumula a cada estimativa de movimento do objeto. Isso limita o uso da t cnica, sendo e necess ria uma histerese de tracking pequena dependendo do quanto o objeto se movimenta e a da sua caixa delimitadora. No software de refer ncia utiliza-se um modelo simplicado de estimativa de movimento, e o tamanho dos blocos utilizados na estimativa de movimento sempre possuem um tamanho de 4 x 4 pixels, independente do modo escolhido. Dessa maneira para obter as coordenadas reais do bloco basta multiplicar as coordenadas do bloco por 4. Tendo as coordenadas reais do bloco ca f cil determinar se o bloco est dentro ou n o da caixa delimitadora do objeto de interesse. a a a

Figura 18: Comparacao entre as coordenadas dos blocos (em azul) da estimativa de movimento e as coordenadas reais (em vermelho) que elas representam.

E importante ressaltar que o tamanho xo 4 x 4 para os blocos da estimativa de movimento n o e verdade para todos os codicadores. Alguns codicadores possuem uma hierarquia e seria a necess rio derivar a estimativa de movimento para um bloco dependendo do modo utilizado. a

37

O valor da estimativa de movimento e informado em unidades de QPel (Quarter Pel re nement), onde um quarto das amostras s o sub-amostras interpoladas, causadas por fracoes de a vetores de movimento. Mais detalhes a respeito desse processo podem ser encontrados em [3] subcl usula 8.4.2.2. Um vetor x negativo indica um movimento para a direita, y negativo indica a um movimento para baixo, x positivo indica um movimento para a esquerda e um y positivo um movimento para cima.

Figura 19: Como os vetores de movimento de um bloco representam a sua movimentacao no vdeo.

Todas as informacoes relativas a estimativa de movimento do objeto de interesse s o guarda a das no TrackedBoundingBox, essa classe representa a caixa delimitadora do objeto de interesse do qual est sendo feito o tracking, e e criada quando se identica um objeto de interesse pela a primeira vez. Nele e guardado um somat rio de todos os vetores (em QPel) de movimento ali o mentados no extrator. Ao chamar o m todo extract object bounding box no estado de tracking, e ser o utilizadas as informacoes contidas no TrackedBoundingBox para realizar a estimativa de a movimento do objeto. Nesse m todo e realizada a m dia aritm tica simples de todos os vetores, ou seja o soe e e mat rio de todos os vetores e dividido pela quantidade de blocos que foram utilizados para o realizar a estimativa de movimento. O somat rio de todos os vetores e dividido por 4 antes de o ser dividido pela quantidade de blocos, pois o somat rio dos vetores est em unidades de QPel. o a Realizar essa divis o por 4 nos fornece a estimativa de movimento em pixels. a Tendo a estimativa de movimento em pixels basta subtrair a estimativa das coordenadas da TrackedBoundingBox. Essas novas coordenadas ser o utilizadas para criar o ExtractedOba jectBoundingBox que e retornado. As coordenadas (x,y) s o guardadas como double no Trac a kedBoundingBox para que n o ocorra perda de precis o no ac mulo de pequenos movimentos, a a u

38

como pode ser visto na gura 20.

Figura 20: Estimativa de movimento de um objeto.

Esse processo pode ser visto em detalhes no m todo estimate motion da classe Trackede BoundingBox que se encontra implementado em /lencod/src/metadata extractor.c.

3.4

ALTERACOES REALIZADAS NO CODIFICADOR


O objetivo da criacao dos m dulos metadata extractor e extracted metadata foi reduzir ao o

m ximo as alteracoes que teriam de ser realizadas no codicador e no decodicador e desacoa plando o processo de extracao de metadados do software de refer ncia. Isso facilita a possibi e lidade de portar o sistema de deteccao e tracking de objetos para uma outra implementacao do H264. O software de refer ncia utilizado no presente projeto e desenvolvido pelo JVT (Joint Vie deo Team) e hospedado pelo Instituto Fraunhofer para telecomunicacoes, Instituto Heinrich Hertz. Esta implementacao ser utilizada por ela ser refer ncia para pesquisas e vericacao de a e conformidade com a norma.

39

A vers o utilizada e a 17.2, o download da mesma pode ser realizado gratuitamente em a http://iphome.hhi.de/suehring/tml/download, todos os m dulos s o bem divididos e possuem o a boa documentacao. O software consiste basicamente de um codicador (lencod) que codica um arquivo de vdeo raw para o formato H.264 e de um decodicador (ldecod) que decodica um arquivo H.264 em um arquivo de vdeo raw. Algumas funcoes de uso comum se encontram no m dulo lcommon. o Nesta secao ser o apresentadas as alteracoes realizadas no codicador do software de re a fer ncia, para integr -lo com os m dulos construdos. As alteracoes realizadas no codicador e a o se encontram no anexo A.

Figura 21: Vis o geral do codicador H.264 modicado. Os blocos vermelhos representam os a processos adicionados ao codicador.

3.4.1

PROCESSANDO O QUADRO BRUTO

Para extrair metadados do quadro bruto antes de ocorrer o processo de codicacao, foi necess rio primeiro descobrir qual o melhor local dentro do codicador para se obter o quadro a que vai ser codicado. No caso do software de refer ncia utilizado neste trabalho a entrada de e dados e feita por arquivo. Foi necess rio estudar quando o codicador l o quadro e como ele a e organiza este quadro na mem ria. o A partir da funcao main em lencod/src/lencod.c, analisando como o codicador procedia para codicar os quadros, foi encontrada uma chamada para a funcao encode one frame, esta funcao e implementada no m dulo lencod/src/image.c, e nesta funcao que o quadro e carregado o em mem ria e pr -processado. o e Dentro da funcao encode one frame, o processamento do quadro bruto e realizado logo ap s a chamada de funcao process image, que realiza o processamento nal em cima do quadro o bruto, antes de se iniciar a codicacao dele. E neste ponto que o m todo extract object boun e

40

ding box e chamado e o metadado extrado e salvo no bitstream na forma de mensagem SEI Unregistered Userdata, utilizando o m dulo udata gen. o
1 2 3 4 5 6

p r o c e s s i m a g e ( p Vid , p I n p ) ; i f ( p I n p >o b j e c t d e t e c t i o n e n a b l e ) { ExtractedMetadata * metadata = m e t a d a t a e x t r a c t o r e x t r a c t o b j e c t b o u n d i n g b o x ( p Vid> m e t a d a t a e x t r a c t o r , p Vid>f r a m e n o , ( u n s i g n e d cha r * * ) p Vid>im g Data . f r m d a t a [ 0 ] , p Vid>im g Data . f o r m a t . w i d t h [ 0 ] , p Vid>im g Data . f o r m a t . height [0]) ;

7 8 9

i f ( metadata ) { int size metadata ) ; cha r * d a t a NALU t * n a l u = extracted metadata get serialized size ( = malloc ( s i z e ) ; = NULL;

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

/* S e r i a l i z e the metadata */ e x t r a c t e d m e t a d a t a s e r i a l i z e ( metadata , data ) ; / * I n s e r t t h e s e r i a l i z e d m e t a d a t a on t h e b i t s t r e a m a s SEI NALU . * / nalu = u s e r d a t a g e n e r a t e u n r e g i s t e r e d s e i n a l u ( data , s i z e ) ; p Vid>WriteNALU ( p Vid , n a l u ) ; FreeNALU ( n a l u ) ; free ( data ) ; ex t r ac te d m e ta d a t a f r e e ( metadata ) ; } } p a d b o r d e r s ( p I n p >o u t p u t , p Vid>w i d t h , p Vid>h e i g h t , p Vid>w i d t h c r , p Vid>h e i g h t c r , p Vid>im g Data . f r m d a t a ) ;

Tendo encontrado um bom lugar para extrair as informacoes foi necess rio entender como a o quadro ca organizado na mem ria. A estrutura ImageData armazena as informacoes de um o quadro, e o quadro original e carregado no campo imgdata da estrutura VideoParameters. A denicao da estrutura ImageData se encontra no m dulo lcommon/inc/io image.h e a estrutura o VideoParameters e denida em lencod/inc/global.h.

41

O quadro original carregado se encontra no campo frm data da estrutura ImageData:


1 2 3 4 5 6 7 8 9 10

typedef struct image data { Fr am eFo r m at f o r m a t ; / / Standard data i m g p e l ** f r m d a t a [MAX PLANE ] ; i m g p e l ** t o p d a t a [MAX PLANE ] ; i m g p e l ** b o t d a t a [MAX PLANE ] ; / / !< Frame Data / / !< p o i n t e r s t o t o p f i e l d d a t a / / !< p o i n t e r s t o b o t t o m f i e l d d a t a / / !< ima g e f o r m a t

/ / ! O p t i o n a l d a t a ( c o u l d a l s o add u i n t 8 d a t a i n c a s e i m g p e l i s o f t y p e uint16 ) / / ! T h e s e can be u s e f u l f o r e n a b l i n g i n p u t / c o n v e r s i o n o f c o n t e n t o f di f f ere nt types / / ! while keeping optimal processing s i z e . u i n t 1 6 ** f r m u i n t 1 6 [MAX PLANE ] ; u i n t 1 6 ** t o p u i n t 1 6 [MAX PLANE ] ; data u i n t 1 6 ** b o t u i n t 1 6 [MAX PLANE ] ; data i n t f r m s t r i d e [MAX PLANE ] ; i n t t o p s t r i d e [MAX PLANE ] ; i n t b o t s t r i d e [MAX PLANE ] ; } I m ag eData ; / / !< o p t i o n a l f r a m e Data f o r u i n t 1 6 / / !< o p t i o n a l p o i n t e r s t o t o p f i e l d / / !< o p t i o n a l p o i n t e r s t o b o t t o m f i e l d

11

12 13 14

15

16 17 18 19 20

Este campo e um array tri-dimensional de imgpel, o tipo imgpel representa o tamanho de cada pixel e e denido no m dulo lcommon/inc/typedefs.h: o
1 2 3 4 5 6 7 8 9 10 11 12 13 14

# i f ( IMGTYPE == 0 ) typedef byte typedef int32 typedef int32 imgpel ; distblk ; transpel ; / / !< p i x e l t y p e / / !< d i s t o r t i o n t y p e ( f o r p i x e l s ) / / !< d i s t o r t i o n t y p e ( f o r M a c r o b l o c k ) / / !< t r a n s f o r m e d c o e f f i c i e n t t y p e typedef uint16 d i s t p e l ;

# e l i f ( IMGTYPE == 2 ) typedef f l o a t imgpel ; typedef f l o a t d i s t p e l ; typedef f l o a t d i s t b l k ; typedef int32 t r a n s p e l ; # else typedef uint16 imgpel ; typedef uint32 d i s t p e l ;

42
typedef int64 typedef int32 # endif distblk ; transpel ;

15 16 17

IMGTYPE e o que dene o tamanho do pixel, e pode ser denido tanto para o codicador como para o decodicador (cada um deles pode trabalhar com um tamanho de pixel diferente). No encoder a denicao do IMGTYPE se encontra em lencod/inc/denes.h e do decodicador em ldecod/inc/denes.h. Por padr o o software de refer ncia vem com esse valor denido como a e 1, ou seja utiliza 16 bits para representar cada pixel. Tanto o encoder como o decodicador foram alterados para trabalhar com 8 bits para representar cada pixel, j que utilizar 16 bits n o trazia vantagem alguma na extracao dos metadados, a a gerando um overhead desnecess rio. a MAX PLANE e o que dene a quantidade de planos existentes no quadro, e pode ser denido tanto para o encoder como para o decodicador (cada um deles pode possuir uma quantidade de planos diferente). No encoder a denicao do MAX PLANE se encontra em lencod/inc/ denes.h e no decodicador em ldecod/inc/denes.h. Por padr o o software de refer ncia vem a e com esse valor denido como 3, ou seja existem 3 planos em cada quadro. Normalmente existem duas maneiras de se representar uma imagem: intercalada e planar. No caso dos quadros carregados no software de refer ncia a representacao e planar, no array e tridimensional a primeira dimens o e o plano, frm data[0] e o plano Y, frm data[1] e o plano a U e frm data[2] e o plano V. A segunda dimens o e o y/vertical do plano. A terceira dimens o e o x/horizontal do plano. a a O comprimento e a altura de cada plano se encontra no campo format da estrutura ImageData, que e do tipo FrameFormat. O ndice 0 acessa o comprimento e altura do plano Y, o ndice 1 acessa o comprimento e altura dos planos de cor (UV), o tipo FrameFormat e denido em lcommon/inc/frame.h:
1 2 3 4

typedef struct frame format { ColorFormat yuv format ; 1=4:2:0 , 2=4:2:2 , 3=4:4:4) Co lo r Mo d el do uble int int color model ; frame rate ; width [ 3 ] ; height [3]; / / !< YUV f o r m a t ( 0 = 4 : 0 : 0 , / / !< 4 : 4 : 4 f o r m a t ( 0 : YUV , 1 : / / !< f r a m e r a t e / / !< co mp o n en t f r a m e w i d t h / / !< co mp o n en t f r a m e h e i g h t

RGB, 2 : XYZ )
6 7 8

43
int right
10

auto crop right ; auto crop bottom ; bottom auto crop right cr ; crop r i g h t auto crop bottom cr ; crop bottom width crop ; consideration height crop ; consideration m b wid th ; width mb height ; height size cmp [ 3 ] ; height ) size ; size cmp ) bit depth [3]; max value [ 3 ] ; max value sq [ 3 ] ; squared pic unit size on disk ; on s t o r a g e medium pic unit size shift3 ; 3

/ / !< luma co mp o n en t a u t o c r o p / / !< luma co mp o n en t a u t o c r o p / / !< chroma co mp o n en t a u t o / / !< chroma co mp o n en t a u t o / / !< w i d t h a f t e r c r o p p i n g / / !< h e i g h t a f t e r c r o p p i n g / / !< luma co mp o n en t f r a m e / / !< luma co mp o n en t f r a m e / / !< co mp o n en t s i z e s ( w i d t h * / / !< t o t a l ima g e s i z e ( sum o f / / !< co mp o n en t b i t d e p t h / / !< co mp o n en t max v a l u e / / !< co mp o n en t max v a l u e / / !< p i c t u r e s a m p l e u n i t s i z e / / !< p i c u n i t s i z e o n d i s k >>

int int int int int int int int int int int int int int } Fr am eFo r m at ;

11

12

13

14

15

16

17

18

19 20 21

22

23

24

Para observar em mais detalhes como trabalhar com a estrutura ImageData as funcoes Mu a xImages e FilterImageSep no m dulo lcommon/src/img process.c s o bons exemplos. o 3.4.2 OBTENDO ESTIMATIVA DE MOVIMENTO

Al m dos quadros brutos, outra informacao importante para o extrator de metadados s o os e a vetores de movimento dos blocos. Na funcao code a plane antes da chamada de funcao DeblockFrame todo o processo de estimativa de movimento j est completo, e todos os vetores de movimento para todos os blocos a a da imagem est o disponveis. Neste ponto e que os vetores de estimativa de movimento do a

44

quadro s o repassados ao extrator de metadados para que ele realize a estimativa de movimento a do objeto detectado (se o extrator estiver realizando tracking). Os vetores se encontram na estrutura VideoParameters (denida em lencode/inc/global.h) no campo enc picture que e do tipo struct storable picture. Sua denicao se encontra em len code/inc/mbuffer.h, essa estrutura possui o campo mv info que e um array bidimensional de PicMotionParams. A primeira dimens o e y do bloco, que vai de 0 at (altura da imagem / tamanho do bloco). a e A segunda dimens o e o x do bloco, que vai de 0 at (comprimento da imagem / tamanho do a e bloco). Ao acessar as duas dimens es temos o PicMotionParams que possui os vetores de moo vimento para o bloco[y][x]. A estrutura PicMotionParams e denida em lencode/inc/mbuffer.h da seguinte maneira:
1 2 3 4 5

/ / ! d e f i n i t i o n of pic motion parameters typedef struct pic motion params { struct st orable pi ct ure * ref pic [2]; cha r ref idx [2]; subblock y ][ subblock x ] MotionVector byte } PicMotionParams ; mv [ 2 ] ; / / !< r e f e r r e n c e p i c t u r e p o i n t e r / / !< r e f e r e n c e p i c t u r e / / !< m o t i o n v e c t o r [ l i s t ][

6 7

f i e l d f r a m e ; / / !< i n d i c a t e s i f c o l o c a t e d i s

f i e l d o r f r a m e . W i l l be remo ved a t some p o i n t


8

O campo mv possui dois vetores de movimento, a posicao 0 tem os vetores de movimento calculados utilizando a lista 0, a posicao 1 tem os vetores calculados utilizando a lista 1. Na implementacao atual foram utilizados apenas os vetores de movimento da lista 0. Exemplo do c digo necess rio para varrer todos os vetores de movimento da lista 0: o a
1 2 3 4 5 6 7 8 9

i nt blk y , blk x ; for ( blk y =0; blk y { f o r ( b l k x = 0 ; b l k x < c e i l ( p Vid>w i d t h / BLOCK SIZE ) ; b l k x ++) { P i c M o t i o n P a r a m s * m v i n f o p = &p Vid>e n c p i c t u r e >m v i n f o [ b l k y ] [ b l k x ]; p r i n t f ( " Vetor de movimento X da lista 0 para o bloco [%d][%d] = %d\n" , b l k y , b l k x , m v i n f o p >mv [ LIST 0 ] . mv x ) ; < c e i l ( p Vid>h e i g h t / BLOCK SIZE ) ; b l k y ++)

10 11

45
p r i n t f ( " Vetor de movimento Y da lista 0 para o bloco [%d][%d] = %d\n" , b l k y , b l k x , m v i n f o p >mv [ LIST 0 ] . mv y ) ;
13 14 15 16

12

} }

Exemplos mais completos para entender como trabalhar com os vetores de movimento no software de refer ncia se encontram nas funcoes da famlia GetStrength que se encontram nas e diferentes implementacoes de loop lter (ex. loop lter normal.c). 3.4.3 CONFIGURACOES ADICIONADAS AO CODIFICADOR

Foram adicionadas novas conguracoes no codicador do software de refer ncia, para con e trolar melhor o processo de deteccao de objetos. As conguracoes primeiro t m de ser adici e onadas a estrutura struct inp par enc, que se encontra em lcommon/inc/params.h. Os campos ` adicionados foram: object detection enable - Habilita ou desabilita a deteccao de objetos. object detection min width - Comprimento mnimo do objeto para que ele seja detectado. object detection min height - Altura mnima do objeto para que ele seja detectado. object detection search hysteresis - Histerese (em quadros) da busca de um novo objeto. object detection tracking hysteresis - Histerese (em quadros) para conrmar a exist ncia/posicao e de um objeto que est sendo feito tracking. a object detection training le - Arquivo de treinamento do classicador Haar, dene o objeto que ser detectado. a Essas conguracoes tamb m foram adicionadas na estrutura Map que se encontra em len e cod/inc/congle.h. Tendo feito isso o software de refer ncia automaticamente carregar essas e a conguracoes com os valores default denidos na estrutura Map e tentar obter esses campos a a partir do arquivo de conguracao que e informado ao executar o codicador atrav s da opcao -f. e Os valores denidos no arquivo de conguracao s o automaticamente carregados na estrutura a InputParameters. Um exemplo de como denir essas conguracoes no arquivo de conguracao:

46

1 2

# # # # # # # # # # # # # # # # # # # # # # # ## # ## # # ## # # ## # ## # # ## # ## # # ## # ## # # ## # # ## # ## # # ## # ## # # ## # # ## # ## # # Object d e tec tio n / tr acki ng co n fi g u ra tio n # # # # # # # # # # # # # # # # # # # # # # # ## # ## # # ## # # ## # ## # # ## # ## # # ## # ## # # ## # # ## # ## # # ## # ## # # ## # # ## # ## # object detection enable object detection min width w i l l be d e t e c t e d object detection min height w i l l be d e t e c t e d object detection search hysteresis h y s t e r es y s ( in frames ) . = 1 # 1 = Enable , 0 = D i s a b l e

3 4

5 6

= 30 # Min w i d t h o f t h e o b j e c t t h a t = 30 # Min h e i g h t o f t h e o b j e c t t h a t = 10 # S e a r c h f o r new o b j e c t

o b j e c t d e t e c t i o n t r a c k i n g h y s t e r e s i s = 30 # Co n f ir m t r a c k e d o b j e c t ex i s t e n c e h y s t e r e s i s ( in frames ) . object detection training file = " haarcascade_frontalface_alt. xml" #

10

F i l e c o n t a i n i n g t h e t r a i n i n g i n f o u s e d on t h e o b j e c t d e t e c t i o n .

3.5

ALTERACOES REALIZADAS NO DECODIFICADOR


Nesta secao ser o apresentadas as alteracoes realizadas no decodicador do software de a

refer ncia, para aplicar os metadados recebidos no vdeo decodicado. As alteracoes visam dee senhar nos quadros decodicados os metadados do tipo ExtractedObjectBoundingBox presentes no bitstream, facilitando a constatacao visual da ec cia do sistema de deteccao e tracking de a objetos implementados no codicador. Para simplicar a implementacao do decodicador ele s detecta e aplica um metadado por quadro, mas n o existe algo que impossibilite a aplicacao o a de v rios metadados em cada quadro. a As alteracoes se concentram no momento em que um NALU do tipo SEI Unregistered UserData e detectado no bitstream, e um pouco antes do quadro decodicado ser gravado no arquivo de sada congurado. As alteracoes realizadas no decodicador se encontram no anexo B.

47

Figura 22: Vis o geral do decodicador H.264 modicado. Os blocos vermelhos representam a os processos adicionados ao decodicador.

3.5.1

RECUPERANDO METADADOS A PARTIR DO BITSTREAM

Para realizar a recuperacao de um metadado previamente inserido no bitstream durante o processo de codicacao foi adicionado na estrutura VideoParameters (denida em ldecod/inc/ global.h) do decodicador um novo campo chamado metadata buffer do tipo ExtractedMetadataBuffer. Esse buffer e inicializado na funcao main do decodicador, que se encontra em ldecod/src/decoder test.c, logo ap s o decodicador ter sido congurado, mas antes de iniciar o o processo de decodicacao. Ao longo do processo de decodicacao, sempre que um NALU do tipo SEI e encontrado no bitstream a funcao InterpretSEIMessage e chamada, essa funcao se encontra em ldecod/src/ sei.c. Nela existe um switch case para os diversos tipos de mensagens SEI possveis, no case SEI USER DATA UNREGISTERED foi adicionada deteccao se essa mensagem e um Extrac tedMetadata. Em caso armativo, esse metadado ser adicionado ao ExtractedMetadataBuffer, a caso contr rio a mensagem e ignorada. a 3.5.2 APLICANDO O METADADO AO QUADRO

Depois de receber e bufferizar os metadados foi necess rio encontrar um bom lugar para a aplicar os metadados ao quadro, de prefer ncia logo antes do quadro ser gravado em arquivo, e onde todo o processo de decodicacao j teria ocorrido. Foi escolhido o inicio da funcao write a out picture, que se encontra em ldecod/src/output.c como melhor local para realizar a aplicacao do metadado. Para auxiliar o processo de aplicacao de metadados do tipo ExtractedObjectBoundingBox foi adicionado em ldecod/src/output.c a funcao decoder draw bounding box, que verica se o metadado e do tipo ExtractedObjectBoundingBox, em caso armativo a caixa delimitadora e

48

desenhada no quadro, caso contr rio o metadado e ignorado. a No inicio da funcao write out picture um contador e utilizado para denir o n mero do u quadro (em ordem de apresentacao), o n mero do quadro e utilizado na chamada do m todo u e get da classe ExtractedMetadataBuffer, para vericar a exist ncia de um metadado para aquele e quadro. Se um metadado existir para este quadro, ser chamada a funcao decoder draw bouna ding box, que desenhar a caixa delimitadora no quadro. a

49

TESTES

Neste captulo s o apresentados os testes realizados no sistema proposto, integrando o clas a sicador Haar ao codicador do H.264. Testes detalhados de desempenho comparando o classicador Haar do OpenCV com outros 2 algoritmos de deteccao de objetos, podem ser vistos em [9]. Todos os testes utilizaram o mesmo arquivo de treinamento haarcascade frontalface alt.xml, que realiza a busca de faces frontais, este arquivo vem junto com a distribuicao do OpenCV (que pode ser encontrada em http://sourceforge.net/projects/opencvlibrary/les) no diret rio data/haarcascades. O tamanho mnimo do objeto de interesse congurado em todos o os testes foi de 30 x 30 pixels. A conguracao da m quina e o sistema operacional utilizados nos testes foi: a Processador Pentium(R) Dual-Core E5200 a 2.50GHz. 4 gigabytes de mem ria RAM. o Sistema operacional Ubuntu 11.04 32 bits. Os par metros medidos foram os seguintes: a Desempenho do sistema com tracking de objetos X sem tracking de objetos. Desempenho do sistema com o uso de histerese X sem o uso de histerese. Desempenho do sistema com diferentes conguracoes de histerese. Qualidade do tracking de objetos em suas diferentes conguracoes, constatando visual mente a caixa delimitadora desenhada no vdeo. Tamanho do bitstream com tracking de objetos X sem tracking de objetos. Foram realizados 5 testes em cada vdeo:

50

Sem tracking de objetos. Com tracking ativado, com histerese de busca = 1 e histerese de tracking = 1. Dessa maneira as informacoes de estimativa de movimento do codicador n o s o utilizadas, o a a tracking e realizado utilizando apenas o classicador Haar. Com tracking ativado, com histerese de busca = 5 e histerese de tracking = 10. Essa conguracao faz um menor uso das informacoes de estimativa de movimento para realizar tracking de um objeto. Com tracking ativado, com histerese de busca = 10 e histerese de tracking = 30. Essa conguracao depende mais das informacoes de estimativa de movimento para realizar tracking de um objeto. Com tracking ativado, com histerese de busca = 10 e histerese de tracking = 60. Essa conguracao e a que mais depende mais das informacoes de estimativa de movimento para realizar tracking de um objeto. Dessa maneira e possvel avaliar a diferenca entre realizar o tracking de um objeto utili zando apenas o classicador Haar, ou utilizando histereses com auxlio das informacoes de es timativa de movimento. Em todos os testes foi utilizada a mesma conguracao de codicacao, a unica diferenca entre as conguracoes s o o arquivo de origem, arquivo de destino, resolucao a e taxa de apresentacao (pois esses par metros s o diferentes para cada vdeo). No ap ndice E a a e encontram-se as conguracoes que foram alteradas a partir do arquivo de conguracao original que vem junto com o software de refer ncia (o arquivo de conguracao original se encontra em e bin/encoder.cfg).

4.1

V IDEO AKIYO - QCIF - 300 QUADROS


Esse vdeo pode ser encontrado em http://media.xiph.org/video/derf/y4m/akiyo qcif.y4m e

consiste basicamente de 300 quadros positivos (existe o objeto de interesse ao longo de todo o vdeo, nesse caso uma face frontal). Especicacoes do vdeo: quadros por segundo = 29.97. total de quadros = 300.

51

comprimento = 176 pixels. altura = 144 pixels. espaco de cor = YUV, 4:2:0.

Tracking Desabilitado Tempo Total (segundos) Tamanho bitstream (bytes) Atraso tempo no total 0% 0% 359220 de Codicacao 35,053

Tracking habilitado, sem histerese 38,889

Histerese de busca = 5, tracking = 10 35,500

Histerese de busca = 10, tracking = 30 35,260

Histerese de busca = 10, tracking = 60 35,190

372974

372790

372560

372561

10,94%

1,27%

0,59%

0,39%

codicacao Aumento bitstream Tabela 1: Desempenho do sistema com o vdeo Akiyo. 3,83% 3,77% 3,71% 3,71%

Figura 23: Face detectada no vdeo Akiyo.

Como este vdeo e composto de apenas uma pessoa, realizando pequenos movimentos sua ves, os resultados com histerese de tracking alta foram bons. A ativacao de deteccao de objetos em todos os quadros, utilizando apenas o classicador Haar para realizar o tracking, tornou o processo de codicacao aproximadamente 10,94% mais lento.

52

A utilizacao do classicador Haar em conjunto com a estimativa de movimento fez com que a caixa delimitadora realizasse movimentos mais suaves, com um atraso variando de 1,27% a 0,39% em relacao ao processo de codicacao original, dependendo da conguracao da histerese. O aumento no bitstream no pior caso foi de 3,83%. Em todos as conguracoes a qualidade do vdeo codicado mostrou ser a mesma:
1 2 3 4 5 6 7 8 9 10

Y { PSNR ( dB ) , cSNR ( dB ) , MSE } U { PSNR ( dB ) , cSNR ( dB ) , MSE } V { PSNR ( dB ) , cSNR ( dB ) , MSE } Total b i t s Bit ra te ( kbit / s ) @ 3 0 . 0 0 Hz

: { : { : {

41.348 , 49.603 , 51.103 ,

39.978 , 49.132 , 51.031 ,

6.53497 } 0.79417 } 0.51284 }

: 2873760 ( I 1 9 4 4 0 4 0 , P 9 2 9 5 6 0 , NVB 1 6 0 ) : 287.38 : 160 : 0

Bi t s to avoid St a r t c o d e Emulation : 0 Bits for parameter se t s Bits for f i l l e r data

4.2

V IDEO COAST GUARD - QCIF - 300 QUADROS


Esse vdeo pode ser encontrado em http://media.xiph.org/video/derf/y4m/coastguard qcif.y4m

e consiste basicamente de 300 quadros negativos (n o existe o objeto de interesse ao longo de a todo o vdeo). Como a histerese de tracking n o e utilizada neste teste, a conguracao com a histerese de busca de 10 quadros e histerese de tracking de 60 quadros n o ser apresentada. a a Especicacoes do vdeo: quadros por segundo = 29.97. total de quadros = 300. comprimento = 176 pixels. altura = 144 pixels. espaco de cor = YUV, 4:2:0.

53

Tracking Desabilitado Tempo Total (segundos) Tamanho bitstream (bytes) Atraso tempo no total 0% 0% 1240200 de Codicacao 78,200

Tracking habilitado, sem histerese 84,800

Histerese de busca = 5, tracking = 10 79,482

Histerese de busca = 10, tracking = 30 78,896

1240200

1240200

1240200

8,43%

1,63%

0,89%

codicacao Aumento bitstream Tabela 2: Desempenho do sistema com o vdeo Coast Guard. 0% 0% 0%

A ativacao de deteccao de objetos em todos os quadros tornou o processo de codicacao aproximadamente 8,43% mais lento. A utilizacao do classicador Haar com histerese de busca de 10 quadros gerou bons resultados, um atraso de apenas 0,89% em relacao ao processo de codicacao original. Com uma histerese de busca de 5 quadros o atraso dobrou para 1,63%, ainda sendo um valor bem inferior ao atraso gerado pelo processamento de todos os quadros. Como esse vdeo n o possui nenhum objeto de interesse o bitstream teve o mesmo tamanho em a todas as conguracoes, e a histerese de tracking n o foi nem sequer utilizada. a Em todos as conguracoes a qualidade do vdeo codicado mostrou ser a mesma:
1 2 3 4 5 6 7 8 9 10

Y { PSNR ( dB ) , cSNR ( dB ) , MSE } U { PSNR ( dB ) , cSNR ( dB ) , MSE } V { PSNR ( dB ) , cSNR ( dB ) , MSE } Total b i t s Bit ra te ( kbit / s ) @ 2 9 . 9 7 Hz

: { : { : {

36.174 , 47.488 , 49.023 ,

34.758 , 46.834 , 48.567 ,

21.73983 } 1.34807 } 0.90448 }

: 9921600 ( I 3 0 3 3 8 3 2 , P 6 8 8 7 6 0 8 , NVB 1 6 0 ) : 991.17 : 160 : 0

Bi t s to avoid St a r t c o d e Emulation : 0 Bits for parameter se t s Bits for f i l l e r data

54

4.3

VIDEO CREW - CIF - 300 QUADROS


Esse vdeo pode ser encontrado em http://media.xiph.org/video/derf/y4m/crew cif.y4m, pos

sui v rias pessoas andando juntas, possuindo diversas faces frontais em uma boa parte do vdeo, a andando na direcao da c mera (efeito de zoom), at que as faces cam de perl. a e Especicacoes do vdeo: quadros por segundo = 29.97. total de quadros = 300. comprimento = 352 pixels. altura = 288 pixels. espaco de cor = YUV, 4:2:0.

Tracking Desabilitado Tempo Total (segundos) Tamanho bitstream (bytes) Atraso tempo no total 0% 0% 1245195 de Codicacao 341,362

Tracking habilitado, sem histerese 371,870

Histerese de busca = 5, tracking = 10 344,997

Histerese de busca = 10, tracking = 30 342,596

Histerese de busca = 10, tracking = 60 342,376

1255323

1256008

1256661

1257621

8,93%

1,06%

0,36%

0,29%

codicacao Aumento bitstream Tabela 3: Desempenho do sistema com o vdeo Crew. 0,81% 0,86% 0,92% 0,99%

55

Figura 24: Face detectada no vdeo Crew.

Como este vdeo e composto de v rias pessoas andando juntas, possui diversas faces fron a tais simultaneamente. Dessa maneira ele exibe duas limitacoes do sistema, a capacidade de detectar e realizar o tracking de apenas um objeto por vez ( possvel realizar o tracking de e v rios objetos diferentes, utilizando extratores com treinamentos diferentes, mas n o o traca a king de v rios objetos com mesma forma), e algumas falhas quando um objeto se move r pido a a demais (a caixa delimitadora se move mais lentamente que o objeto). Quanto ao desempenho a ativacao de deteccao de objetos em todos os quadros tornou o processo de codicacao 8,93% mais lento. A utilizacao do classicador Haar em conjunto com a estimativa de movimento diminui consideravelmente o custo computacional, com um atraso no processo de codicacao variando entre 1,06% e 0,29% em relacao ao processo de codicacao original. O bitstream com os metadados inseridos no pior caso cou 0,99% maior que o bitstream original. Em todos as conguracoes a qualidade do vdeo codicado mostrou ser a mesma:
1 2 3 4 5

Y { PSNR ( dB ) , cSNR ( dB ) , MSE } U { PSNR ( dB ) , cSNR ( dB ) , MSE } V { PSNR ( dB ) , cSNR ( dB ) , MSE } Total b i t s 168) Bit ra te ( kbit / s ) @ 3 0 . 0 0 Hz

: { : { : {

35.790 , 39.443 , 38.490 ,

35.087 , 38.836 , 37.766 ,

20.15370 } 8.50048 } 10.87730 }

: 10000072 ( I 2 4 0 4 8 0 8 , P 7 5 9 5 0 9 6 , NVB : 1000.01 : 168 : 0

6 7 8 9

Bi t s to avoid St a r t c o d e Emulation : 0 Bits for parameter se t s Bits for f i l l e r data

56

4.4

VIDEO FOREMAN - CIF - 300 QUADROS


Esse vdeo pode ser encontrado em http://media.xiph.org/video/derf/y4m/foreman cif.y4m

e possui 3 situacoes diferentes, uma face frontal, a face ca de perl em alguns momentos, e depois a face sai do vdeo. Especicacoes do vdeo: quadros por segundo = 29.97. total de quadros = 300. comprimento = 352 pixels. altura = 288 pixels. espaco de cor = YUV, 4:2:0.

Tracking Desabilitado Tempo Total (segundos) Tamanho bitstream (bytes) Atraso tempo no total 0% 0% 1244893 de Codicacao 260,432

Tracking habilitado, sem histerese 286,162

Histerese de busca = 5, tracking = 10 265,003

Histerese de busca = 10, tracking = 30 262,654

Histerese de busca = 10, tracking = 60 262,126

1249485

1250345

1251793

1253161

9,87%

1,75%

0,85%

0,65%

codicacao Aumento bitstream Tabela 4: Desempenho do sistema com o vdeo Foreman. 0,36% 0,43% 0,55% 0,66%

57

Figura 25: Face detectada no vdeo Foreman.

Com a deteccao de objetos ocorrendo em todos os quadros percebe-se uma alta taxa de falsos negativos, j que o rosto no vdeo ca de perl em alguns momentos e o classicador a Haar n o consegue identicar o rosto em perl, perdendo assim o tracking do rosto. Com a a deteccao de objetos em todos os quadros tamb m ocorreu um falso positivo quando a c mera e a se move e deixa de gravar o rosto. A medida que a histerese de tracking e aumentada, al m de e n o ocorrer o falso positivo, os movimentos que o rosto realiza s o acompanhados com maior a a suavidade e com uma menor taxa de falsos negativo (com a histerese de tracking congurada para 60 quadros n o ocorreu nenhum falso negativo). a Quanto ao desempenho a ativacao de deteccao de objetos em todos os quadros tornou o processo de codicacao 9,87% mais lento. A utilizacao do classicador Haar em conjunto com a estimativa de movimento diminui consideravelmente o custo computacional, com um atraso no processo de codicacao variando entre 1,75% e 0,65% em relacao ao processo de codicacao original. O bitstream com os metadados inseridos no pior caso cou 0,66% maior que o bitstream original. Em todos as conguracoes a qualidade do vdeo codicado mostrou ser a mesma:
1 2 3 4 5 6 7 8 9

Y { PSNR ( dB ) , cSNR ( dB ) , MSE } U { PSNR ( dB ) , cSNR ( dB ) , MSE } V { PSNR ( dB ) , cSNR ( dB ) , MSE } Total b i t s Bit ra te ( kbit / s ) @ 3 0 . 0 0 Hz

: { : { : {

36.017 , 41.277 , 43.175 ,

34.568 , 40.985 , 42.592 ,

22.71311 } 5.18274 } 3.57977 }

: 9959144 ( I 2 8 1 3 1 6 8 , P 7 1 4 5 8 0 8 , NVB 1 6 8 ) : 995.91 : 168 : 0

Bi t s to avoid St a r t c o d e Emulation : 0 Bits for parameter se t s Bits for f i l l e r data

58

4.5

VIDEO PEDESTRIAN AREA - 375 QUADROS


Esse vdeo pode ser encontrado em http://media.xiph.org/video/derf/y4m/pedestrian area

1080p25.y4m. Ele consiste basicamente de v rios pedestres caminhando em uma rua, possui a faces frontais e faces em perl se movendo continuamente. 4.5.1 TESTES COM RESOLUCAO 1080P (1920 X 1080)

Especicacoes do vdeo: quadros por segundo = 25. total de quadros = 375. comprimento = 1920 pixels. altura = 1080 pixels. espaco de cor = YUV, 4:2:0.

Tracking Desabilitado Tempo Total (segundos) Tamanho bitstream (bytes) Atraso tempo no total 0% 0% 7854045 de Codicacao 6915.861

Tracking habilitado, sem histerese 7280.818

Histerese de busca = 5, tracking = 10 6921.871

Histerese de busca = 10, tracking = 30 6918.653

Histerese de busca = 10, tracking = 60 6916.272

7870345

7870468

7870642

7870601

5,27%

0,08%

0,04%

0,005%

codicacao Aumento bitstream Tabela 5: Desempenho do sistema com o vdeo Pedestrian area. 0,207% 0,209% 0,211% 0,210%

59

Figura 26: Face detectada no vdeo Pedestrian area.

Com a deteccao de objetos ocorrendo em todos os quadros ocorre uma grande quantidade de falsos positivos, e a limitacao de realizar o tracking de apenas um objeto por vez cou bem evidente j que neste vdeo existem diversas pessoas andando ao mesmo tempo o sistema a consegue realizar o tracking de algumas faces por um curto perodo de tempo, mas logo depois detecta outra face e passa a realizar o tracking dessa face ao inv s da que foi previamente e detectada. A utilizacao das histereses alterou um pouco o comportamento do sistema (em geral ele manteve uma alta taxa de falsos positivos), a primeira deteccao que ocorre com sucesso realiza o tracking da face corretamente, mas ap s essa primeira deteccao ocorre uma s rie de falsos o e positivos, e em algumas deteccoes positivas o tracking n o consegue acompanhar a face por ela a estar se movendo r pido demais. a Quanto ao desempenho a ativacao de deteccao de objetos em todos os quadros tornou o processo de codicacao 5,27% mais lento. A utilizacao do classicador Haar em conjunto com a estimativa de movimento diminui consideravelmente o custo computacional, com um atraso no processo de codicacao inferior a 0,1% em todas as conguracoes de histerese testadas. O bitstream com os metadados inseridos no pior caso cou 0,211% maior que o bitstream original. Em todos as conguracoes a qualidade do vdeo codicado mostrou ser a mesma:
1 2 3 4

Y { PSNR ( dB ) , cSNR ( dB ) , MSE } U { PSNR ( dB ) , cSNR ( dB ) , MSE } V { PSNR ( dB ) , cSNR ( dB ) , MSE }

: { : { : {

37.196 , 41.390 , 42.574 ,

37.136 , 41.356 , 42.530 ,

12.57412 } 4.75815 } 3.63104 }

60
Total b i t s 184)
6 7 8 9

: 62832360 ( I 1 1 0 4 9 5 1 2 , P 5 1 7 8 2 6 6 4 , NVB @ 2 5 . 0 0 Hz : 4188.82 : 184 : 0

Bit ra te ( kbit / s )

Bi t s to avoid St a r t c o d e Emulation : 0 Bits for parameter se t s Bits for f i l l e r data

4.5.2

TESTES COM RESOLUCAO 720P (1280 X 720)

Neste teste a resolucao do vdeo que foi reduzida de 1080p (1920 x 1080) para 720p (1280 x 720), visando a constatacao da diferenca do impacto do sistema de tracking ao processar o mesmo vdeo com resolucoes diferentes. O escalonamento do vdeo foi realizado utilizando o Gstreamer. Especicacoes do vdeo: quadros por segundo = 25. total de quadros = 375. comprimento = 1280 pixels. altura = 720 pixels. espaco de cor = YUV, 4:2:0.

61

Tracking Desabilitado Tempo Total (segundos) Tamanho bitstream (bytes) Atraso tempo no total 0% 0% 4269076 de Codicacao 2986.361

Tracking habilitado, sem histerese 3317.612

Histerese de busca = 5, tracking = 10 3011.626

Histerese de busca = 10, tracking = 30 2999.675

Histerese de busca = 10, tracking = 60 2993.329

4283747

4284989

4283815

4284129

11,09%

0,84%

0,44%

0,23%

codicacao Aumento bitstream Tabela 6: Desempenho do sistema com o vdeo Pedestrian area - 720p. 0,34% 0,37% 0,34% 0,35%

A diminuicao da resolucao do vdeo n o gerou nenhuma diferenca na qualidade do trac a king, por m foi possvel perceber um aumento no atraso no tempo total de codicacao em todas e as conguracoes. Com tracking habilitado e sem histerese, o atraso no vdeo original (1080p) foi de 5,27% enquanto que o atraso gerado no mesmo vdeo, reescalonado para 720p, foi de 11,09%, mostrando que a medida que o tamanho do vdeo aumenta o atraso gerado pelo classi cador Haar tende a diminuir. Em todos as conguracoes a qualidade do vdeo codicado mostrou ser a mesma:
1 2 3 4 5

Y { PSNR ( dB ) , cSNR ( dB ) , MSE } U { PSNR ( dB ) , cSNR ( dB ) , MSE } V { PSNR ( dB ) , cSNR ( dB ) , MSE } Total b i t s 176) Bit ra te ( kbit / s ) @ 2 5 . 0 0 Hz

: { : { : {

36.269 , 40.982 , 41.777 ,

36.196 , 40.944 , 41.730 ,

15.61449 } 5.23199 } 4.36622 }

: 34152608 ( I 6 3 0 0 4 6 4 , P 2 7 8 5 1 9 6 8 , NVB : 2276.84 : 176 : 0

6 7 8 9

Bi t s to avoid St a r t c o d e Emulation : 0 Bits for parameter se t s Bits for f i l l e r data

62

4.6

VIDEO SPEED BAG - 570 QUADROS


Esse vdeo pode ser encontrado em http://media.xiph.org/video/derf/y4m/speed bag 1080p.y4m.

Uma parte do vdeo possui uma face frontal realizando pequenos movimentos. O vdeo original se encontra com espaco de cor YUV 4:2:2, por m para facilitar o procedimento de teste e a e comparacao com os resultados de outros vdeos ele foi convertido para o espaco de cor YUV 4:2:0, utilizando o Gstreamer. O vdeo consiste de um face de perl se movendo (pessoa cami nhando), nenhuma face, uma face frontal realizando movimentos suaves e depois uma face de perl realizando movimentos r pidos (pugilista socando um saco de pancada). a 4.6.1 TESTES COM RESOLUCAO 1080P (1920 X 1080)

Especicacoes do vdeo: quadros por segundo = 29.97. total de quadros = 570. comprimento = 1920 pixels. altura = 1080 pixels. espaco de cor = YUV, 4:2:0.

63

Tracking Desabilitado Tempo Total (segundos) Tamanho bitstream (bytes) Atraso tempo no total 0% 0% 8409840 de Codicacao 12719.172

Tracking habilitado, sem histerese 13689.180

Histerese de busca = 5, tracking = 10 12867.480

Histerese de busca = 10, tracking = 30 12821.436

Histerese de busca = 10, tracking = 60 12765.063

8425882

8428471

8428672

8430918

7,62%

1,16%

0,8%

0,36%

codicacao Aumento bitstream Tabela 7: Desempenho do sistema com o vdeo Speed bag - 1080p. 0,19% 0,22% 0,22% 0,25%

Figura 27: Face detectada no vdeo Speed bag.

Utilizando a deteccao de objetos em todos os quadros ocorrem diversos falsos positivos, a maior parte dos momentos em que existe a face de perl ocorrem falsos positivos ou falsos negativos. O momento em que ocorre a face frontal no vdeo possui uma maior quantidade de

64

positivos, por m em alguns momentos ocorrem falsos positivos (um objeto no fundo e detectado e como a face), mostrando claramente a limitacao que existe ao se congurar o classicador Haar para realizar a deteccao de apenas um objeto na imagem. O tracking pode se confundir ao detectar outro objeto que n o e uma face, j que apenas o primeiro objeto a ser encontrado na a a imagem e retornado pelo classicador Haar. A utilizacao de histereses ofereceu pouca melhora na qualidade do tracking, j que neste a vdeo a quantidade de falsos positivos foi muito grande. Apenas no momento em que ocorria a face frontal a histerese mostrou uma melhora signicativa, j que a face frontal era detectada e a durante a histerese de tracking apenas os vetores de movimento calculados pela estimativa de movimento era utilizados para realizar o tracking, reduzindo os falsos positivos gerados pelo classicador Haar. Quanto ao desempenho a ativacao de deteccao de objetos em todos os quadros tornou o processo de codicacao 7,62% mais lento. A utilizacao do classicador Haar em conjunto com a estimativa de movimento diminui consideravelmente o custo computacional, com um atraso no processo de codicacao variando entre 1,16% e 0,36% em relacao ao processo de codicacao original. O bitstream com os metadados inseridos no pior caso cou 0,25% maior que o bitstream original. Em todos as conguracoes a qualidade do vdeo codicado mostrou ser a mesma:
1 2 3 4 5

Y { PSNR ( dB ) , cSNR ( dB ) , MSE } U { PSNR ( dB ) , cSNR ( dB ) , MSE } V { PSNR ( dB ) , cSNR ( dB ) , MSE } Total b i t s 184) Bit ra te ( kbit / s ) @ 3 0 . 0 0 Hz

: { : { : {

39.554 , 43.495 , 44.830 ,

39.283 , 43.394 , 44.669 ,

7.67013 } 2.97618 } 2.21926 }

: 67278720 ( I 9 8 0 9 3 1 2 , P 5 7 4 6 9 2 2 4 , NVB : 3540.99 : 184 : 0

6 7 8 9

Bi t s to avoid St a r t c o d e Emulation : 0 Bits for parameter se t s Bits for f i l l e r data

4.6.2

TESTES COM RESOLUCAO 720P (1280 X 720)

Neste teste a resolucao do vdeo que foi reduzida de 1080p (1920 x 1080) para 720p (1280 x 720), visando a constatacao da diferenca do impacto do sistema de tracking ao processar o mesmo vdeo a resolucoes diferentes. O escalonamento do vdeo foi realizado utilizando o Gstreamer.

65

Especicacoes do vdeo: quadros por segundo = 29.97. total de quadros = 570. comprimento = 1280 pixels. altura = 720 pixels. espaco de cor = YUV, 4:2:0.

Tracking Desabilitado Tempo Total (segundos) Tamanho bitstream (bytes) Atraso tempo no total 0% 0% 4595164 de Codicacao 5346.245

Tracking habilitado, sem histerese 5843.674

Histerese de busca = 5, tracking = 10 5394.242

Histerese de busca = 10, tracking = 30 5365.767

Histerese de busca = 10, tracking = 60 5352.772

4607265

4609359

4612805

4616437

9,3%

0,89%

0,36%

0,12%

codicacao Aumento bitstream Tabela 8: Desempenho do sistema com o vdeo Speed bag - 720p. 0,26% 0,30% 0,38% 0,46%

A diminuicao da resolucao do vdeo n o gerou nenhuma diferenca na qualidade do tracking, a por m foi possvel perceber um aumento no atraso no tempo total de codicacao em todas as e conguracoes. Com tracking habilitado e sem histerese, o atraso no vdeo original (1080p) foi de 7,62% enquanto que o atraso gerado no mesmo vdeo, reescalonado para 720p, foi de 9,3%, mostrando que a medida que o tamanho do vdeo aumenta o atraso gerado pelo classicador Haar tende a diminuir. Em todos as conguracoes a qualidade do vdeo codicado mostrou ser a mesma:

66

1 2 3 4 5

Y { PSNR ( dB ) , cSNR ( dB ) , MSE } U { PSNR ( dB ) , cSNR ( dB ) , MSE } V { PSNR ( dB ) , cSNR ( dB ) , MSE } Total b i t s 176) Bit ra te ( kbit / s ) @ 3 0 . 0 0 Hz

: { : { : {

39.131 , 43.023 , 44.422 ,

38.752 , 42.893 , 44.220 ,

8.66746 } 3.34007 } 2.46079 }

: 36761312 ( I 5 5 5 4 4 1 6 , P 3 1 2 0 6 7 2 0 , NVB : 1934.81 : 176 : 0

6 7 8 9

Bi t s to avoid St a r t c o d e Emulation : 0 Bits for parameter se t s Bits for f i l l e r data

4.7

CONCLUSAO DA AVALIACAO DO SISTEMA


De acordo com os testes realizados a utilizacao de uma histerese na execucao do classi

cador Haar tornou o sistema mais eciente. Se somente fosse utilizada a histerese, isso geraria saltos na caixa delimitadora, o uso da estimativa de movimento suavizou esse efeito sem aumentar a complexidade do codicador, j que a estimativa de movimento faz parte do proa cesso normal de codicacao. Dependendo da natureza do movimento realizado pelo objeto, a utilizacao da estimativa de movimento pode gerar resultados inferiores ou superiores a execucao do classicador Haar em todos os quadros. Por exemplo, nos testes apresentados o objeto de interesse era face frontal. Sem utilizar a estimativa de movimento quando uma face se vira de lado o classicador Haar n o consegue a mais detectar a face que est de perl, por m utilizando estimativa de movimento o tracking da a e face de perl funciona j que uma vez identicado o objeto s e necess rio acompanhar seus a o a movimentos. Ao mesmo tempo, dependendo do quanto o objeto de interesse se mover a caixa delimitadora n o acompanha perfeitamente o movimento do objeto utilizando as informacoes a de estimativa de movimento. Em vdeos com longos trechos sem nenhum objeto de interesse o impacto do classicador Haar tende a ser um pouco menor que o normal, mas em conjunto com a histerese de busca o custo computacional foi reduzido. Inserir um metadado por quadro, mesmo onde o vdeo possui o objeto de interesse em grande parte dos seus quadros, n o gerou um bitstream muito maior a que o normal, o pior caso n o passou de um aumento de 4%, considerando que quanto maior a for a resolucao do vdeo e a qualidade do processo de codicacao, menor ser esse aumento em a relacao ao bitstream original (isso pode ser observado nos testes com diferentes resolucoes). Com relacao ao impacto da utilizacao do classicador Haar integrado ao codicador em

67

diferentes resolucoes, foi possvel observar que a medida que a resolucao do vdeo aumenta, o custo computacional do processo de codicacao tende a aumentar mais que o custo computacio nal do classicador Haar, j que nos testes em vdeos com alta resolucao o impacto da utilizacao a do sistema de tracking foi menor que nos vdeos com resolucoes menores. Esse resultado foi obtido com o perl de codicacao utilizado nos testes, seria interessante realizar testes com outros pers de codicacao, pois poderiam mostrar resultados diferentes. Percebe-se tamb m a necessidade de realizar a deteccao e tracking de m ltiplos objetos e u (que sejam do mesmo padr o, ou seja, utilizem o mesmo arquivo de treinamento para realizar a a busca) simultaneamente, como pode ser constatado em [5] p gina 507, o classicador Haar a tende a ter uma baixa taxa de falsos negativos (ou seja, n o detectar a presenca de um objeto a de interesse), em troca de ter uma alta taxa de falsos positivos (detectar um objeto que n o a e o de interesse), por causa disso utilizar o classicador Haar para retornar o primeiro objeto encontrado simplica o sistema mas deixa o tracking mais suscetvel a erros.

68

CONCLUSOES

Para desenvolver o projeto foi escolhido o software de refer ncia para o padr o de come a press o de vdeo MPEG 4 parte 10. Dois tipos de metadados foram desenvolvidos ao longo do a trabalho, um representa a caixa delimitadora de um objeto de interesse, o outro e o plano luma bruto de um objeto de interesse. Testes realizados tanto com o decodicador de refer ncia como com o Gstreamer mose traram que o uso de mensagens Supplemental Enhancement Information do tipo Unregistered Userdata para transportar os metadados diretamente no bitstream do vdeo n o alteraram a con a formidade do mesmo com o padr o, sendo possvel exibir um vdeo com metadados embutidos a em qualquer decodicador MPEG 4 parte 10. Apesar do padr o MPEG 4 parte 10 n o denir um tamanho m ximo para mensagens a a a Supplemental Enhancement Information do tipo Unregistered Userdata, pode existir um limite implcito no tamanho m ximo de um NALU (de acordo com o nvel/perl implementado), o a que reetiria em um tamanho m ximo para as mensagens. a Para facilitar a deteccao de objetos foi utilizado um algoritmo de deteccao de padr es em o imagens est ticas, o classicador Haar, implementado na biblioteca de vis o computacional a a OpenCV. Executar o classicador Haar em todos os quadros do vdeo mostrou um aumento consider vel no custo computacional do codicador. a Utilizou-se informacoes de estimativa de movimento calculadas pelo codicador para esti mar o movimento do objeto, evitando a necessidade de executar o classicador Haar em todos os quadros do vdeo, dessa maneira constatou-se uma signicativa reducao do custo computacional reutilizando informacoes geradas pelo processo de codicacao. Com as alteracoes realizadas no decodicador de refer ncia foi possvel recuperar os metadados. Os metadados representando a e caixa delimitadora de um objeto detectado, s o desenhados no quadro, facilitando a constatacao a visual do funcionamento do sistema. Como toda a extracao do metadado e insercao dele dentro do bitstream e feita internamente no codicador isso facilita a construcao de um chip codicador H.264 que realize tracking de

69

objetos, esse chip codicador poderia ter grande parte do classicador Haar acelerado tamb m e em hardware, dentro do chip. Como pode ser visto em [8], obt m-se um grande aumento no e desempenho da deteccao de objetos ao se implementar o classicador Haar em FPGA. Este trabalhou mostrou a viabilidade de se utilizar a estimativa de movimento gerada pelo codicador para auxiliar o tracking de objetos e do envio dessas informacoes atrav s do bits e tream do vdeo. Al m das informacoes de tracking foi possvel enviar o objeto detectado n o e a compactado como metadado, o que pode ser util em algoritmos de identicacao biom trica. No e momento da an lise dos vdeos e necess rio analisar apenas os metadados que est o inseridos a a a no bitstream, grande parte do processamento j foi realizado durante o processo de codicacao. a

5.1 TRABALHOS FUTUROS


Como possveis trabalhos futuros, cita-se: Fazer um melhor uso das informacoes geradas pelo processo de codicacao para gerar heursticas mais inteligentes. Um exemplo seria utilizar histereses din micas, quando a existe muito movimento no vdeo as histereses diminuem, mas quando n o existe movi a mento as histereses aumentam. Estender o sistema para realizar a deteccao e tracking de m ltiplos objetos (com mesma u forma) simultaneamente. Buscar no classicador Haar c lculos que j possam ter sido feitos pelo codicador, mea a lhorando a integracao dos dois. Utilizar outro algoritmo de deteccao de padr es que tenha uma maior intersecao com os o algoritmos presentes no codicador. Utilizar apenas as informacoes de estimativa de movimento para a construcao de cercas virtuais ou alarmes que n o se importem com a forma do objeto mas com padr es de a o movimento suspeitos. Desenvolver um chip codicador H.264 integrado ao classicador Haar integrado no chip, realizando a deteccao e tracking de objetos em tempo real. Cita-se [8] como exemplo de um classicador Haar acelerado em hardware.

70

REFERENCIAS

[1] LAI, S. S. Z. e S. H. FACE DETECTION DIRECTLY FROM H.264 COMPRESSED VIDEO WITH CONVOLUTIONAL NEURAL NETWORK. [S.l.]: IEEE, 2009. [2] RICHARDSON, I. The H.264 Advanced Video Compression Standard. [S.l.]: John Wiley and Sons, 2010. [3] RECOMMENDATION H.264 - Advanced Video Coding (03/2010). [S.l.]: ITU-T and ISO/IEC, 2010. [4] IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO TECHNOLOGY, VOL. 13, NO.7, JULY 2003. [S.l.]: IEEE, 2003. [5] KAEHLER, G. B. e A. Learning OpenCV. [S.l.]: OReally, 2008. [6] JONES, P. V. e M. Rapid Object Detection Using a Boosted Cascade of Simple Features. [S.l.]: IEEE CVPR, 2001. [7] MAYDT, R. L. e J. An Extended Set of Haar-like Features for Rapid Object Detection. [S.l.]: IEEE ICIP, 2002. [8] LU, C. G. e S.-L. Novel FPGA Based Haar Classier Face Detection Algorithm Acceleration. [S.l.]: IEEE, 2008. [9] BOLME, M. S. e. J. R. B. D. S. FacePerf: Benchmarks for Face Recognition Algorithms. [S.l.]: IEEE, 2007.

71

APENDICE A CODIGO FONTE DO PROCEDIMENTO DE TESTE DA INSERCAO DE NALUS SEI

No caso dos m dulos novos, todo o seu fonte e documentado aqui. o No caso dos m dulos que j existiam no software de refer ncia e sofreram alteracoes, apeo a e nas as funcoes que sofreram alteracao ser o documentadas aqui. a

6.1 MODULO ADICIONADO AO CODIFICADOR


6.1.1 ARQUIVO UDATA GEN.H
1 2

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** \file udata gen . h \ brief d e f i n i t i o n s f o r S u p p l e m e n t a l Enhanced I n f o r m a t i o n U s e r d a t a Generation \ author ( s ) Tiago K a t c i p i s com> <t i a g o k a t c i p i s @ g m a i l .

3 4 5 6

7 8

9 10

11 12 13 14 15 16 17 18

*/ # i f n d e f UDATA GEN H # d e f i n e UDATA GEN H # i n c l u d e " typedefs.h" # i n c l u d e "nal.h"

72
/* !

19 20

* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * G e n e r a t e s a SEI NALU t h a t w i t h ONE u n r e g i s t e r e d u s e r d a t a SEI messa g e . * * @param d a t a The d a t a t o be s e n t on t h e SEI u n r e g i s t e r e d u s e r d a t a messa g e . * @param s i z e The s i z e o f t h e d a t a . * @retu rn A SEI NALU c o n t a i n i n g t h e SEI messa g e . *

21 22 23

24 25 26 27

* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * */ NALU t * u s e r d a t a g e n e r a t e u n r e g i s t e r e d s e i n a l u ( cha r * d a t a , u n s i g n e d i n t size ) ; /* !

28 29

30 31 32

* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * G e n e r a t e s a SEI NALU t h a t w i t h ONE u n r e g i s t e r e d u s e r d a t a SEI messa g e . * * @param msg The messa g e t o be s e n t on t h e SEI u n r e g i s t e r e d u s e r d a t a message , * * mu st be a 0 t e r m i n a t e d s t r i n g . * @retu rn A SEI NALU c o n t a i n i n g t h e SEI messa g e .

33 34 35

36 37 38 39

* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * */ NALU t * u s e r d a t a g e n e r a t e u n r e g i s t e r e d s e i n a l u f r o m m s g ( cha r * msg ) ; /* !

40 41 42 43 44

* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * G e n e r a t e s a 0 t e r m i n a t e d s t r i n g t o be s e n t on a SEI NALU . The s i z e o f t h e messa g e i s * random , b u t i t w i l l n o t e x c e e d MAXNALUSIZE . * * @retu rn a 0 t e r m i n a t e d s t r i n g . *

45

46 47 48 49 50

* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * * ** * ** * * ** */

51

73
cha r * u s e r d a t a g e n e r a t e c r e a t e r a n d o m m e s s a g e ( ) ; /* !

52 53 54 55

* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * F r e e s t h e r e s o u r c e s u s e d by a msg . * * @param msg A p r e v i o u s l y c r e a t e d messa g e . *

56 57 58 59 60

* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * * ** * ** * * ** */ v o i d u s e r d a t a g e n e r a t e d e s t r o y r a n d o m m e s s a g e ( cha r * msg ) ; # endif

61 62 63 64

6.1.2 ARQUIVO UDATA GEN.C


1 2 3 4 5 6 7 8 9 10 11

# i n c l u d e < s t r i n g . h> # i n c l u d e < s t d i o . h> # i n c l u d e < s t d l i b . h> # i n c l u d e " udata_gen.h" # i n c l u d e "vlc.h" # i n c l u d e "sei.h" # i n c l u d e " nalu.h"

s t a t i c c o n s t cha r * r a n d o m m e s s a g e s t a r t t e m p l a t e = "\ nRandom message [%d] start\n" ; s t a t i c c o n s t cha r * r a n d o m m e s s a g e e n d t e m p l a t e end!\n" ; s t a t i c int msg counter /* Lets guarantee t h at max msg size + headers + e m u l a t i o n p r e v e n t i o n b y t e s d o n t e x c e e d t h e MAXNALUSIZE * / = MAXNALUSIZE 1 0 2 4 ; s t a t i c const i n t max msg size static int growth rate static int actual size # d e f i n e MAX TEMPLATE MSG SIZE 512 = 1024; = 1024; = "\ nRandom message [%d] = 1;

12

13 14 15 16 17 18 19 20 21 22

74
s t a t i c cha r r a n d o m m e s s a g e s t a r t b u f f e r [ MAX TEMPLATE MSG SIZE ] ; s t a t i c cha r r a n d o m m e s s a g e e n d b u f f e r [ MAX TEMPLATE MSG SIZE ] ; /* !

23 24 25 26 27

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * * \ brief i n t GenerateUserDataSEImessage rbsp ( i n t , b y t e * , char * , unsigned i n t ) * * * \ return s i z e o f t h e RBSP i n b y t e s , n e g a t i v e i n c a s e o f an e r r o r * *

28 29 30 31 32 33 34

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * */ s t a t i c i n t G e n e r a t e U s e r D a t a S E I m e s s a g e r b s p ( i n t i d , b y t e * r b s p , cha r * sei m essag e , unsigned i n t s e i m e s s a g e s i z e ) { Bitstream * bitstream ; unsigned i n t m e s s a g e s i z e = s e i m e s s a g e s i z e ; i n t LenInBytes ; a s s e r t ( r b s p ! = NULL) ; i f ( ( b i t s t r e a m = c a l l o c ( 1 , s i z e o f ( B i t s t r e a m ) ) ) ==NULL) n o m e m e x i t ( " SeqParameterSet: bitstream" ) ; // . . and u s e t h e r b s p p r o v i d e d ( o r a l l o c a t e d a b o ve ) f o r t h e d a t a

35 36

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

b i t s t r e a m >s t r e a m B u f f e r = r b s p ; b i t s t r e a m > b i t s t o g o = 8 ; { cha r u u i d m e s s a g e [ 9 ] = " Random" ; / / T h i s i s s u p p o s e d t o be Random unsigned i n t i ; TIME T s t a r t t i m e ; g e t t i m e (& s t a r t t i m e ) ; // s t a r t time

u v ( 8 , "SEI: last_payload_type_byte" , 5 , b i t s t r e a m ) ; m e s s a g e s i z e += 1 7 ; while ( m essag e size > 254) { u v ( 8 , " SEI: ff_byte " , 2 5 5 , b i t s t r e a m ) ;

75
m e s s a g e s i z e = 2 5 5 ; } u v ( 8 , "SEI: last_payload_size_byte" , m e s s a g e s i z e , b i t s t r e a m ) ; / / L e t s r a n d o m i z e u u i d b a s e d on t i m e u v ( 3 2 , "SEI: uuid_iso_iec_11578" , ( i n t ) s t a r t t i m e . t v s e c , b i t s t r e a m ) ; u v ( 3 2 , "SEI: uuid_iso_iec_11578" , ( i n t ) s t a r t t i m e . t v u s e c , b i t s t r e a m ) ; u v ( 3 2 , "SEI: uuid_iso_iec_11578" , ( i n t ) ( u u i d m e s s a g e [ 0 ] << 2 4 ) + ( u u i d m e s s a g e [ 1 ] << 1 6 ) << 0 ) , b i t s t r e a m ) ;
72

63 64 65 66 67 68 69 70 71

+ ( u u i d m e s s a g e [ 2 ] << 8 ) + ( u u i d m e s s a g e [ 3 ]

u v ( 3 2 , "SEI: uuid_iso_iec_11578" , ( i n t ) ( u u i d m e s s a g e [ 4 ] << 2 4 ) + ( u u i d m e s s a g e [ 5 ] << 1 6 ) << 0 ) , b i t s t r e a m ) ; + ( u u i d m e s s a g e [ 6 ] << 8 ) + ( u u i d m e s s a g e [ 7 ]

73 74 75 76 77 78

f o r ( i = 0 ; i < s e i m e s s a g e s i z e ; i ++) { u v ( 8 , "SEI: user_data_payload_byte" , s e i m e s s a g e [ i ] , b i t s t r e a m ) ; } / * FIXME we MUST h a v e t h i s z e r o o r t h e o r i g i n a l co d ed was s u p o s e d t o z e r o t e r m i n a t e t h e msg ? * / u v ( 8 , "SEI: user_data_payload_byte" , 0 , b i t s t r e a m ) ; } SODBtoRBSP ( b i t s t r e a m ) ; byte buffer / / copies the l a s t couple of b i t s in to the

79 80 81 82

83 84 85 86 87 88 89 90 91

L e n I n B y t e s = b i t s t r e a m >b y t e p o s ; free ( bitstream ) ; return LenInBytes ; }

/* !

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * * \ brief F u n c t i o n b o d y f o r U n r e g i s t e r e d u s e r d a t a SEI messa g e NALU g e n e r a t i o n * * * \ return A NALU c o n t a i n i n g t h e SEI messa g e . * *

92 93 94 95 96 97

76

98

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * */ NALU t * u s e r d a t a g e n e r a t e u n r e g i s t e r e d s e i n a l u ( cha r * d a t a , u n s i g n e d i n t size ) { NALU t * n = AllocNALU (MAXNALUSIZE) ; i n t RBSPlen = 0 ; b y t e r b s p [ MAXRBSPSIZE ] ; RBSPlen = G e n e r a t e U s e r D a t a S E I m e s s a g e r b s p ( NORMAL SEI , r b s p , d a t a , s i z e ) ; RBSPtoNALU ( r b s p , n , RBSPlen , NALU TYPE SEI , NALU PRIORITY DISPOSABLE , 1 ) ;

99 100

101 102 103 104 105 106 107

108 109 110 111 112 113 114 115

n> s t a r t c o d e p r e f i x l e n = 4 ; return n ; }

/* !

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * * \ brief F u n c t i o n b o d y f o r U n r e g i s t e r e d u s e r d a t a SEI messa g e NALU g e n e r a t i o n * * * \ return A NALU c o n t a i n i n g t h e SEI messa g e . * *

116 117 118 119 120 121 122

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * */ NALU t * u s e r d a t a g e n e r a t e u n r e g i s t e r e d s e i n a l u f r o m m s g ( cha r * msg ) { r e t u r n u s e r d a t a g e n e r a t e u n r e g i s t e r e d s e i n a l u ( msg , s t r l e n ( msg ) ) ; }

123 124 125 126 127 128 129 130 131

/* !

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * * \ brief F u n c t i o n b o d y f o r random s t r i n g messa g e g e n e r a t i o n . * *

132 133 134

77
* \ return A 0 terminted string . * *

135 136 137 138

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * */ cha r * u s e r d a t a g e n e r a t e c r e a t e r a n d o m m e s s a g e ( ) { cha r * msg int msg size = 0; = 0;

139 140 141 142 143 144 145 146 147 148 149 150

int body size = 0; int s t a r t l e n = 0; int end len int i = 0; = 0;

/ * T h i s w i l l h e l p d eb u g o f t h e SEI m e s s a g e s a t t h e d e c o d e r * / s n p r i n t f ( r a n d o m m e s s a g e s t a r t b u f f e r , MAX TEMPLATE MSG SIZE , random message start template , msg counter ) ; s n p r i n t f ( r a n d o m m e s s a g e e n d b u f f e r , MAX TEMPLATE MSG SIZE , random message end template , msg counter ) ; m s g c o u n t e r ++; s t a r t l e n = s trl en ( random message start buffer ) ; end len = s t r l e n ( random message end buffer ) ;

151

152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174

body size = ac t u a l s i z e ; a c t u a l s i z e += g r o w t h r a t e ; i f ( a c t u a l s i z e > max msg size ) { actual size = growth rate ; } msg size = body size + s t a r t l e n + msg = malloc ( msg size ) ; end len + 1;

/* writing the s t a r t */ memcpy ( msg , r a n d o m m e s s a g e s t a r t b u f f e r , s t a r t l e n ) ; / * w r i t i n g t h e body * / f o r ( i = s t a r t l e n ; i < m s g s i z e e n d l e n ; i ++) { msg [ i ] = h ; / * w h a t e v e r * / }

78
/ * w r i t i n g t h e end * / memcpy ( msg + s t a r t l e n + b o d y s i z e , r a n d o m m e s s a g e e n d b u f f e r , e n d l e n ) ;
177 178 179 180 181 182 183 184

175 176

/* 0 terminate i t */ msg [ m s g s i z e 1 ] = \0 ; r e t u r n msg ; } /* !

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * * \ brief F u n c t i o n b o d y f o r random messa g e d e s t r u c t i o n . *

185 186 187

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * */ v o i d u s e r d a t a g e n e r a t e d e s t r o y r a n d o m m e s s a g e ( cha r * msg ) { f r e e ( msg ) ; }

188 189 190 191 192

6.2 ALTERACOES NO CODIFICADOR


6.2.1 ARQUIVO FILEHANDLE.C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

/* ! * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * \ brief * * T h i s f u n c t i o n o p e n s t h e o u t p u t f i l e s and g e n e r a t e s t h e a p p r o p r i a t e sequence header

* * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * */ i n t s t a r t s e q u e n c e ( V i d e o P a r a m e t e r s * p Vid , I n p u t P a r a m e t e r s * p I n p ) { i n t i , l e n =0 , t o t a l p p s = ( p I n p >G e n e r a t e M u l t i p l e P P S ) ? 3 : 1 ; NALU t * n a l u ; s w i t c h ( p I n p >o f m o d e ) { c a s e PAR OF ANNEXB :

79
Op en An n ex b File ( p Vid , p I n p > o u t f i l e ) ; p Vid>WriteNALU = WriteAnnexbNALU ; break ; c a s e PAR OF RTP : OpenRTPFile ( p Vid , p I n p > o u t f i l e ) ; p Vid>WriteNALU = WriteRTPNALU ; break ; default : s n p r i n t f ( e r r o r t e x t , ET SIZE , " Output File Mode %d not supported" , p I n p >o f m o d e ) ;
26 27 28 29 30 31 32 33 34 35 36 37 38

17 18 19 20 21 22 23 24 25

error ( errortext ,1) ; } / / A c c e s s U n i t D e l i m i t e r NALU i f ( p I n p >SendAUD ) { l e n += Write AUD NALU ( p V i d ) ; } / / ! As a s e q u e n c e h e a d e r , h e r e we w r i t e b o t h s e q u e n c e and p i c t u r e / / ! parameter s e t s . As so o n a s IDR i s i m p l e m e n t e d , t h i s s h o u l d go t o t h e / / ! IDR p a r t , a s b o t h p a r s e t s h a v e t o be t r a n s m i t t e d a s p a r t o f an IDR . / / ! An a l t e r n a t i v e may be t o c o n s i d e r t h i s f u n c t i o n t h e IDR s t a r t function .

39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

n a l u = NULL; nalu = GenerateSeq parameter set NALU ( p Vid ) ; l e n += p Vid>WriteNALU ( p Vid , n a l u ) ; FreeNALU ( n a l u ) ; # i f ( MVC EXTENSION ENABLE) i f ( p I n p >n u m o f v i e w s ==2) { int bits ; n a l u = NULL; nalu = GenerateSubsetSeq parameter set NALU ( p Vid ) ; b i t s = p Vid>WriteNALU ( p Vid , n a l u ) ; l e n += b i t s ; p Vid>p S t a t s > b i t c t r p a r a m e t e r s e t s n v [ 1 ] = b i t s ; FreeNALU ( n a l u ) ; } else {

80
p Vid>p S t a t s > b i t c t r p a r a m e t e r s e t s n v [ 1 ] = 0 ; } # endif / / ! L e t s w r i t e now t h e P i c t u r e P a r a m e t e r s e t s . O u t p u t w i l l be e q u a l t o t h e t o t a l number o f b i t s s p e n d h e r e .
63 64 65 66 67 68 69 70 71 72 73 74 75 76

58 59 60 61 62

f o r ( i = 0 ; i < t o t a l p p s ; i ++) { l e n = w r i t e P P S ( p Vid , l e n , i ) ; } i f ( p I n p >G e n e r a t e S E I M e s s a g e ) { n a l u = NULL; n a l u = GenerateSEImessage NALU ( p I n p ) ; l e n += p Vid>WriteNALU ( p Vid , n a l u ) ; FreeNALU ( n a l u ) ; } / * L e t s s e n d 1000 SEI NALUs c o n t a i n i n g a SEI U s e r d a t a U n r e g i s t e r e d messa g e * / f o r ( i = 0 ; i < 1 0 0 0 ; i ++) { n a l u = NULL; cha r * msg = u s e r d a t a g e n e r a t e c r e a t e r a n d o m m e s s a g e ( ) ; n a l u = u s e r d a t a g e n e r a t e u n r e g i s t e r e d s e i n a l u f r o m m s g ( msg ) ; l e n += p Vid>WriteNALU ( p Vid , n a l u ) ; FreeNALU ( n a l u ) ; u s e r d a t a g e n e r a t e d e s t r o y r a n d o m m e s s a g e ( msg ) ; }

77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

p Vid>p S t a t s > b i t c t r p a r a m e t e r s e t s n = l e n ; # i f ( MVC EXTENSION ENABLE) i f ( p I n p >n u m o f v i e w s ==2) { p Vid>p S t a t s > b i t c t r p a r a m e t e r s e t s n v [ 0 ] = l e n p Vid>p S t a t s > bit ctr parametersets n v [1]; } # endif return 0; }

92 93 94 95

81

6.2.2 ARQUIVO LENCOD.C


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

/* ! * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * ** * * ** * ** * ** * * ** * ** * \ brief * Encode a s e q u e n c e * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * ** * * ** * ** * ** * * ** * ** */ s t a t i c v o i d e n c o d e s e q u e n c e ( V i d e o P a r a m e t e r s * p Vid , I n p u t P a r a m e t e r s * p I n p ) { int curr frame to code ; int frames to code ; i n t frame num bak = 0 , frame coded ; int frm struct buffer ; S e q S t r u c t u r e * p s e q s t r u c t = p Vid>p p r e d ; FrameUnitStruct * p frm ; # i f ( MVC EXTENSION ENABLE) i n t t m p r a t e c o n t r o l e n a b l e = p I n p >RCEnable ; i f ( p I n p >n u m o f v i e w s == 2 ) { f r a m e s t o c o d e = p I n p >n o f r a m e s << 1 ; p f r m = p s e q s t r u c t >p f r m m v c ; f r m s t r u c t b u f f e r = p s e q s t r u c t >n u m f r am es m v c ; } else # endif { f r a m e s t o c o d e = p I n p >n o f r a m e s ; p f r m = p s e q s t r u c t >p f r m ; f r m s t r u c t b u f f e r = p Vid>f r m s t r u c t b u f f e r ; } for ( curr frame to code = 0; curr frame to code < frames to code ; c u r r f r a m e t o c o d e ++) { # i f ( MVC EXTENSION ENABLE) i f ( p I n p >n u m o f v i e w s == 2 ) { i f ( ( c u r r f r a m e t o c o d e & 1 ) == 0 ) / / c a l l o n l y f o r v i e w i d 0 {

34 35 36 37 38 39

82
/ / determine whether to populate a d d i t i o n a l frames in the prediction structure
41 42 43 44 45

40

i f ( ( c u r r f r a m e t o c o d e >> 1 ) >= p Vid>p p r e d >p o p s t a r t f r a m e ) { i n t s t a r t = p s e q s t r u c t >p o p s t a r t f r a m e , end ; p o p u l a t e f r m s t r u c t ( p Vid , p I n p , p s e q s t r u c t , p I n p > F r m S t r u c t B u f f e r L e n g t h , f r a m e s t o c o d e >> 1 ) ; end = p s e q s t r u c t >p o p s t a r t f r a m e ; p o p u l a t e f r m s t r u c t m v c ( p Vid , p I n p , p s e q s t r u c t , s t a r t , end ) ; } } } else # endif { / / determine whether to populate a d d i t i o n a l frames in the p r e d i c t i o n structure i f ( c u r r f r a m e t o c o d e >= p Vid>p p r e d >p o p s t a r t f r a m e ) { p o p u l a t e f r m s t r u c t ( p Vid , p I n p , p s e q s t r u c t , p I n p > FrmStructBufferLength , frames to code ) ; } } p Vid>c u r r f r m i d x = c u r r f r a m e t o c o d e ; p Vid>p c u r r f r m s t r u c t = p f r m + ( p Vid>c u r r f r m i d x % f r m s t r u c t b u f f e r ) ; / / p o i n t e r t o c u r r e n t frame s t r u c t u r e p Vid>number = c u r r f r a m e t o c o d e ; # i f ( MVC EXTENSION ENABLE) i f ( p I n p >n u m o f v i e w s ==2) { p Vid>v i e w i d = p Vid>p c u r r f r m s t r u c t >v i e w i d ; i f ( p Vid>v i e w i d == 1 ) { p Vid>c u r r f r m i d x = p Vid>number = ( c u r r f r a m e t o c o d e 1 ) >> 1; p Vid>p c u r r f r m s t r u c t >qp = p Vid>qp = i C l i p 3 ( p Vid> b i t d e p t h l u m a q p s c a l e , MAX QP, p Vid>AverageFrameQP + p I n p > View1 QPOf f set ) ; }

46 47

48 49 50 51 52 53 54

55 56 57

58 59 60 61 62

63 64 65 66 67 68 69 70 71

72

73

83
else { p Vid>c u r r f r m i d x = p Vid>number = c u r r f r a m e t o c o d e >> 1 ; } i f ( p Vid>v i e w i d == 1 && t m p r a t e c o n t r o l e n a b l e ) { p I n p >RCEnable = 0 ; } else { p I n p >RCEnable = t m p r a t e c o n t r o l e n a b l e ; } } # endif i f ( p Vid>p c u r r f r m s t r u c t >f r a m e n o >= p I n p >n o f r a m e s ) { continue ; } / / Up d a te fra me n u m c o u n t e r f r a m e n u m b a k = p Vid>f r am e n u m ; i f ( p Vid> l a s t r e f i d c == 1 ) { p Vid>f r am e n u m ++; # i f ( MVC EXTENSION ENABLE) i f ( p I n p >n u m o f v i e w s == 2 ) { p Vid>f r am e n u m %= ( p Vid>max frame num << 1 ) ; } else # endif p Vid>f r am e n u m %= p Vid>max frame num ; } p r e p a r e f r a m e p a r a m s ( p Vid , p I n p , c u r r f r a m e t o c o d e ) ; / / r e d u n d a n t f r a m e i n i t i a l i z a t i o n and a l l o c a t i o n i f ( p I n p >r e d u n d a n t p i c f l a g ) { i n i t r e d u n d a n t f r a m e ( p Vid , p I n p ) ; s e t r e d u n d a n t f r a m e ( p Vid , p I n p ) ;

74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

84
} f r a m e c o d e d = e n c o d e o n e f r a m e ( p Vid , p I n p ) ; / / e n c o d e one f r a m e ; i f ( ! frame coded ) { p Vid>f r am e n u m = f r a m e n u m b a k ; continue ; } p Vid> l a s t r e f i d c = p Vid>n a l r e f e r e n c e i d c ? 1 : 0 ; // { e n c o d e o n e r e d u n d a n t f r a m e ( p Vid , p I n p ) ; } i f ( p Vid>t y p e == I SLI CE && p I n p >EnableOpenGOP ) p Vid> l a s t v a l i d r e f e r e n c e = p Vid>ThisPOC ; i f ( p I n p >R e p o r t F r a m e S t a t s ) r e p o r t f r a m e s t a t i s t i c ( p Vid , p I n p ) ; / * I n s e r t i n g a SEI NALU ( U s e r d a t a U n r e g i s t e r e d ) * / cha r * msg = user data generate create random message () ; NALU t * n a l u = u s e r d a t a g e n e r a t e u n r e g i s t e r e d s e i n a l u f r o m m s g ( msg ) ; p Vid>WriteNALU ( p Vid , n a l u ) ; FreeNALU ( n a l u ) ; u s e r d a t a g e n e r a t e d e s t r o y r a n d o m m e s s a g e ( msg ) ; } # i f EOS OUTPUT e n d o f s t r e a m ( p Vid ) ; # endif # i f ( MVC EXTENSION ENABLE) i f ( p I n p >n u m o f v i e w s == 2 ) { p I n p >RCEnable = t m p r a t e c o n t r o l e n a b l e ; } # endif } i f k e y f r a m e i s en co d ed , e n c o d e one r e d u n d a n t f r a m e

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158

i f ( p I n p >r e d u n d a n t p i c f l a g && p Vid>k e y f r a m e )

85

6.3 MODULO ADICIONADO AO DECODIFICADOR


6.3.1 ARQUIVO UDATA PARSER.H
1 2 3 4 5 6 7 8

/* ! * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * \file * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * */ # i f n d e f UDATA PARSER H # d e f i n e UDATA PARSER H # i n c l u d e " typedefs.h" /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * P a r s e s a SEI User Data U n r e g i s t e r e d message , dumping a l l i t s d a t a a t stdout . * * @param p a y l o a d The p a y l o a d o f t h e SEI messa g e . * @param s i z e The s i z e o f t h e p a y l o a d . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ void u s e r d a t a p a r s e r u n r e g i s t e r e d s e i ( byte * payload , i n t s i z e ) ; # endif udata parser . h \ brief d e f i n i t i o n s f o r S u p p l e m e n t a l Enhanced I n f o r m a t i o n U s e r d a t a P a r s i n g \ author ( s ) Tiago K a t c i p i s com> <t i a g o k a t c i p i s @ g m a i l .

9 10 11 12 13 14 15 16 17 18 19

20

21 22 23 24 25

26 27 28 29

6.3.2 ARQUIVO UDATA PARSER.C


1 2

# i n c l u d e " udata_parser.h" # i n c l u d e < s t d i o . h>

86

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

# d e f i n e UUID ISO IEC OFFSET 16

void u s e r d a t a p a r s e r u n r e g i s t e r e d s e i ( byte * payload , i n t s i z e ) { int of fset = 0; byte payload byte ; p r i n t f ( "\ nUser data unregistered SEI message , size[%d]\n" , s i z e ) ; p r i n t f ( " uuid_iso_11578 = 0x" ) ; a s s e r t ( s i z e >=UUID ISO IEC OFFSET ) ; f o r ( o f f s e t = 0 ; o f f s e t < UUID ISO IEC OFFSET ; o f f s e t ++) { p r i n t f ( "%02x" , p a y l o a d [ o f f s e t ] ) ; } p r i n t f ( "\ nUser data unregistered SEI message start\n" ) ; while ( o f f s e t < s i z e ) { payload byte = payload [ o f f s e t ] ; o f f s e t ++; p r i n t f ( "%c" , p a y l o a d b y t e ) ; } p r i n t f ( "\ nUser data unregistered SEI message end \n" ) ; }

6.4 ALTERACOES NO DECODIFICADOR


6.4.1 ARQUIVO SEI.C
1

v o i d I n t e r p r e t S E I M e s s a g e ( b y t e * msg , i n t s i z e , V i d e o P a r a m e t e r s * p Vid , S l i c e *pSlice ) { int payload type = 0; int payload size = 0; int of fset = 1; byte tmp byte ;

2 3 4 5 6

87

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

do { / / sei message ( ) ; payload type = 0; t m p b y t e = msg [ o f f s e t + + ] ; w h i l e ( t m p b y t e == 0xFF ) { p a y l o a d t y p e += 2 5 5 ; t m p b y t e = msg [ o f f s e t + + ] ; } p a y l o a d t y p e += t m p b y t e ; payload size = 0; t m p b y t e = msg [ o f f s e t + + ] ; w h i l e ( t m p b y t e == 0xFF ) { p a y l o a d s i z e += 2 5 5 ; t m p b y t e = msg [ o f f s e t + + ] ; } p a y l o a d s i z e += t m p b y t e ; switch ( payload type ) { case SEI BUFFERING PERIOD : i n t e r p r e t b u f f e r i n g p e r i o d i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI PIC TIMING : i n t e r p r e t p i c t u r e t i m i n g i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI PAN SCAN RECT : i n t e r p r e t p a n s c a n r e c t i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI FILLER PAYLOAD : i n t e r p r e t f i l l e r p a y l o a d i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI USER DATA REGISTERED ITU T T35 : p a y l o a d s i z e , p Vid ) ; i n t e r p r e t u s e r d a t a r e g i s t e r e d i t u t t 3 5 i n f o ( msg+ o f f s e t , break ; case SEI USER DATA UNREGISTERED : u s e r d a t a p a r s e r u n r e g i s t e r e d s e i ( msg+ o f f s e t , p a y l o a d s i z e ) ; break ; // t hi s is the l as t byte // t hi s is the l as t byte

/ / se i p a y l o a d ( type , s i z e ) ;

45 46 47 48

88
case SEI RECOVERY POINT :

49 50 51 52 53

i n t e r p r e t r e c o v e r y p o i n t i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI DEC REF PIC MARKING REPETITION : p a y l o a d s i z e , p Vid , p S l i c e ) ; i n t e r p r e t d e c r e f p i c m a r k i n g r e p e t i t i o n i n f o ( msg+ o f f s e t , break ; case SEI SPARE PIC : i n t e r p r e t s p a r e p i c ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI SCENE INFO : i n t e r p r e t s c e n e i n f o r m a t i o n ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI SUB SEQ INFO : i n t e r p r e t s u b s e q u e n c e i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI SUB SEQ LAYER CHARACTERISTICS : p a y l o a d s i z e , p Vid ) ; i n t e r p r e t s u b s e q u e n c e l a y e r c h a r a c t e r i s t i c s i n f o ( msg+ o f f s e t , break ; case SEI SUB SEQ CHARACTERISTICS : p Vid ) ; i n t e r p r e t s u b s e q u e n c e c h a r a c t e r i s t i c s i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ; case SEI FULL FRAME FREEZE : i n t e r p r e t f u l l f r a m e f r e e z e i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI FULL FRAME FREEZE RELEASE : p Vid ) ; i n t e r p r e t f u l l f r a m e f r e e z e r e l e a s e i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ; case SEI FULL FRAME SNAPSHOT : ; i n t e r p r e t f u l l f r a m e s n a p s h o t i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) break ; case SEI PROGRESSIVE REFINEMENT SEGMENT START : , p Vid ) ; i n t e r p r e t p r o g r e s s i v e r e f i n e m e n t s t a r t i n f o ( msg+ o f f s e t , p a y l o a d s i z e break ; case SEI PROGRESSIVE REFINEMENT SEGMENT END : p Vid ) ; i n t e r p r e t p r o g r e s s i v e r e f i n e m e n t e n d i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ;

54 55 56 57 58 59 60 61 62 63 64 65

66 67 68

69 70 71 72 73 74

75 76 77

78 79 80

81 82 83

84

89
case SEI MOTION CONSTRAINED SLICE GROUP SET : p a y l o a d s i z e , p Vid ) ;
87 88

85 86

i n t e r p r e t m o t i o n c o n s t r a i n e d s l i c e g r o u p s e t i n f o ( msg+ o f f s e t , case SEI FILM GRAIN CHARACTERISTICS : p Vid ) ;

i n t e r p r e t f i l m g r a i n c h a r a c t e r i s t i c s i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ; case SEI DEBLOCKING FILTER DISPLAY PREFERENCE : p a y l o a d s i z e , p Vid ) ; i n t e r p r e t d e b l o c k i n g f i l t e r d i s p l a y p r e f e r e n c e i n f o ( msg+ o f f s e t , break ; case SEI STEREO VIDEO INFO : i n t e r p r e t s t e r e o v i d e o i n f o i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI TONE MAPPING : i n t e r p r e t t o n e m a p p i n g ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI POST FILTER HINTS : i n t e r p r e t p o s t f i l t e r h i n t s i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI FRAME PACKING ARRANGEMENT : p Vid ) ; i n t e r p r e t f r a m e p a c k i n g a r r a n g e m e n t i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ; default : i n t e r p r e t r e s e r v e d i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; } o f f s e t += p a y l o a d s i z e ; } w h i l e ( msg [ o f f s e t ] ! = 0 x80 ) ; x80 / / more rbsp data ( ) msg [ o f f s e t ] != 0

89 90 91

92 93 94 95 96 97 98 99 100 101 102 103

104 105 106 107 108 109 110 111

112 113 114 115

/ / ignore the t r a i l i n g b i t s r b s p t r a i l i n g b i t s ( ) ; a s s e r t ( msg [ o f f s e t ] == 0 x80 ) ; a s s e r t ( o f f s e t +1 == s i z e ) ; } / / t h is is the t r a i l i n g b i t s

90

APENDICE B CODIGO FONTE DO MODULO EXTRACTED METADATA

7.1 EXTRACTED METADATA.H


1 2 3

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** \file extracted metadata . h \ brief d e f i n i t i o n s f o r the e x t r a c t e d metadata . \ author ( s ) Tiago K a t c i p i s com> <t i a g o k a t c i p i s @ g m a i l .

4 5 6 7 8 9

10 11

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

*/ # i f n d e f EXTRACTED METADATA H # d e f i n e EXTRACTED METADATA H typedef struct typedef struct typedef struct typedef struct ExtractedYImage ExtractedYImage ; ExtractedMetadata ExtractedMetadata ; ExtractedMetadataBuffer ExtractedMetadataBuffer ; ExtractedObjectBoundingBox ExtractedObjectBoundingBox ;

/ * E x t r a c t e d O b j e c t B o u n d i n g B o x API * / /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * *

91
* C r e a t e s a new e x t r a c t e d o b j e c t b o u n d i n g box . * * @param i d The i d o f t h e b o u n d i n g box o b j e c t . * @param fra me n u m The f r a m e number t h i s m e t a d a t a b e l o n g s . * @param x The x c o o r d i n a t e o f t h e b o u n d i n g box . * @param y The y c o o r d i n a t e o f t h e b o u n d i n g box . * @param w i d t h The w i d t h o f t h e b o u n d i n g box . * @param h e i g h t The h e i g h t o f t h e b o u n d i n g box . * @retu rn The n e w l y a l l o c a t e d E x t r a c t e d O b j e c t B o u n d i n g B o x o b j e c t . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ Ex tr acted Ob jectBoun dingBo x * e x t r a c t e d o b j e c t b o u n d i n g b o x n e w ( unsigned i n t id , unsigned i n t frame num ,
41 42 43 44 45 46 47 48

27 28 29 30 31 32 33 34 35 36 37

38 39

40

int x , int y , i n t width , int height ) ;

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * * * * @param box The E x t r a c t e d O b j e c t B o u n d i n g B o x o b j e c t . * @param i d The i d o f t h e b o u n d i n g box . (OUT) ( O p t i o n a l ) * @param x The x c o o r d i n a t e o f t h e b o u d i n g box . (OUT) ( O p t i o n a l ) * @param y The y c o o r d i n a t e o f t h e b o u n d i n g box . (OUT) ( O p t i o n a l ) * @param w i d t h The w i d t h o f t h e b o u n d i n g box . (OUT) ( O p t i o n a l ) * @param h e i g h t The h e i g h t o f t h e b o u n d i n g box . (OUT) ( O p t i o n a l ) * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ void e x t r a c t e d o b j e c t b o u n d i n g b o x g e t d a t a ( ExtractedObjectBoundingBox * box , G e t s d a t a a b o u t an o b j e c t b o u d i n g box , any p a r a m e t e r can be o mmited ( p a s s i n g NULL ) i f you a r e n o t i n t e r e s t e d on i t .

49 50 51 52 53 54 55 56 57 58 59

60 61

92
unsigned i n t * id , int * x , int * y , i n t * width , int * height ) ;

62 63 64 65 66 67 68 69 70

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * I f the given metadata i s of the type ExtractedObjectBoundingBox , * r e t u r n s t h e E x t r a c t e d O b j e c t B o u n d i n g B o x o b j e c t , NULL o t h e r w i s e . * * @param m e t a d a t a The m e t a d a t a o b j e c t . * @retu rn The E x t r a c t e d O b j e c t B o u n d i n g B o x o b j e c t o r NULL i f t h e t y p e i s n o t right . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** */ ExtractedObjectBoundingBox * extracted object bounding box from metadata ( ExtractedMetadata * metadata ) ;

71 72 73 74 75

76 77

78 79

80 81 82 83 84 85

/ * E x t r a c t e d Y I m a g e API * / /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * C r e a t e s a new e x t r a c t e d image , t h e ima g e o n l y h a s t h e luma p l a n e ( Y ) . * * @param fra me n u m The f r a m e number t h i s m e t a d a t a b e l o n g s . * @param w i d t h The w i d t h o f t h e ima g e t h a t w i l l be s a v e d . * @param h e i g h t The h e i g h t o f t h e ima g e t h a t w i l l be s a v e d . * @retu rn The n e w l y a l l o c a t e d E x t r a c t e d I m a g e o b j e c t . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ E x t r a c t e d Y I m a g e * e x t r a c t e d y i m a g e n e w ( u n s i g n e d i n t frame num , i n t w i d t h , int height ) ;

86 87 88 89 90 91 92 93

94 95

96 97

93
/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * Get t h e luma p l a n e o f t h e e x t r a c t e d ima g e . * y [ row ] [ c o l ] f o r m a t . Each p i x e l h a s 8 b i t s d e p t h . * * @retu rn The luma p l a n e . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ u n s i g n e d cha r ** e x t r a c t e d y i m a g e g e t y ( E x t r a c t e d Y I m a g e * img ) ;

98 99

100 101 102 103 104 105

106 107 108 109 110 111 112 113

/ * E x t r a c t e d M e t a d a t a API * / /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * Gets t h e s i z e i n b y t e s n e c e s s a r y t o s e r i a l i z e t h i s ExtractedMetadata object . * * @param m e t a d a t a The m e t a d a t a t o g e t t h e s e r i a l i z e d s i z e i n b y t e s . * @retu rn The s e r i a l i z e d s i z e ( i n b y t e s ) o f t h i s E x t r a c t e d M e t a d a t a . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ int e x t r a c t e d m e t a d a t a g e t s e r i a l i z e d s i z e ( ExtractedMetadata * metadata ) ; /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * S e r i a l i z e t h i s ExtractedMetadata o b j e c t . I t i s r e s p o n s a b i l i t y of the caller * t o a l l o c a d a t a p o i n t e r w i t h t h e r i g h t s i z e and t o f r e e i t a f t e r u s a g e . * The r i g h t s i z e can be g e t w i t h e x t r a c t e d m e t a d a t a g e t s e r i a l i z e d s i z e . * * @param m e t a d a t a The m e t a d a t a t o s e r i a l i z e . * @param s e r i a l i z e d d a t a Where t h e s e r i a l i z e d m e t a d a t a w i l l be s t o r e d . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * *

114

115 116 117 118 119

120 121 122 123 124

125

126 127 128 129 130 131 132

94
*/ v o i d e x t r a c t e d m e t a d a t a s e r i a l i z e ( E x t r a c t e d M e t a d a t a * m e t a d a t a , cha r * serialized data ) ; /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * D e s e ri a l i ze t h i s ExtractedMetadata o b j e c t . * * @param d a t a The s e r i a l i z e d m e t a d a t a . * @param s i z e S i z e i n b y t e s o f t h e s e r i a l i z e d o b j e c t . * @retu rn The d e s e r i a l i z e d E x t r a c t e d M e t a d a t a o b j e c t o r NULL i n c a s e o f error . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ E x t r a c t e d M e t a d a t a * e x t r a c t e d m e t a d a t a d e s e r i a l i z e ( c o n s t cha r * d a t a , i n t size ) ; /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * S a v e t h i s E x t r a c t e d M e t a d a t a o b j e c t on a f i l e . * * @param m e t a d a t a The m e t a d a t a t o be s a v e d . * @param f d F i l e d e s c r i p t o r wh ere t h e m e t a d a t a w i l l be s a v e d . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ void e x t r a c t e d m e t a d a t a s a v e ( E x t r a c t e d M e t a d a t a * metadata , i n t fd ) ; /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * F r e e s a l l r e s o u r c e s b e i n g u s e d by a E x t r a c t e d M e t a d a t a o b j e c t . * * @param m e t a d a t a The m e t a d a t a t h a t w i l l be f r e e d . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */

133 134

135 136 137

138 139 140 141 142

143 144

145 146

147 148 149

150 151 152 153 154 155

156 157 158 159 160

161 162 163 164 165

166

95
void e x t r a c t e d m e t a d a t a f r e e ( E x t r a c t e d M e t a d a t a * metadata ) ;

167 168 169 170 171 172 173

/ * E x t r a c t e d M e t a d a t a B u f f e r API * / /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * C r e a t e s a new E x t r a c t e d M e t a d a t a B u f f e r o b j e c t . * * @retu rn The m e t a d a t a b u f f e r o b j e c t , o r NULL i n c a s e o f e r r o r . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ ExtractedMetadataBuffer * extracted metadata buffer new () ; /* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * Add a m e t a d a t a do t h e b u f f e r . * * @param b u f f e r The m e t a d a t a b u f f e r o b j e c t . * @param m e t a d a t a The m e t a d a t a o b j e c t . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ void e x t r a c t e d m e t a d a t a b u f f e r a d d ( E x t r a c t e d M e t a d a t a B u f f e r * b u f f e r , ExtractedMetadata * obj ) ;

174 175 176 177 178

179 180 181 182 183

184 185 186 187 188 189

190 191

192 193 194 195

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * Free a Metadata Bu ffer , f r e e i n g a l l Extra cted Meta d a ta . * * @param b u f f e r The m e t a d a t a b u f f e r o b j e c t . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ i t may h a v e i n s i d e

196

197 198 199 200

201

96
void e x t r a c t e d m e t a d a t a b u f f e r f r e e ( E x t r a c t e d M e t a d a t a B u f f e r * b u f f e r ) ;

202 203 204 205 206

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * Get a m e t a d a t a fro m t h e b u f f e r f o r t h e g i v e n fra me , a l l l a t e m e t a d a t a will * be f r e e d , i f t h e r e i s no m e t a d a t a f o r t h i s f r a m e r e t u r n NULL . * * @retu rn The m e t a d a t a o b j e c t , o r NULL i f t h e r e i s no m e t a d a t a f o r t h i s frame . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * */ ExtractedMetadata * extracted metadata buffer get ( ExtractedMetadataBuffer * b u f f e r , unsigned i n t frame number ) ; # endif

207

208 209 210

211 212

213 214

215 216

7.2 EXTRACTED METADATA.C


1 2 3 4 5 6 7 8 9 10 11 12

# i n c l u d e " extracted_metadata.h" # i n c l u d e < u n i s t d . h> # i n c l u d e < s t d l i b . h> # i n c l u d e < s t r i n g . h> # i n c l u d e <a r p a / i n e t . h> # i n c l u d e < s t d i o . h>

/* types / s tr u ct d e f i n i t i o n */ typedef void (* E x t r a c t e d M e t a da ta F re eF un c ) ( E x t r a c t e d M e t a d a t a *) ; t y p e d e f v o i d ( * E x t r a c t e d M e t a d a t a S e r i a l i z e F u n c ) ( E x t r a c t e d M e t a d a t a * , cha r *) ; typedef void (* ExtractedMetadataSaveFunc ) ( E x t r a c t e d M e t a d a t a * , i n t ) ; typedef int (* Ex tracted Metad ataGetSerialized SizeFu nc ) ( ExtractedMetadata *) ;

13 14

15 16 17

t y p e d e f enum { /* 1 byte only */

97
ExtractedMetadataYImage } ExtractedMetadataType ; struct ExtractedMetadata { = 0 x01 ,

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

E x t r a c t e d M e t a d a t a O b j e c t B o u n d i n g B o x = 0 x02

u i n t 3 2 t frame number ; ExtractedMetadataType type ; ExtractedMetadataFreeFunc free ; ExtractedMetadataSerializeFunc ExtractedMetadataSaveFunc save ; }; struct ExtractedMetadataBuffer { serialize ; ExtractedMetadataGetSerializedSizeFunc g e t s e r i a l i z e d s i z e ;

E x t r a c t e d M e t a d a t a ** r i n g b u f f e r ; short read index ; short w r i t e i n d e x ; }; struct ExtractedYImage {

ExtractedMetadata parent ; / * Image p l a n e 8 b i t s d e p t h * / u n s i g n e d cha r ** y ; / * Image s i z e * / u i n t 1 6 t width ; uint16 t height ; }; struct ExtractedObjectBoundingBox {

ExtractedMetadata parent ; uint32 t id ; uint16 t x; uint16 t y; u i n t 1 6 t width ; uint16 t height ; }; s t a t i c c o n s t i n t EXTRACTED METADATA TYPE SIZE = 1 ; s t a t i c E x t r a c t e d M e t a d a t a * e x t r a c t e d y i m a g e d e s e r i a l i z e ( c o n s t cha r * d a t a , int size ) ; s t a t i c ExtractedMetadata * e x t r a c t e d o b j e c t b o u n d i n g b o x d e s e r i a l i z e ( const cha r * d a t a , i n t s i z e ) ;

58

98

59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

static int extracted metadata header size () { / * t y p e s i z e + f r a m e number s i z e * / r e t u r n EXTRACTED METADATA TYPE SIZE + s i z e o f ( u i n t 3 2 t ) ; } /* * * * * * * * * * * * * * ** ** * ** ** ** * ** ** ** * * E x t r a c t e d M e t a d a t a P u b l i c API * * * * * * * * * * * * * * ** ** * ** ** ** * ** ** ** * */ void e x t r a c t e d m e t a d a t a f r e e ( E x t r a c t e d M e t a d a t a * metadata ) { m e t a d a t a >f r e e ( m e t a d a t a ) ; } int e x t r a c t e d m e t a d a t a g e t s e r i a l i z e d s i z e ( ExtractedMetadata * metadata ) { /* Subclass s i z e + metadata header s i z e */ r e t u r n m e t a d a t a > g e t s e r i a l i z e d s i z e ( m e t a d a t a ) + extracted metadata header size () ; } v o i d e x t r a c t e d m e t a d a t a s e r i a l i z e ( E x t r a c t e d M e t a d a t a * m e t a d a t a , cha r * serialized data ) { / * l e t s w r i t e t h e med ia t y p e ( 1 b y t e ) * / * s e r i a l i z e d d a t a = ( cha r ) m e t a d a t a >t y p e ; s e r i a l i z e d d a t a += s i z e o f ( cha r ) ; / * l e t s w r i t e t h e f r a m e number ( 4 b y t e s ) * / * ( ( u i n t 3 2 t * ) s e r i a l i z e d d a t a ) = h t o n l ( m e t a d a t a >f r a m e n u m b e r ) ; serialized data += s i z e o f ( u i n t 3 2 t ) ;

80 81 82

83 84 85 86 87 88 89 90 91 92 93 94 95

m e t a d a t a > s e r i a l i z e ( m e t a d a t a , s e r i a l i z e d d a t a ) ; } E x t r a c t e d M e t a d a t a * e x t r a c t e d m e t a d a t a d e s e r i a l i z e ( c o n s t cha r * d a t a , i n t size ) { ExtractedMetadataType type = 0; u i n t 3 2 t frame number = 0;

96 97 98

99
ExtractedMetadata * ret = NULL;

99 100 101 102

if ( size < extracted metadata header size () ) { p r i n t f ( " extracted_metadata_deserialize: Mininum metadata size [%d], data size is [%d]\n" , size , extracted m etadata header size () ) ; r e t u r n NULL; } /* f i r s t byte i s the metadata type */ type = ( ExtractedMetadataType ) * data ; d a t a += EXTRACTED METADATA TYPE SIZE ; s i z e = EXTRACTED METADATA TYPE SIZE ; / * n e x t 4 b y t e s a r e t h e f r a m e number o f t h e m e t a d a t a * / frame number = n t o h l ( * ( ( u i n t 3 2 t *) d a t a ) ) ; data size += s i z e o f ( u i n t 3 2 t ) ; = s i z e o f ( u i n t 3 2 t ) ;

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128

switch ( type ) { case ExtractedMetadataYImage : r e t = e x t r a c t e d y i m a g e d e s e r i a l i z e ( data , s i z e ) ; break ; case ExtractedMetadataObjectBoundingBox : r e t = e x t r a c t e d o b j e c t b o u n d i n g b o x d e s e r i a l i z e ( data , s i z e ) ; break ; default : p r i n t f ( " extracted_metadata_deserialize: cant find the extracted metadata type !!!\n" ) ; } if ( ret ) { r e t >f r a m e n u m b e r = f r a m e n u m b e r ; } return r e t ; } void e x t r a c t e d m e t a d a t a s a v e ( E x t r a c t e d M e t a d a t a * metadata , i n t fd ) {

129 130 131 132 133 134 135 136 137 138 139

100
m e t a d a t a >s a v e ( m e t a d a t a , f d ) ; } /* * * * * * * * * * * * * * ** * ** ** ** * ** ** ** * ** * * E x t r a c t e d M e t a d a t a P r i v a t e API * * * * * * * * * * * * * * ** * ** ** ** * ** ** ** * ** * */ s t a t i c void e x t r a c t e d m e t a d a t a i n i t ( E x t r a c t e d M e t a d a t a * metadata , ExtractedMetadataFreeFunc free , ExtractedMetadataSerializeFunc serialize ,
151

140 141 142 143 144 145 146 147 148 149 150

ExtractedMetadataGetSerializedSizeFunc get serialized size , Ex tr acted Metad ataSav eFu n c save , ExtractedMetadataType type , u i n t 3 2 t frame number ) { m e t a d a t a >f r e e m e t a d a t a > s e r i a l i z e m e t a d a t a >s a v e m e t a d a t a >t y p e m e t a d a t a >f r a m e n u m b e r } /* * * * * * * * * * * * * * * * ** * ** ** * ** ** * ** * ** ** * ** * ** * E x t r a c t e d O b j e c t B o u n d i n g B o x P u b l i c API * * * * * * * * * * * * * * * * ** * ** ** * ** ** * ** * ** ** * ** * ** */ s t a t i c void e x t r a c t e d o b j e c t b o u n d i n g b o x f r e e ( E x t r a c t e d M e t a d a t a * metadata ); s t a t i c void e x t r a c t e d o b j e c t b o u n d i n g b o x s e r i a l i z e ( E x t r a c t e d M e t a d a t a * m e t a d a t a , cha r * d a t a ) ; static int extracted object bounding box get serialized size ( ExtractedMetadata * metadata ) ; s t a t i c void e x t r a c t e d o b j e c t b o u n d i n g b o x s a v e ( E x t r a c t e d M e t a d a t a * metadata , int fd ) ; Ex tr acted Ob jectBoun dingBo x * e x t r a c t e d o b j e c t b o u n d i n g b o x n e w ( unsigned i n t i d , u n s i g n e d i n t frame num , i n t x , i n t y , i n t w i d t h , i n t h e i g h t ) = free ; = serialize ; = save ; = type ; = frame number ;

152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

m e t a d a t a > g e t s e r i a l i z e d s i z e = g e t s e r i a l i z e d s i z e ;

171

172

173

174 175

101
{ ExtractedObjectBoundingBox * bounding box = malloc ( s i z e o f ( ExtractedObjectBoundingBox ) ) ; b o u n d i n g b o x >i d b o u n d i n g b o x >x b o u n d i n g b o x >y b o u n d i n g b o x >w i d t h = id ; = x; = y; = width ;

176 177

178 179 180 181 182 183 184 185 186 187 188

b o u n d i n g b o x >h e i g h t = h e i g h t ; e x t r a c t e d m e t a d a t a i n i t ( ( E x t r a c t e d M e t a d a t a *) bounding box , extracted object bounding box free , extracted object bounding box serialize , extracted object bounding box get serialized size , extracted object bounding box save , ExtractedMetadataObjectBoundingBox , f r am e n u m ) ; return bounding box ; } ExtractedObjectBoundingBox * extracted object bounding box from metadata ( ExtractedMetadata * metadata ) { i f ( m e t a d a t a >t y p e == E x t r a c t e d M e t a d a t a O b j e c t B o u n d i n g B o x ) { return ( ExtractedObjectBoundingBox *) metadata ; } r e t u r n NULL; } void e x t r a c t e d o b j e c t b o u n d i n g b o x g e t d a t a ( ExtractedObjectBoundingBox * box , unsigned i n t * id , int * x , int * y , i n t * width , int * height ) { i f ( ! box ) { return ;

189 190 191 192 193 194 195 196

197 198 199 200 201 202 203 204 205

206 207 208 209 210 211 212 213 214

102
} i f ( id ) { * i d = box>i d ; } if (x) { * x = box>x ; } if (y) { * y = box>y ; } i f ( width ) { * w i d t h = box>w i d t h ; } if ( height ) { * h e i g h t = box>h e i g h t ; } } /* * * * * * * * * * * * * * * ** ** * ** ** * ** ** * ** ** * ** * ExtractedYImage p r i v a t e f u n c t i o n s * * * * * * * * * * * * * * * ** ** * ** ** * ** ** * ** ** * ** */ s t a t i c void e x t r a c t e d o b j e c t b o u n d i n g b o x f r e e ( E x t r a c t e d M e t a d a t a * metadata ) { f ree ( metadata ) ; } s t a t i c void e x t r a c t e d o b j e c t b o u n d i n g b o x s e r i a l i z e ( E x t r a c t e d M e t a d a t a * m e t a d a t a , cha r * d a t a ) { ExtractedObjectBoundingBox * bounding box = ( ExtractedObjectBoundingBox *) metadata ; * ( ( u i n t 3 2 t * ) d a t a ) = h t o n s ( b o u n d i n g b o x >i d ) ;

215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245

246 247 248 249 250

251 252

253 254

103
d a t a += s i z e o f ( u i n t 3 2 t ) ; * ( ( u i n t 1 6 t * ) d a t a ) = h t o n s ( b o u n d i n g b o x >x ) ; d a t a += s i z e o f ( u i n t 1 6 t ) ; * ( ( u i n t 1 6 t * ) d a t a ) = h t o n s ( b o u n d i n g b o x >y ) ; d a t a += s i z e o f ( u i n t 1 6 t ) ; * ( ( u i n t 1 6 t * ) d a t a ) = h t o n s ( b o u n d i n g b o x >w i d t h ) ; d a t a += s i z e o f ( u i n t 1 6 t ) ; * ( ( u i n t 1 6 t * ) d a t a ) = h t o n s ( b o u n d i n g b o x >h e i g h t ) ; d a t a += s i z e o f ( u i n t 1 6 t ) ; } s t a t i c ExtractedMetadata * e x t r a c t e d o b j e c t b o u n d i n g b o x d e s e r i a l i z e ( const cha r * d a t a , i n t s i z e ) { u i n t 1 6 t width ; uint16 t height ; uint16 t x; uint16 t y; uint32 t id ; / * Dont n e e d t h e a c t u a l o b j e c t t o know t h e s e r i a l i z e d s i z e ( f i x e d s i z e ) . Not t r u e f o r a l l o b j e c t s * / i f ( s i z e < e x t r a c t e d o b j e c t b o u n d i n g b o x g e t s e r i a l i z e d s i z e (NULL) ) { p r i n t f ( " extracted_object_bounding_box_deserialize: invalid serialized ExtractedObjectBoundingBox !!!\n" ) ;
282 283 284 285 286 287 288 289 290 291 292 293

255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270

271 272 273 274 275 276 277 278 279

280 281

r e t u r n NULL; } / * a v o i d p r o b l e m s w i t h t y p e s i z e and e n d i a n n e s s * / id = ntohl ( * ( ( u i n t 3 2 t *) data ) ) ; d a t a += s i z e o f ( u i n t 3 2 t ) ; x = ntohs ( ( ( u i n t 1 6 t *) data ) [ 0 ] ) ; y = ntohs ( ( ( u i n t 1 6 t *) data ) [ 1 ] ) ; width = ntohs ( ( ( u i n t 1 6 t *) data ) [ 2 ] ) ; height = ntohs ( ( ( u i n t 1 6 t *) data ) [ 3 ] ) ;

104
/ * r e a l f r a m e number i s s e t on t h e m e t a d a t a s u p e r c l a s s d e s e r i a l i z e meth o d */ return ( E x t r a c t e d M e t a d a t a *) e x t r a c t e d o b j e c t b o u n d i n g b o x n e w ( id , 0 , x , y , width , h e i g h t ) ; } static int extracted object bounding box get serialized size ( ExtractedMetadata * metadata )
299 300 301 302 303

294

295

296 297 298

{ return s i z e o f ( u i n t 3 2 t ) + s i z e o f ( u i n t 1 6 t ) * 4; } s t a t i c void e x t r a c t e d o b j e c t b o u n d i n g b o x s a v e ( E x t r a c t e d M e t a d a t a * metadata , int fd ) { ExtractedObjectBoundingBox * bounding box = ( ExtractedObjectBoundingBox *) metadata ; cha r * m essag e = NULL; s iz e t written = 0; s i z e t message size = 0; i f ( a s p r i n t f (& message , " Object id [%u] x[%u] y[%u] width [%u] height [%u]\ n" , b o u n d i n g b o x >i d , b o u n d i n g b o x >x , b o u n d i n g b o x >y , b o u n d i n g b o x >w i d t h , b o u n d i n g b o x >h e i g h t ) == 1) { p r i n t f ( " extracted_object_bounding_box_save: ERROR ALLOCATING MESSAGE !!!\n" ) ; return ; } m e s s a g e s i z e = s t r l e n ( m essag e ) ; w r i t t e n = w r i t e ( f d , message , m e s s a g e s i z e ) ; i f ( w r i t t e n != m e s s a g e s i z e ) { p r i n t f ( " extracted_object_bounding_box_save: WARNING , expected to write [%d] but written only [%d]" , m e s s a g e s i z e , w r i t t e n ) ; } f r e e ( m essag e ) ; }

304 305

306 307 308 309 310

311 312 313 314 315 316

317 318 319 320 321 322 323 324

325 326 327 328

105

329 330 331 332 333 334 335 336 337

/* * * * * * * * * * * * * * ** ** * ** ** ** * ** ** ** * * E x t r a c t e d Y I m a g e P u b l i c API * * * * * * * * * * * * * * ** ** * ** ** ** * ** ** ** * */ s t a t i c void e x t r a c t e d y i m a g e f r e e ( E x t r a c t e d M e t a d a t a * metadata ) ; s t a t i c v o i d e x t r a c t e d y i m a g e s e r i a l i z e ( E x t r a c t e d M e t a d a t a * m e t a d a t a , cha r * data ) ; s t ati c int e xt ra ct e d y i ma ge ge t s e ri al i z ed s i ze ( ExtractedMetadata * metadata ) ; s t a t i c void e x t r a c t e d y i m a g e s a v e ( E x t r a c t e d M e t a d a t a * metadata , i n t fd ) ; E x t r a c t e d Y I m a g e * e x t r a c t e d y i m a g e n e w ( u n s i g n e d i n t frame num , i n t w i d t h , int height ) { ExtractedYImage * metadata = malloc ( s i z e o f ( ExtractedYImage ) ) ; u n s i g n e d cha r ** y r o w s = m a l l o c ( s i z e o f ( u n s i g n e d cha r * ) * h e i g h t ) ; u n s i g n e d cha r * y p l a n e ); int row offset i n t row ; / * F i l l i n g t h e ro ws * / f o r ( row = 0 ; row < h e i g h t ; row ++) { / * y [ 0 ] = y p l a n e + 0 . So y [ 0 ] p o i n t s t o t h e e n t i r e a l l o c a t e d p l a n e * / y r o w s [ row ] = y p l a n e + r o w o f f s e t ; r o w o f f s e t += w i d t h ; } m e t a d a t a >h e i g h t = h e i g h t ; m e t a d a t a >w i d t h m e t a d a t a >y = width ; = y rows ; = m a l l o c ( s i z e o f ( u n s i g n e d cha r ) * h e i g h t * w i d t h = 0;

338

339 340 341

342 343 344 345

346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367

e x t r a c t e d m e t a d a t a i n i t ( ( ExtractedMetadata *) metadata , extracted y image free , extracted y image serialize , extracted y image get serialized size , extracted y image save , ExtractedMetadataYImage , f r am e n u m ) ;

106
return metadata ; } u n s i g n e d cha r ** e x t r a c t e d y i m a g e g e t y ( E x t r a c t e d Y I m a g e * img ) { r e t u r n img>y ; }

368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385

/* * * * * * * * * * * * * * * ** ** * ** ** * ** ** * ** ** * ** * ExtractedYImage p r i v a t e f u n c t i o n s * * * * * * * * * * * * * * * ** ** * ** ** * ** ** * ** ** * ** */ s t a t i c void e x t r a c t e d y i m a g e f r e e ( E x t r a c t e d M e t a d a t a * metadata ) { / * m e t a d a t a >y [ 0 ] p o i n t s t o t h e b e g i n o f t h e y p l a n e . Ea sy t o f r e e a l l data */ E x t r a c t e d Y I m a g e * img = ( E x t r a c t e d Y I m a g e * ) m e t a d a t a ; / * f r e e i n g t h e ima g e p l a n e * / f r e e ( img>y [ 0 ] ) ; / * f r e e i n g t h e ro ws a r r a y * / f r e e ( img>y ) ; f r e e ( img ) ; } s t a t i c E x t r a c t e d M e t a d a t a * e x t r a c t e d y i m a g e d e s e r i a l i z e ( c o n s t cha r * d a t a , int size ) { u i n t 1 6 t width ; uint16 t height ; int plane size ; E x t r a c t e d Y I m a g e * img = NULL; i f ( s i z e < ( s i z e o f ( u i n t 1 6 t ) * 2) ) { p r i n t f ( " extracted_y_image_deserialize: invalid serialized ExtractedYImage !!!\n" ) ; r e t u r n NULL; }

386 387 388 389 390 391 392 393 394 395 396 397

398 399 400 401 402 403 404 405

406 407

107

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422

/ * a v o i d p r o b l e m s w i t h t y p e s i z e and e n d i a n n e s s * / width = ntohs ( * ( ( u i n t 1 6 t *) data ) ) ; d a t a += s i z e o f ( u i n t 1 6 t ) ; / * a v o i d p r o b l e m s w i t h t y p e s i z e and e n d i a n n e s s * / height = ntohs ( * ( ( u i n t 1 6 t *) data ) ) ; d a t a += s i z e o f ( u i n t 1 6 t ) ; s i z e = s i z e o f ( u i n t 1 6 t ) * 2 ; p l a n e s i z e = w i d t h * h e i g h t * s i z e o f ( u n s i g n e d cha r ) ; if ( size < plane size ) { / * For some k i n d o f rea so m t h e JM s o f t w a r e i n s e r t a b y t e on t h e end o f t h e SEI messa g e . * / p r i n t f ( " extracted_y_image_deserialize: expected plane_size[%d] but was [%d ]!!!\n" , p l a n e s i z e , s i z e ) ; r e t u r n NULL; } / * r e a l f r a m e number i s s e t on t h e m e t a d a t a s u p e r c l a s s d e s e r i a l i z e meth o d img */ = e x t r a c t e d y i m a g e n e w ( 0 , width , h e i g h t ) ;

423

424 425 426 427

428 429 430 431 432 433 434 435 436

f i l l the plane */ memcpy ( img>y [ 0 ] , d a t a , w i d t h * h e i g h t * s i z e o f ( u n s i g n e d cha r ) ) ; r e t u r n ( E x t r a c t e d M e t a d a t a * ) img ; } s t a t i c v o i d e x t r a c t e d y i m a g e s e r i a l i z e ( E x t r a c t e d M e t a d a t a * m e t a d a t a , cha r * data ) { E x t r a c t e d Y I m a g e * img = ( E x t r a c t e d Y I m a g e * ) m e t a d a t a ; / * a v o i d p r o b l e m s w i t h t y p e s i z e and e n d i a n n e s s * / * ( ( u i n t 1 6 t * ) d a t a ) = h t o n s ( img>w i d t h ) ; d a t a += s i z e o f ( u i n t 1 6 t ) ; * ( ( u i n t 1 6 t * ) d a t a ) = h t o n s ( img>h e i g h t ) ; d a t a += s i z e o f ( u i n t 1 6 t ) ;

/* l e t s

437 438 439 440 441 442 443 444 445 446

108
/ * Le t s copy a l l t h e plane . P r e t t y easy s i n c e y [0] p o i n t s t o t h e begin o f the plane */ memcpy ( d a t a , img>y [ 0 ] , img>w i d t h * img>h e i g h t * s i z e o f ( u n s i g n e d cha r ) ) ; } s t ati c int e xt ra ct e d y i ma ge ge t s e ri al i z ed s i ze ( ExtractedMetadata * metadata ) { E x t r a c t e d Y I m a g e * img = ( E x t r a c t e d Y I m a g e * ) m e t a d a t a ; r e t u r n s i z e o f ( u i n t 1 6 t ) + s i z e o f ( u i n t 1 6 t ) + ( img>w i d t h * img>h e i g h t * s i z e o f ( u n s i g n e d cha r ) ) ; } s t a t i c void e x t r a c t e d y i m a g e s a v e ( E x t r a c t e d M e t a d a t a * metadata , i n t fd ) { / * We a r e n o t g o i n g t o u s e OpenCV t o s a v e t h e ima g e t o a f i l e b e c a u s e he messes
460 461 462 463 464

447

448

449 450 451

452 453 454

455 456 457 458 459

up some o f t h e i m a g e s w h i l e gimp can o p en t h e raw i m a g e s e a s i l y * / E x t r a c t e d Y I m a g e * img = ( ExtractedYImage *) metadata ; i n t row ; / * We mu st w r i t e R G B w i t h t h e same Y s a m p l e . Forming a g r a y s c a l e ima g e */ f o r ( row = 0 ; row < img>h e i g h t ; row ++) { s i z e t count = s i z e o f ( u n s i g n e d cha r ) * img>w i d t h ; s i z e t w r i t t e n = w r i t e ( f d , img>y [ row ] , c o u n t ) ;

465 466 467 468 469 470

i f ( w r i t t e n != c o u n t ) { p r i n t f ( " Error writing output file fd [%d], written [%d] but expected[%d ] !!!" , f d , w r i t t e n , c o u n t ) ; break ; } } } /* * * * * * * * * * * * * * ** ** ** * ** ** ** ** * ** * E x t r a c t e d M e t a d a t a B u f f e r API * * * * * * * * * * * * * * ** ** ** * ** ** ** ** * ** */ /* */

471 472 473 474 475 476 477 478 479 480 481 482

109
s t a t i c c o n s t s h o r t METADATA BUFFER MAX INDEX 0 x000000FF * /
484 485 486 487 488 489 490 491 492 493 494

483

= 2 5 5 ; / * 2 8 = 0 <> 255 =

/ * L e t s u s e a a l w a y s emp ty s l o t t e c h n i q u e t o i m p l e m e n t t h e r i n g b u f f e r * / s t a t i c short e x t r a c t e d m e t a d a t a b u f f e r g e t n e x t i n d e x ( short index ) { r e t u r n ( i n d e x + 1 ) & METADATA BUFFER MAX INDEX ; }

ExtractedMetadataBuffer * extracted metadata buffer new () { E x t r a c t e d M et ada ta Buffe r * b u f f e r = malloc ( s i z e o f ( E x t r a c t e d M et ada ta Buffe r ) ); b u f f e r >r i n g b u f f e r = malloc ( s i z e o f ( ExtractedMetadata *) * ( METADATA BUFFER MAX INDEX + 1 ) ) ; = 0;

495 496

497 498 499 500 501 502 503 504

b u f f e r >r e a d i n d e x

b u f f e r >w r i t e i n d e x = 0 ; return b u f f e r ; }

void e x t r a c t e d m e t a d a t a b u f f e r a d d ( E x t r a c t e d M e t a d a t a B u f f e r * b u f f e r , ExtractedMetadata * obj ) { s h o r t n e w w r i t e i n d e x = e x t r a c t e d m e t a d a t a b u f f e r g e t n e x t i n d e x ( b u f f e r > write index ) ;

505 506

507 508 509

i f (! buffer | | ! obj ) { p r i n t f ( " extracted_metadata_buffer_add: ERROR: NULL parameters given !!!\n" ) ; return ; } i f ( n e w w r i t e i n d e x == b u f f e r >r e a d i n d e x ) { p r i n t f ( " extracted_metadata_buffer_add: ERROR: BUFFER OVERFLOW !!!\n" ) ; return ; } p r i n t f ( " extracted_metadata_buffer_add: add new metadata , frame_number[%d ]\n" , o b j>f r a m e n u m b e r ) ;

510 511 512 513 514 515 516 517 518

110

519 520 521 522 523 524

b u f f e r >r i n g b u f f e r [ b u f f e r >w r i t e i n d e x ] = o b j ; b u f f e r >w r i t e i n d e x } ExtractedMetadata * extracted metadata buffer get ( ExtractedMetadataBuffer * b u f f e r , unsigned i n t frame number ) { E x t r a c t e d M e t a d a t a * o b j = NULL; w h i l e ( b u f f e r >w r i t e i n d e x ! = b u f f e r >r e a d i n d e x ) { o b j = b u f f e r >r i n g b u f f e r [ b u f f e r >r e a d i n d e x ] ; i f ( f r a m e n u m b e r < o b j>f r a m e n u m b e r ) { / * We h a v e some m e t a d a t a f o r t h e n e x t f r a m e s , b u t no f o r t h i s one * / r e t u r n NULL; } / * We a r e g o i n g t o g e t o r d i s c a r d t h i s m e t a d a t a * / b u f f e r >r e a d i n d e x = e x t r a c t e d m e t a d a t a b u f f e r g e t n e x t i n d e x ( b u f f e r > read index ) ; = new write index ;

525 526 527 528 529 530 531 532 533 534 535 536 537 538

539 540 541 542 543 544

i f ( f r a m e n u m b e r == o b j>f r a m e n u m b e r ) { return obj ; } p r i n t f ( " extracted_metadata_buffer_get: discarding late metadata frame_number[%d]\n" , o b j>f r a m e n u m b e r ) ; extr ac te d me ta da ta fre e ( obj ) ; } r e t u r n NULL; } void e x t r a c t e d m e t a d a t a b u f f e r f r e e ( E x t r a c t e d M e t a d a t a B u f f e r * b u f f e r ) { w h i l e ( b u f f e r >w r i t e i n d e x ! = b u f f e r >r e a d i n d e x ) { e x t r a c t e d m e t a d a t a f r e e ( b u f f e r >r i n g b u f f e r [ b u f f e r >r e a d i n d e x ] ) ; b u f f e r >r e a d i n d e x = e x t r a c t e d m e t a d a t a b u f f e r g e t n e x t i n d e x ( b u f f e r > read index ) ; }

545 546 547 548 549 550 551 552 553 554 555

556 557

111
f r e e ( b u f f e r >r i n g b u f f e r ) ; free ( buffer ) ; }

558 559 560

112

APENDICE C CODIGO FONTE DO MODULO METADATA EXTRACTOR

8.1 METADATA EXTRACTOR.H


1 2 3

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** \file metadata extractor . h \ brief d e f i n i t i o n s f o r the metadata e x t r a c t o r . \ author ( s ) Tiago K a t c i p i s com> <t i a g o k a t c i p i s @ g m a i l .

4 5 6 7 8 9

10 11

12 13 14 15 16 17 18 19 20 21 22 23

*/ # i f n d e f METADATA EXTRACTOR H # d e f i n e METADATA EXTRACTOR H # i n c l u d e " extracted_metadata.h" typedef struct MetadataExtractor MetadataExtractor ;

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * C r e a t e s a new m e t a d a t a e x t r a c t o r . *

24 25

113
* @param m i n w i d t h detected . * @param m i n h e i g h t detected . * @param s e a r c h h y s t e r e s i s ). * @param t r a c k i n g h y s t e r e s i s ( in frames ) . * @param t r a i n i n g f i l e the object detection . * * @retu rn A M e t a d a t a E x t r a c t o r o b j e c t . * * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** */ M e t a d a t a E x t r a c t o r * m e t a d a t a e x t r a c t o r n e w ( i n t min width , int min height , int search hysteresis , int tracking hysteresis , c o n s t cha r * t r a i n i n g f i l e ) ; Min w i d t h o f t h e o b j e c t t h a t w i l l be Min h e i g h t o f t h e o b j e c t t h a t w i l l be S e a r c h f o r new o b j e c t h y s t e r e s y s ( i n f r a m e s Confirm t r a c k e d o b j e c t e x i s t e n c e h y s t e r e s i s F i l e c o n t a i n i n g t h e t r a i n i n g i n f o u s e d on

26

27

28

29

30

31 32 33 34 35

36 37 38 39 40 41 42 43 44 45

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * Free a metadata e x t r a c t o r . * * @param e x t r a c t o r The m e t a d a t a e x t r a c t o r o b j e c t t o be d e s t r o y e d . * * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** */ void m e t a d a t a e x t r a c t o r f r e e ( M e t a d a t a E x t r a c t o r * e x t r a c t o r ) ;

46 47 48 49 50 51

52 53 54 55 56 57

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * E x t r a c t s t h e i n t e r e s t o b j e c t b o u n d i n g box a s a m e t a d a t a fro m t h e Y p l a n e .

58

114
* The M e t a d a t a E x t r a c t o r o b j e c t . * @param e x t r a c t o r * @param f r a m e n u m b e r The f r a m e number . * @param y co lu mn . * @param w i d t h * @param h e i g h t * * @retu rn The m e t a d a t a o r NULL i f t h e i n t e r e s t o b j e c t i s n o t f o u n d d on t h e frame . * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** */ ExtractedMetadata * metadata extractor extract object bounding box ( MetadataExtractor * extractor , unsigned int frame number ,
72

59 60 61 62

The luma p l a n e , y [ i ] [ j ] wh ere i i s t h e row and j t h e The luma p l a n e w i d t h . The luma p l a n e h e i g h t .

63 64 65 66

67 68

69 70

71

unsigned cha r ** y ,

73

int width , int height );

74

75 76 77

/* ! * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** * Add u s e f u l l i n f o a b o u t b l o c k m o t i o n e s t i m a t i o n , a l l o w i n g t h e e x t r a c t o r * t o do o b j e c t t r a c k i n g . E l i m i n a t i n g t h e n e e d t o p r o c e s s e v e r y f r a m e * t o know t h e new p o s i t i o n o f a p r e v i o u s l y d e t e c t e d o b j e c t . * * @param e x t r a c t o r * @param b l o c k x The M e t a d a t a E x t r a c t o r o b j e c t . The b l o c k x p o s i t i o n .

78 79 80 81 82 83 84 85 86

The b l o c k y p o s i t i o n . * @param b l o c k y * @param x m o t i o n e s t i m a t i o n The m o t i o n e s t i m a t i o n f o r x ( i n QPEL u n i t s ) . * @param y m o t i o n e s t i m a t i o n The m o t i o n e s t i m a t i o n f o r y ( i n QPEL u n i t s ) .

115
* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * ** * * ** * ** * * ** * ** */ void m e t a d a t a e x t r a c t o r a d d m o t i o n e s t i m a t i o n i n f o ( M e t a d a t a E x t r a c t o r * extractor , short block x , short block y , do uble x motion estimation ,
94

87 88

89 90

91 92 93

do uble y motion estimation ) ;

95 96 97 98

/* ! * * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * * E x t r a c t s t h e e n t i r e raw i n t e r e s t o b j e c t a s a m e t a d a t a fro m t h e Y p l a n e . * * @param e x t r a c t o r The M e t a d a t a E x t r a c t o r o b j e c t . * @param f r a m e n u m b e r The f r a m e number . * @param y The luma p l a n e , y [ i ] [ j ] wh ere i i s t h e row and j t h e co lu mn . * @param w i d t h The luma p l a n e w i d t h . * @param h e i g h t The luma p l a n e h e i g h t . * * @retu rn The m e t a d a t a o r NULL i f t h e i n t e r e s t o b j e c t i s n o t f o u n d d on t h e frame . * * * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * */ ExtractedMetadata * metadata extractor extract raw object ( MetadataExtractor * extractor , unsigned i n t frame number , u n s i g n e d cha r ** y, i n t width , int height ) ; # endif

99 100 101 102 103 104 105 106 107

108 109

110 111

112

113

114 115 116

116

8.2 METADATA EXTRACTOR.C


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

# i n c l u d e " metadata_extractor.h" # i n c l u d e <cv . h> # i n c l u d e <cv au x . h> # i n c l u d e <h i g h g u i . h> # i n c l u d e < s t d i o . h>

/ * * * * * * * * * * * * * ** *** ** ** * * Module p r i v a t e d a t a * * * * * * * * * * * * * ** ** ** *** * * /

typedef struct

TrackedBoundigBox {

unsigned i n t i d ; / * d o u b l e x , y i s u s e d s o we d o n t l o s e s m a l l movement i n f o r m a t i o n * / do uble x ; do uble y ; short width ; short height ; i nt motion x ; i nt motion y ; int motion samples ; } Tr ack ed Bo u n d ig Bo x ;

struct

MetadataExtractor {

/ * Haar f e a t u r e c a s c a d e * / CvHaarClassifierCascade * c l a s s i f i e r ; / * OpenCV work b u f f e r * / CvMemStorage * s t o r a g e ; / * How b i g o f a jump t h e r e i s b e t w e e n e a c h s c a l e * / do uble s c a l e f a c t o r ;

117
/* only decide a face i s p r e s e n t in a l o c a t i o n i f t h e r e are at l e a s t three overlapping detections . */ int min neighbors ; / * Minimum o b j e c t s i z e * / Cv Size m i n s i z e ; int haar flags ; /* Search / Tracking h y s t e r e s i s */ unsigned i n t s e a r c h h y s t e r e s i s ; unsigned i n t t r a c k i n g h y s t e r e s i s ; / * L a s t f r a m e t h a t we d i d a f u l l s e a r c h * / unsigned i n t l a s t s e a r c h e d f r a m e ; Tr ack ed Bo u n d ig Bo x * t r a c k e d b o u n d i n g b o x ; };

41

42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

s t a t i c c o n s t do uble DEFAULT SCALE FACTOR = 1 . 1 f ; s t a t i c c o n s t i n t DEFAULT MIN NEIGHBORS = 3;

/ * The m o t i o n v e c t o r s a r e on QPEL u n i t s ( Q u a r t e r P e l r e f i n e m e n t ) . To g e t t h e b l o c k r e a l movement we mu st d i v i d e by 4 * / s t a t i c c o n s t do uble QPEL UNIT = 4 . 0 f ;

66 67 68 69 70 71

/ * P r i v a t e TrackedBoundigBox f u n c t i o n s * / s t a t i c Tr ack ed Bo u n d ig Bo x * t r a c k e d b o u n d i n g b o x n e w ( CvRect * a r e a ) ; s t a t i c v o i d t r a c k e d b o u n d i n g b o x u p d a t e ( Tr ack ed Bo u n d ig Bo x * o b j , CvRect * area ) ; s t a t i c v o i d t r a c k e d b o u n d i n g b o x f r e e ( Tr ack ed Bo u n d ig Bo x * o b j ) ; s t a t i c v o i d t r a c k e d b o u n d i n g b o x e s t i m a t e m o t i o n ( Tr ack ed Bo u n d ig Bo x * o b j ) ; s t a t i c int t r a c k e d b o u n d i n g b o x p o i n t i s i n s i d e ( short x , short y , Tr ack ed Bo u n d ig Bo x * o b j ) ;

72 73 74

75 76 77

/* !

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * * \ brief

78

118
* * * F u n c t i o n b o d y f o r t h e m e t a d a t a e x t r a c t o r new .

79 80 81 82

* * * * * * * * * * * * * * * * * * * * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * */ M e t a d a t a E x t r a c t o r * m e t a d a t a e x t r a c t o r n e w ( i n t min width , int min height , int search hysteresis , int tracking hysteresis , c o n s t cha r * t r a i n i n g f i l e ) { M e t a d a t a E x t r a c t or * e x t r a c t o r = malloc ( s i z e o f ( M e t a d a t a E x t r a c t or ) ) ; if (! extractor ) { p r i n t f ( " metadata_extractor_new: Error allocating MetadataExtractor !!!\ n" ) ; r e t u r n NULL; } e x t r a c t o r > c l a s s i f i e r training file , 0, 0, 0 ) ; e x t r a c t o r >s t o r a g e e x t r a c t o r >m i n s i z e . w i d t h e x t r a c t o r >m i n s i z e . h e i g h t e x t r a c t o r > s e a r c h h y s t e r e s i s e x t r a c t o r > t r a c k i n g h y s t e r e s i s / * d e f a u l t hardcoded s t u f f * / e x t r a c t o r >h a a r f l a g s e x t r a c t o r >m i n n e i g h b o r s e x t r a c t o r > s c a l e f a c t o r e x t r a c t o r >l a s t s e a r c h e d f r a m e = ( C v H a a r C l a s s i f i e r C a s c a d e * ) cvLoad ( = cvCreateMemStorage ( 0 ) ; = min width ; = min height ; = search hysteresis ; = tracking hysteresis ;

83 84 85 86 87 88 89 90 91 92 93 94

95 96 97 98

99 100 101 102 103 104 105 106

= CV HAAR FIND BIGGEST OBJECT | = DEFAULT MIN NEIGHBORS ; = DEFAULT SCALE FACTOR ; = 0;

CV HAAR DO ROUGH SEARCH | CV HAAR DO CANNY PRUNING ;


107 108 109 110 111 112

e x t r a c t o r >t r a c k e d b o u n d i n g b o x = NULL;

p r i n t f ( "\ nmetadata_extractor_new: configured to search for objects with a min size of [%d] x [%d]\n" , min width , m i n h e i g h t ) ; p r i n t f ( " metadata_extractor_new: search_hysteresis[%d] tracking_hysteresis [%d] training file is [%s]\n\n" ,

113 114 115

119
search hysteresis , tracking hysteresis , t r ai ni ng f i le ) ; return e x t r a c t o r ; } void m e t a d a t a e x t r a c t o r f r e e ( M e t a d a t a E x t r a c t o r * e x t r a c t o r ) { i f ( e x t r a c t o r >t r a c k e d b o u n d i n g b o x ) { t r a c k e d b o u n d i n g b o x f r e e ( e x t r a c t o r >t r a c k e d b o u n d i n g b o x ) ; } free ( extractor ) ; } s t a t i c CvRect * m e t a d a t a e x t r a c t o r s e a r c h f o r o b j e c t o f i n t e r e s t ( MetadataExtractor * extractor ,
130

116 117 118 119 120 121 122 123 124 125 126 127 128 129

unsigned cha r ** y,

131 132 133 134

i n t width , int height ) { IplImage * frame IPL DEPTH 8U , 3 ) ; IplImage * gray IPL DEPTH 8U , 1 ) ; CvSeq * r e s u l t s int frame i = 0; i n t row int col = 0; = 0; = cvCreateImage ( cvSize ( width , h e i g h t ) , = cvCreateImage ( cvSize ( width , h e i g h t ) , = NULL;

135

136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

/ * We mu st w r i t e R G B w i t h t h e same Y s a m p l e * / f o r ( row = 0 ; row < h e i g h t ; row ++) { f o r ( c o l = 0 ; c o l < w i d t h ; c o l ++) { f r am e>i m a g e D a t a [ f r a m e i ] = y [ row ] [ c o l ] ;

f r am e>i m a g e D a t a [ f r a m e i + 1 ] = y [ row ] [ c o l ] ; f r am e>i m a g e D a t a [ f r a m e i + 2 ] = y [ row ] [ c o l ] ; f r a m e i += 3 ; } }

120
c v C v t C o l o r ( f r am e , g r a y , CV BGR2GRAY ) ; /* c v E q u a l i z e H i s t spreads out the b r i g h t n e s s values necessary because the i n t e g r a l ima g e
157

154 155 156

f e a t u r e s a r e b a s e d on d i f f e r e n c e s o f r e c t a n g l e r e g i o n s and , i f t h e histogram i s not balanced , t h e s e d i f f e r e n c e s m i g h t be skewed by o v e r a l l l i g h t i n g o r e x p o s u r e o f t h e t e s t images . * / c v E q u a l i z e H i s t ( gray , gray ) ; / * p r e p a r e s memory f o r t h e h a a r c l a s s i f i e r ( i f ) */ c v C l e a r M e m S t o r a g e ( e x t r a c t o r >s t o r a g e ) ; / * The s e a r c h i s o p t i m i z e d t o f i n d o n l y one o b j e c t * / r e s u l t s = c v H a a r D e t e c t O b j e c t s ( gray , e x t r a c t o r > c l a s s i f i e r , e x t r a c t o r >s t o r a g e , e x t r a c t o r >s c a l e f a c t o r , e x t r a c t o r >m i n n e i g h b o r s , e x t r a c t o r >h a a r f l a g s , e x t r a c t o r >m i n s i z e ) ; / * Freeing images * / c v R e l e a s e I m a g e (& f r a m e ) ; c v R e l e a s e I m a g e (& g r a y ) ; i f ( r e s u l t s && ( r e s u l t s > t o t a l <= 0 ) ) { r e t u r n NULL; } r e t u r n ( CvRect * ) cv GetSeq Elem ( r e s u l t s , 0 ) ; } i t was u s e d b e f o r e a l r e a d y

158

159 160 161

162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192

/ * * * * * * * * * * * * * * * * ** ** ** ** * ** ** ** * * TrackedBoundigBox f a c i l i t i e s * * * * * * * * * * * * * * ** ** ** * ** ** ** ** * ** * / /* P ri v a t e const data */ s t a t i c c o n s t i n t BLOCK SIZE = 4 ;

121
/ * P r i v a t e TrackedBoundigBox f u n c t i o n s * / s t a t i c Tr ack ed Bo u n d ig Bo x * t r a c k e d b o u n d i n g b o x n e w ( CvRect * a r e a ) { s t a t i c unsigned i n t t r a c k e d b o u n d i n g b o x i d = 0 ; Tr ack ed Bo u n d ig Bo x * o b j = m a l l o c ( s i z e o f ( Tr ack ed Bo u n d ig Bo x ) ) ; i f (! obj ) { r e t u r n NULL; } o b j>i d = t r a c k e d b o u n d i n g b o x i d ; t r a c k e d b o u n d i n g b o x u p d a t e ( obj , ar ea ) ; t r a c k e d b o u n d i n g b o x i d ++; return obj ; } s t a t i c v o i d t r a c k e d b o u n d i n g b o x u p d a t e ( Tr ack ed Bo u n d ig Bo x * box , CvRect * area ) { box>x box>y box>w i d t h box>h e i g h t box>m o t i o n x box>m o t i o n y } s t a t i c v o i d t r a c k e d b o u n d i n g b o x f r e e ( Tr ack ed Bo u n d ig Bo x * o b j ) { free ( obj ) ; } s t a t i c v o i d t r a c k e d b o u n d i n g b o x e s t i m a t e m o t i o n ( Tr ack ed Bo u n d ig Bo x * o b j ) { p r i n t f ( "\n ================ OBJECT TRACKING INFO ================\n" ) ; p r i n t f ( " tracked_bounding_box_estimate_motion: total_motion_x[%d] total_motion_y[%d] motion_samples[%d]\n" ,
232 233

193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211

212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

= a r e a >x ; = a r e a >y ; = a r e a >w i d t h ; = a r e a >h e i g h t ; = 0; = 0;

box>m o t i o n s a m p l e s = 0 ;

o b j>m o t i o n x , o b j>m o t i o n y , o b j>m o t i o n s a m p l e s ) ;

122
/ * A s i m p l e a r i t h m e t i c mean o f a l l t h e v e c t o r s * / p r i n t f ( " tracked_bounding_box_estimate_motion: x_mov [%f] y_mov [%f]\n" , ( ( do uble ) o b j>m o t i o n x / QPEL UNIT ) / ( do uble ) o b j> motion samples ,
237

234 235 236

( ( do uble ) o b j>m o t i o n y / QPEL UNIT ) / ( do uble ) o b j> motion samples ) ;

238 239

p r i n t f ( " tracked_bounding_box_estimate_motion: old_x [%f] old_y [%f]\n" , o b j >x , o b j>y ) ;

240 241

/ * Dont wa n t t o l o s e p r e c i s i o n ( a c c u m u l a t e d movement ) on t h e i n t e g e r division */ o b j>x = ( ( do uble ) o b j >m o t i o n x / QPEL UNIT ) / ( do uble ) o b j > motion samples ; o b j>y = ( ( do uble ) o b j >m o t i o n y / QPEL UNIT ) / ( do uble ) o b j > motion samples ;

242

243

244 245

p r i n t f ( " tracked_bounding_box_estimate_motion: new_x [%f] new_y [%f]\n" , o b j >x , o b j>y ) ;

246 247 248 249 250 251 252 253

o b j>m o t i o n x o b j>m o t i o n y

= 0; = 0;

o b j>m o t i o n s a m p l e s = 0 ; p r i n t f ( " ================ OBJECT TRACKING INFO END ================\n\n" ) ; } s t a t i c int t r a c k e d b o u n d i n g b o x p o i n t i s i n s i d e ( short x , short y , Tr ack ed Bo u n d ig Bo x * o b j ) { i f ( ( x < o b j >x ) | | ( x > o b j >x + o b j >w i d t h ) ) { /* x is out */ return 0; } i f ( ( y < o b j >y ) | | ( y > o b j >y + o b j >h e i g h t ) ) { /* y is out */ return 0; } return 1; }

254 255 256 257 258 259 260 261 262 263 264 265 266 267 268

123
/ * * * * * * * * ** *** * P u b l i c API * * * * * * * * * ** *** * / ExtractedMetadata * metadata extractor extract object bounding box ( MetadataExtractor * extractor , unsigned int frame num ,
274

269 270 271 272

273

unsigned cha r ** y ,

275

int width , int height ) { CvRect * r e c t = NULL; i f ( e x t r a c t o r >t r a c k e d b o u n d i n g b o x ) { / * We a r e t r a c k i n g l e t s c h e c k o u r t r a c k i n g h y s t e r e s i s and i f we h a v e some m o t i o n s a m p l e s t o work w i t h . ( means t h e o b j e c t l e f t t h e v i d e o area ) * / i f ( ( ( f r am e n u m e x t r a c t o r >l a s t s e a r c h e d f r a m e ) >= e x t r a c t o r > tracking hysteresis ) || ( e x t r a c t o r >t r a c k e d b o u n d i n g b o x >m o t i o n s a m p l e s == 0 ) ) { / * Time t o c o n f i r m i f t h e o b j e c t i s width , h e i g h t ) ; present */ rect = metadata extractor search for object of interest ( extractor , y , still

276

277 278 279 280 281 282 283

284

285 286 287 288

289 290 291 292 293 294 295 296 297

e x t r a c t o r >l a s t s e a r c h e d f r a m e = f r am e n u m ; if (! rect ) { / * We a r e t r a c k i n g s o m e t h i n g t h a t no l o n g e r e x i s t s . * / t r a c k e d b o u n d i n g b o x f r e e ( e x t r a c t o r >t r a c k e d b o u n d i n g b o x ) ; e x t r a c t o r >t r a c k e d b o u n d i n g b o x = NULL; r e t u r n NULL; }

124
/ * We s t i l l h a v e t h e o b j e c t . I t wo u ld be good t o h a v e some h e u r i s t i c i t i s t h e same o b j e c t * / t r a c k e d b o u n d i n g b o x u p d a t e ( e x t r a c t o r >t r a c k e d b o u n d i n g b o x , r e c t ) ; } else { / * J u s t u s e ME i n f o r m a t i o n ;
305 306 307 308

298

to ve r i fy

if

299 300 301 302 303 304

*/ t r a c k e d b o u n d i n g b o x e s t i m a t e m o t i o n ( e x t r a c t o r >t r a c k e d b o u n d i n g b o x )

} return ( ExtractedMetadata *) e x t r a c t e d o b j e c t b o u n d i n g b o x n e w ( e x t r a c t o r >t r a c k e d b o u n d i n g b o x >i d , frame num , extractor > >x ,

309

310

tracked bounding extractor > >y ,


312

311

tracked bounding extractor > > width ,


313

tracked bounding

extractor > > height ); } / * We a r e n o t t r a c k i n g * / i f ( ( f r am e n u m e x t r a c t o r >l a s t s e a r c h e d f r a m e ) < e x t r a c t o r > search hysteresis ) { / * L e t s n o t sea rch t h i s frame * /

tracked bounding

314 315 316 317 318

319

125
r e t u r n NULL; } rect = metadata extractor search for object of interest ( extractor , y , width , h e i g h t ) ;
324 325 326 327 328 329 330 331 332

320 321 322 323

e x t r a c t o r >l a s t s e a r c h e d f r a m e = f r am e n u m ; if (! rect ) { / * no i n t e r e s t o b j e c t * / r e t u r n NULL; } e x t r a c t o r >t r a c k e d b o u n d i n g b o x = t r a c k e d b o u n d i n g b o x n e w ( r e c t ) ; return ( ExtractedMetadata *) e x t r a c t e d o b j e c t b o u n d i n g b o x n e w ( e x t r a c t o r >t r a c k e d b o u n d i n g b o x >i d , frame num , extractor > >x ,

333 334

tracked bounding b extractor > >y ,


336

335

tracked bounding b extractor > >w i d t h ,


337

tracked bounding b

extractor > > height ) ; } void m e t a d a t a e x t r a c t o r a d d m o t i o n e s t i m a t i o n i n f o ( M e t a d a t a E x t r a c t o r * extractor , short blk x , short blk y , do uble x motion estimation ,

tracked bounding b

338 339 340

341 342 343

126
do uble y motion estimation )
345 346 347 348 349 350 351 352 353 354 355 356 357 358

344

{ / * B l o c k s i z e i s 4 x4 . ( s e e l e n c o d / i n c / d e f i n e s . h ) b l o c k p o s * BLOCK SIZE = r e a l p o s * / s h o r t x = b l k x * BLOCK SIZE ; s h o r t y = b l k y * BLOCK SIZE ; / * f i r s t s e e i f we a r e t r a c k i n g an o b j e c t * / i f ( ! e x t r a c t o r >t r a c k e d b o u n d i n g b o x ) { return ; }

/* Lets t e s t

i f any p o i n t o f t h i s b l o c k i s i n s i d e o u r o b j e c t a r e a .

*/

i f ( ! ( t r a c k e d b o u n d i n g b o x p o i n t i s i n s i d e ( x , y , e x t r a c t o r > tracked bounding box ) | | t r a c k e d b o u n d i n g b o x p o i n t i s i n s i d e ( x + BLOCK SIZE , y , e x t r a c t o r >t r a c k e d b o u n d i n g b o x ) | | t r a c k e d b o u n d i n g b o x p o i n t i s i n s i d e ( x , y + BLOCK SIZE , e x t r a c t o r >t r a c k e d b o u n d i n g b o x ) | | t r a c k e d b o u n d i n g b o x p o i n t i s i n s i d e ( x + BLOCK SIZE , y + BLOCK SIZE , e x t r a c t o r >t r a c k e d b o u n d i n g b o x ) ) ) { /* Ignore t h i s block i n f o */ return ; } / * S i n c e we a r e g o i n g t o a c c u m u l a t e one v e c t o r t o t h e e n t i r e o b j e c t , j u s t sum t h e e s t i m a t i o n * / e x t r a c t o r >t r a c k e d b o u n d i n g b o x >m o t i o n x += x m o t i o n e s t i m a t i o n ; e x t r a c t o r >t r a c k e d b o u n d i n g b o x >m o t i o n y += y m o t i o n e s t i m a t i o n ; e x t r a c t o r >t r a c k e d b o u n d i n g b o x >m o t i o n s a m p l e s ++; } /* ! * * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * * \ brief * F u n c t i o n b o d y f o r e x t r a c t m e t a d a t a fro m t h e y ima g e p l a n e . * * \ return * A E x t r a c t e d M e t a d a t a o b j e c t o r NULL i n c a s e no m e t a d a t a i s e x t r a c t e d . *

359

360

361

362 363 364 365 366

367 368 369 370 371 372 373

374 375 376 377 378 379

127
* * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * ** * ** * * */ ExtractedMetadata * metadata extractor extract raw object ( MetadataExtractor * extractor , unsigned i n t frame num ,
384

380

381 382

383

u n s i g n e d cha r ** y, i n t width , int height ) { / * F i r s t we mu st c o n v e r t t h e Y luma p l a n e t o BGR and th em t o g r a y s c a l e . On g r a y s c a l e Y = R = G = B . P r e t t y s i m p l e t o c o n v e r t . * / E x t r a c t e d Y I m a g e * m e t a d a t a = NULL; CvRect * r e s = NULL; res = metadata extractor search for object of interest ( extractor , y , width , h e i g h t ) ;

385 386 387 388 389 390 391 392 393 394

395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417

if (! res ) { r e t u r n NULL; } m e t a d a t a = e x t r a c t e d y i m a g e n e w ( frame num , r e s >w i d t h , r e s >h e i g h t ) ; u n s i g n e d cha r ** y p l a n e = e x t r a c t e d y i m a g e g e t y ( m e t a d a t a ) ; int metadata row = 0; i n t row = 0 ; int col = 0; / * Copy t h e o b j e c t fro m t h e o r i g i n a l f r a m e * / f o r ( row = r e s >y ; row < ( r e s >h e i g h t + r e s >y ) ; row ++) { int metadata col = 0; f o r ( c o l = r e s >x ; c o l < ( r e s >w i d t h + r e s >x ) ; c o l ++) { y p l a n e [ m e t a d a t a r o w ] [ m e t a d a t a c o l ] = y [ row ] [ c o l ] ; m e t a d a t a c o l ++; } m e t a d a t a r o w ++; }

128

418 419 420

return ( ExtractedMetadata *) metadata ; }

129

ANEXO A CODIGO FONTE DO CODIFICADOR DO SOFTWARE DE REFERENCIA - ALTERACOES REALIZADAS

Este anexo cont m o c digo fonte das alteracoes realizadas no codicador do software de e o refer ncia durante o desenvolvimento do trabalho. Como os fontes dos arquivos modicados e s o muito extensos apenas as partes mais relevantes se encontram neste anexo. a

9.1 ALTERACOES REALIZADAS NO ARQUIVO LENCOD/INC/CONFIG FILE.H


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

/* ! * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * ** * * ** * ** * ** * * ** * ** * \file * * * configfile .h \ brief P r o t o t y p e s f o r c o n f i g f i l e . c and d e f i n i t i o n s o f u s e d s t r u c t u r e s .

* * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * ** * * ** * ** * ** * * ** * ** */ # i n c l u d e "fmo.h" # ifndef # define CONFIGFILE H CONFIGFILE H

# i n c l u d e " config_common.h" # d e f i n e DEFAULTCONFIGFILENAME " encoder .cfg" # d e f i n e PROFILE IDC # d e f i n e LEVEL IDC # d e f i n e OBJECT DETECTION ACTIVATE activated */ 88 21 1 /* Object d et ect io n

130
# d e f i n e OBJECT DETECTION MIN WIDTH object in pi xels */ # d e f i n e OBJECT DETECTION MIN HEIGHT object in pi xels */
26 27 28 29 30

24

30 / * Min w i d t h o f t h e 30 / * Min h e i g h t o f t h e

25

/ * H y s t e r e s i s ( i n f r a m e n u mb ers ) b e t w e e n e a c h o b j e c t s e a r c h * / 30 # d e f i n e OBJECT DETECTION SEARCH HYSTERESIS / * H y s t e r e s i s ( i n f r a m e n u mb ers ) t o c o n f i r m t h a t t h e t r a c k e d o b j e c t i s there */ # d e f i n e OBJECT DETECTION TRACKING HYSTERESIS 60 I n p u tPar am eters cfgparams ; still

31 32 33 34 35 36 37 38

# i f d e f INCLUDED BY CONFIGFILE C / / Mapping Map S y n t a x : / / { NAMEin Co n fig File , &c f g p a r a m s . Va ria b leNa me , Type , I n i t i a l V a l u e , L i m i t T y p e , M i n L i m i t , Ma xLimit , C h a r S i z e }

39 40 41

/ / Types : {0: i n t , 1: t e x t , 2: double } / / L i m i t T y p e : { 0 : none , 1 : b o t h , 2 : minimum , 3 : QP b a s e d } / / We c o u l d s e p a r a t e t h i s b a s e d on t y p e s t o make i t more f l e x i b l e and a l l o w also defa ul ts for t e xt types . Mapping Map [ ] = { / * O u t r o s campos da e s t r u t u r a * / / * Ad d in g c o n f i g u r a t i o n f o r O b j e c t d e t e c t i o n / t r a c k i n g * / {" object_detection_enable" , &c f g p a r a m s . object detection enable , OBJECT DETECTION ACTIVATE , }, {" object_detection_search_hysteresis" , object detection search hysteresis , OBJECT DETECTION SEARCH HYSTERESIS , }, {" object_detection_tracking_hysteresis" , object detection tracking hysteresis , OBJECT DETECTION TRACKING HYSTERESIS , }, {" object_detection_min_width" , object detection min width , OBJECT DETECTION MIN WIDTH , 0, 1, 0.0 , 1.0 ,

42 43 44 45 46 47

48

&c f g p a r a m s . 0, 0, 0.0 , 0.0 ,

49

&c f g p a r a m s . 0, 0, 0.0 , 0.0 ,

50

&c f g p a r a m s . 0, 0, 0.0 , 0.0 ,

131
},
51

{" object_detection_min_height" , object detection min height , OBJECT DETECTION MIN HEIGHT , }, {" object_detection_training_file" , object detection training file , 0, FILE NAME SIZE , } ,

&c f g p a r a m s . 0, 0, 0.0 , 0.0 ,

52

&c f g p a r a m s . 1, 0.0 , 0.0 , 0.0 ,

53 54

{NULL, 1 , }; 0.0 ,

NULL, 0, }, 0.0 , 0.0 ,

55 56 57 58 59 60 61 62 63 64

# endif # i f n d e f INCLUDED BY CONFIGFILE C e x t e r n Mapping Map [ ] ; # endif extern void Configure ( V i d e o P a r a m e t e r s * p Vid , I n p u t P a r a m e t e r s *

65

p I n p , i n t ac , cha r * av [ ] ) ; extern void g e t n u m b e r o f f r a m e s ( I n p u t P a r a m e t e r s * p Inp , VideoDataFile * input file ) ; e x t e r n v o i d r e a d s l i c e g r o u p i n f o ( V i d e o P a r a m e t e r s * p Vid , I n p u t P a r a m e t e r s * p Inp ) ; # endif

66

67 68

9.2 ALTERACOES REALIZADAS NO ARQUIVO LENCOD/INC/GLOBAL.H


1 2 3 4 5 6 7 8 9

/ / ! VideoParameters typedef struct video par { / * Campos que e x i s t i a m na e s t r u t u r a * / /* Adicionado metadata e x t r a c t o r */ MetadataExtractor * metadata extractor ;

132
/ * Campos que e x i s t i a m na e s t r u t u r a * / } VideoParameters ;

10 11 12

9.3 ALTERACOES REALIZADAS NO ARQUIVO LENCOD/SRC/LENCOD.C


1 2 3 4 5 6 7 8 9 10 11

i n t main ( i n t a r g c , cha r ** a r g v ) { a l l o c e n c o d e r (& p En c ) ; C o n f i g u r e ( p Enc>p Vid , p Enc>p I n p , a r g c , a r g v ) ; /* i n i t i a l i z e metadata e x t r a c t o r */ i f ( p Enc>p I n p >o b j e c t d e t e c t i o n e n a b l e ) { p Enc>p Vid>m e t a d a t a e x t r a c t o r = m e t a d a t a e x t r a c t o r n e w ( p Enc>p I n p >o b j e c t d e t e c t i o n m i n w i d t h , p Enc>p I n p > o b j e c t d e t e c t i o n m i n h e i g h t , p Enc>p I n p > o b j e c t d e t e c t i o n s e a r c h h y s t e r e s i s , p Enc>p I n p > o b j e c t d e t e c t i o n t r a c k i n g h y s t e r e s i s , p Enc>p I n p > object detection training file ) ;

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

i f ( ! p Enc>p Vid>m e t a d a t a e x t r a c t o r ) { p r i n t f ( " ERROR CREATING METADATA EXTRACTOR !!!!\n" ) ; r e t u r n 1; } } // i n i t encoder

i n i t e n c o d e r ( p Enc>p Vid , p Enc>p I n p ) ; / / encode sequence e n c o d e s e q u e n c e ( p Enc>p Vid , p Enc>p I n p ) ; / / t e r m i n a t e sequence f r e e e n c o d e r m e m o r y ( p Enc>p Vid , p Enc>p I n p ) ; i f ( p Enc>p I n p >o b j e c t d e t e c t i o n e n a b l e ) { m e t a d a t a e x t r a c t o r f r e e ( p Enc>p Vid>m e t a d a t a e x t r a c t o r ) ; }

133
f r e e p a r a m s ( p Enc>p I n p ) ; f r e e e n c o d e r ( p En c ) ; return 0; }

32 33 34 35 36

9.4 ALTERACOES REALIZADAS NO ARQUIVO LENCOD/SRC/IMAGE.C


1 2 3 4 5 6

s t a t i c void g e t m o t i o n e s t i m a t i o n i n f o r m a t i o n ( VideoParameters * p Vid ) { i nt blk y , blk x ; / * M a c r o b l o c k s h a v e a 16 X16 s i z e . B l o c k s h a v e 4X4 , e a c h M a c r o b l o c k h a v e 16 b l o c k s . Here we a r e g o i n g t o i t e r a t e t r o u g h t h e 4 x4 b l o c k s ME i n f o * / f o r ( b l k y = 0 ; b l k y < c e i l ( p Vid>h e i g h t / BLOCK SIZE ) ; b l k y ++) { f o r ( b l k x = 0 ; b l k x < c e i l ( p Vid>w i d t h / BLOCK SIZE ) ; b l k x ++) { P i c M o t i o n P a r a m s * m v i n f o p = &p Vid>e n c p i c t u r e >m v i n f o [ b l k y ] [ blk x ] ; m e t a d a t a e x t r a c t o r a d d m o t i o n e s t i m a t i o n i n f o ( p Vid> metadata extractor , blk x , blk y , m v i n f o p >mv [ LIST 0 ] . mv x , m v i n f o p >mv [ LIST 0 ] . mv y ) ; } } } s t a t i c v o i d c o d e a p l a n e ( V i d e o P a r a m e t e r s * p Vid , I n p u t P a r a m e t e r s * p I n p ) { u n s i g n e d i n t NumberOfCodedMBs = 0 ; int SliceGroup = 0;

7 8 9 10 11 12 13

14 15

16 17 18

19

20 21 22 23 24 25 26 27 28 29

134
DistMetric di s torti on ; / / The s l i c e g r o u p c h a n g e c y c l e can be ch a n g ed h e r e . / / FmoInit ( ) i s c a l l e d b e f o r e coding each p i c t u r e , frame or f i e l d p Vid>s l i c e g r o u p c h a n g e c y c l e = 1 ; F m o I n i t ( p Vid , p Vid>a c t i v e p p s , p Vid>a c t i v e s p s ) ; F m o S t a r t P i c t u r e ( p Vid ) ; FMO
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

30 31 32 33 34 35 36

// ! picture level

i n i t i a l i z a t i o n of

CalculateQuant4x4Param ( p Vid ) ; C a l c u l a t e O f f s e t 4 x 4 P a r a m ( p Vid ) ; i f ( p I n p >Tr an sf o r m8x8 Mode ) { CalculateQuant8x8Param ( p Vid ) ; C a l c u l a t e O f f s e t 8 x 8 P a r a m ( p Vid ) ; } r e s e t p i c b i n c o u n t ( p Vid ) ; p Vid> b y t e s i n p i c t u r e = 0 ; w h i l e ( NumberOfCodedMBs < p Vid>P i c S i z e I n M b s ) { / / Encode one S L i c e Group w h i l e ( ! F m o S l i c e G r o u p C o m p l e t e l y C o d e d ( p Vid , S l i c e G r o u p ) ) { / / Encode t h e c u r r e n t s l i c e i f ( ! p Vid>m b a f f f r a m e f l a g ) NumberOfCodedMBs += e n c o d e o n e s l i c e ( p Vid , S l i c e G r o u p , NumberOfCodedMBs ) ; else NumberOfCodedMBs += e n c o d e o n e s l i c e M B A F F ( p Vid , S l i c e G r o u p , NumberOfCodedMBs ) ; / / loop over s l i c e s

58 59

60 61 62 63 64 65 66 67 68 69

F m o S e t L a s t M a c r o b l o c k I n S l i c e ( p Vid , p Vid>c u r r e n t m b n r ) ; / / Proceed t o n e x t s l i c e p Vid> c u r r e n t s l i c e n r ++; p Vid>p S t a t s > b i t s l i c e = 0 ; } / / Proceed t o n e x t S liceGro u p S l i c e G r o u p ++; } FmoEndPicture ( ) ;

135

70 71 72 73 74 75 76 77 78 79 80 81 82 83

i f ( ( p I n p >Sk ip DeBlo ck NonRef == 0 ) | | ( p Vid>n a l r e f e r e n c e i d c ! = 0 ) ) { i f ( p I n p >R D P i c t u r e D e b l o c k i n g && ! p Vid>TurnDBOff ) { f i n d d i s t o r t i o n ( p Vid , &p Vid>im g Data ) ; d i s t o r t i o n . v a l u e [ 0 ] = p Vid>p D i s t >m e t r i c [ SSE ] . v a l u e [ 0 ] ; d i s t o r t i o n . v a l u e [ 1 ] = p Vid>p D i s t >m e t r i c [ SSE ] . v a l u e [ 1 ] ; d i s t o r t i o n . v a l u e [ 2 ] = p Vid>p D i s t >m e t r i c [ SSE ] . v a l u e [ 2 ] ; } else d i s t o r t i o n . value [0] = d i s t o r t i o n . value [1] = d i s t o r t i o n . value [2] = 0; / * Good p l a c e t o g e t ME i n f o r m a t i o n S t i l l m i s s i n g t h e mb s i z e and t h e vectors */

84 85 86 87 88 89

i f ( p I n p >o b j e c t d e t e c t i o n e n a b l e ) { g e t m o t i o n e s t i m a t i o n i n f o r m a t i o n ( p Vid ) ; } Deb lo ck Fr am e ( p Vid , p Vid>e n c p i c t u r e >imgY , p Vid>e n c p i c t u r e > imgUV ) ; / / comment o u t t o d i s a b l e d e b l o c k i n g f i l t e r

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

i f ( p I n p >R D P i c t u r e D e b l o c k i n g && ! p Vid>TurnDBOff ) { f i n d d i s t o r t i o n ( p Vid , &p Vid>im g Data ) ; i f ( d i s t o r t i o n . value [0]+ d i s t o r t i o n . value [1]+ d i s t o r t i o n . value [2] < p Vid>p D i s t >m e t r i c [ SSE ] . v a l u e [ 0 ] + p Vid>p D i s t >m e t r i c [ SSE ] . v a l u e [ 1 ] + p Vid>p D i s t >m e t r i c [ SSE ] . v a l u e [ 2 ] ) { p Vid>E v a l u a t e D B O f f = 1 ; } } } }

i n t e n c o d e o n e f r a m e ( V i d e o P a r a m e t e r s * p Vid , I n p u t P a r a m e t e r s * p I n p ) { int i ; int nplane ;

136
/ / Rate c o n t r o l int b its = 0; TIME T s t a r t t i m e ; TIME T e n d t i m e ; int64 tmp time ;

111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

p Vid>m e t i m e = 0 ; p Vid>r d p a s s = 0 ; i f ( ( p I n p >s e p a r a t e c o l o u r p l a n e f l a g ! = 0 ) ) { f o r ( n p l a n e = 0 ; n p l a n e <MAX PLANE; n p l a n e ++ ) { p Vid>e n c f r a m e p i c t u r e J V [ n p l a n e ] = NULL; } } f o r ( i = 0 ; i < 6 ; i ++) p Vid>e n c f r a m e p i c t u r e [ i ] g e t t i m e (& s t a r t t i m e ) ; / / Rate c o n t r o l p Vid>w r i t e m a c r o b l o c k = FALSE ; /* / / S h a n k a r R e g u n a t h a n ( Oct 2 0 0 2 ) / / P r e p a r e P a n s c a n r e c t SEI p a y l o a d UpdatePanScanRectInfo ( p SEI ) ; / / P r e p a r e A r b i t r a r y d a t a SEI P a y l o a d UpdateUser data unregistered ( p SEI ) ; / / P r e p a r e R e g i s t e r e d d a t a SEI P a y l o a d U p d a t e U s e r d a t a r e g i s t e r e d i t u t t 3 5 ( p SEI ) ; / / P r e p a r e RandomAccess SEI P a y l o a d Up d a teRa n d o mAccess ( p V i d ) ; */ p u t b u f f e r f r a m e ( p Vid ) ; i n i t f r a m e ( p Vid , p I n p ) ; i f ( p I n p >e n a b l e 3 2 p u l l d o w n ) { i f ( ! r e a d i n p u t d a t a 3 2 p u l l d o w n ( p Vid ) ) / / s e t s t h e p o i n t e r s t o t h e frame s t r u c t u r e s / / ( and n o t t o one o f t h e f i e l d s t r u c t u r e s ) = NULL; // s t a r t t i m e i n ms

137
{ return 0; } } else { i f ( ! r e a d i n p u t d a t a ( p Vid ) ) { return 0; } } p r o c e s s i m a g e ( p Vid , p I n p ) ; i f ( p I n p >o b j e c t d e t e c t i o n e n a b l e ) { / * T h i s s o u n d s l i k e a good p l a c e t o p r o c e s s t h e raw Y imgData . * / ExtractedMetadata * metadata = m e t a d a t a e x t r a c t o r e x t r a c t o b j e c t b o u n d i n g b o x ( p Vid> metadata extractor ,
171

154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

p Vi

172

173

p Vi

138

174

p Vi

175 176 177

i f ( metadata ) { int size metadata ) ; cha r * d a t a NALU t * n a l u = extracted metadata get serialized size ( = malloc ( s i z e ) ; = NULL;

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195

/* S e r i a l i z e the metadata */ e x t r a c t e d m e t a d a t a s e r i a l i z e ( metadata , data ) ; / * I n s e r t t h e s e r i a l i z e d m e t a d a t a on t h e b i t s t r e a m a s SEI NALU . * / nalu = u s e r d a t a g e n e r a t e u n r e g i s t e r e d s e i n a l u ( data , s i z e ) ; p Vid>WriteNALU ( p Vid , n a l u ) ; FreeNALU ( n a l u ) ; free ( data ) ; e x t r a ct e d m et a d at a f r e e ( metadata ) ; } / * End o f m e t a d a t a e x t r a c t i n g * / } p a d b o r d e r s ( p I n p >o u t p u t , p Vid>w i d t h , p Vid>h e i g h t , p Vid>w i d t h c r , p Vid>h e i g h t c r , p Vid>im g Data . f r m d a t a ) ;

196 197 198 199 200 201

# i f ( MVC EXTENSION ENABLE) i f ( p I n p >n u m o f v i e w s ==1 | | p Vid>v i e w i d ==0) { p Vid> f i e l d p i c p t r = p Vid> f i e l d p i c 1 ; }

139
else { p Vid> f i e l d p i c p t r = p Vid> f i e l d p i c 2 ; } # endif

202 203 204 205 206 207 208 209 210 211

/ / F o l l o w i n g c o d e s h o u l d c o n s i d e r o p t i m a l c o d i n g mode . C u r r e n t l y a l s o does not su p p o rt / / m u l t i p l e s l i c e s per frame . p Vid>p D i s t >f r a m e c t r ++; # i f ( MVC EXTENSION ENABLE) i f ( p I n p >n u m o f v i e w s == 2 ) { p Vid>p D i s t >f r a m e c t r v [ p Vid>v i e w i d ] + + ; } # endif i f ( p Vid>t y p e == SP SLICE ) { i f ( p I n p >s p 2 f r a m e i n d i c a t o r ) { / / s w i t c h i n g SP f r a m e e n c o d i n g p Vid>s p 2 f r a m e i n d i c a t o r = TRUE ; r e a d S P c o e f f i c i e n t s ( p Vid , p I n p ) ; } } else { p Vid>s p 2 f r a m e i n d i c a t o r = FALSE ; } i f ( p I n p >WPMCPrecision ) { wp x I n itWPXPasses ( p Vid , p I n p ) ; >c u r r w p r d p a s s = p Vid>pWPX >w p r d p a s s e s ; p Vid>pWPX p Vid>pWPX >c u r r w p r d p a s s >a l g o r i t h m = WP REGULAR; } i f ( p I n p > P i c I n t e r l a c e == FIELD CODING ) p e r f o r m e n c o d e f i e l d ( p Vid ) ; else

212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243

140
perform encode frame ( p Vid ) ; p Vid>p S t a t s >f r a m e c o u n t e r ++; p Vid>p S t a t s >f r a m e c t r [ p Vid>t y p e ] + + ; / / Here , p V i d >s t r u c t u r e may be e i t h e r FRAME o r BOTTOM FIELD d e p e n d i n g on w h e t h e r AFF c o d i n g i s u s e d
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271

244 245 246 247 248 249

/ / The p i c t u r e s t r u c t u r e d e c i s i o n c h a n g e s r e a l l y o n l y t h e f l d f l a g w r i t e f r a m e p i c t u r e ( p Vid ) ; # i f ( MVC EXTENSION ENABLE) i f ( p I n p >n u m o f v i e w s ==2) { / / view id 1 w ill follow view id 0 anchor pic flag value i f ( ( p Vid>a n c h o r p i c f l a g [ 0 ] = = 1 ) && ( p Vid>v i e w i d &1) ==0) { p Vid>p r e v v i e w i s a n c h o r = 1 ; } else { p Vid>p r e v v i e w i s a n c h o r = 0 ; } } # endif / / Need s l i c e d a t a f o r d e b l o c k i n g i n U p d a t e D e c o d e r s i f ( p I n p > P i c I n t e r l a c e == FRAME CODING) { i f ( ( p I n p >r d o p t == 3 ) && ( p I n p >de == LLN) && ( p Vid> n a l r e f e r e n c e i d c != 0) ) { U p d a t e D e c o d e r s ( p Vid , p I n p , p Vid>e n c p i c t u r e ) ; } i f ( p I n p >R e s t r i c t R e f ) U p d a t e P i x e l M a p ( p Vid , p I n p ) ; } f r e e s l i c e d a t a ( p Vid ) ; / / Rate c o n t r o l i f ( p I n p >RCEnable ) / / simulate p a c k e t l o s s e s and move d e c o d e d ima g e t o r e f e r e n c e b u f f e r s

272 273

274 275 276 277 278 279 280 281 282 283

141
{ / / we c o u l d add h e r e a f u n c t i o n p o i n t e r ! b i t s = ( i n t ) ( p Vid>p S t a t s > b i t c t r p Vid>p S t a t s > b i t c t r n ) + ( i n t ) ( p Vid>p S t a t s > b i t c t r f i l l e r d a t a p Vid>p S t a t s > bit ctr filler data n ) ;
288 289 290

284 285 286 287

i f ( p I n p >RCUpdateMode <= MAX RC MODE ) p Vid>r c u p d a t e p i c t f r a m e p t r ( p Vid , p I n p , p Vid>p r c q u a d , p Vid >p r c g e n , b i t s ) ;

291 292 293 294 295 296

} c o m p u t e d i s t o r t i o n ( p Vid , &p Vid>im g Data ) ; / / r e d u n d a n t p i c t u r e s : s a v e r e c o n s t r u c t i o n t o c a l c u l a t e SNR and r e p l a c e reference picture i f ( p I n p >r e d u n d a n t p i c f l a g ) { storeRedundantFrame ( p Vid ) ; } s t o r e c o d e d p i c t u r e ( p Vid>p Dpb ) ; p Vid>AverageFrameQP = i s i g n ( p Vid>SumFrameQP) * ( ( i a b s ( p Vid> SumFrameQP) + ( i n t ) ( p Vid>Fr am eSizeI n Mb s >> 1 ) ) / ( i n t ) p Vid> Fr am eSizeI n Mb s ) ;

297 298 299 300 301 302 303

304 305

i f ( p I n p >RCEnable && p I n p >RCUpdateMode <= MAX RC MODE && p Vid>t y p e ! = B SLICE && p I n p >b a s i c u n i t < p Vid>Fr am eSizeI n Mb s ) p Vid>p r c q u a d >C u r r L a s t Q P = p Vid>AverageFrameQP + p Vid>p r c q u a d >b i t d e p t h q p s c a l e ;

306

307 308 309

# ifdef

LEAKYBUCKET

/ / S t o r e b i t s u s e d f o r t h i s f r a m e and i n c r e m e n t c o u n t e r o f no . o f co d ed frames i f ( ! p Vid>r e d u n d a n t c o d i n g ) { p Vid>B i t B u f f e r [ p Vid> t o t a l f r a m e b u f f e r ++] = ( l o n g ) ( p Vid>p S t a t s > b i t c t r p Vid>p S t a t s > b i t c t r n ) + ( l o n g ) ( p Vid>p S t a t s > b i t c t r f i l l e r d a t a p Vid>p S t a t s > bit ctr filler data n ) ; } # endif

310 311 312

313

314 315 316

142
/ / POC200301 : V e r i f y t h a t POC c o d i n g t y p e 2 i s n o t u s e d i f more t h a n one consecutive
318

317

/ / nonr e f e r e n c e f r a m e i s r e q u e s t e d o r i f d e c o d i n g o r d e r i s d i f f e r e n t fro m o u t p u t o r d e r i f ( p Vid>p i c o r d e r c n t t y p e == 2 ) { i f ( ! p Vid>n a l r e f e r e n c e i d c ) p Vid>c o n s e c u t i v e n o n r e f e r e n c e p i c t u r e s ++; else p Vid>c o n s e c u t i v e n o n r e f e r e n c e p i c t u r e s = 0 ; i f ( p Vid>f r a m e n o < p Vid>p r e v f r a m e n o | | p Vid> c o n s e c u t i v e n o n r e f e r e n c e p i c t u r e s >1) e r r o r ( "POC type 2 cannot be applied for the coding pattern where the encoding / decoding order of pictures are different from the output order .\n" , 1) ; p Vid>p r e v f r a m e n o = p Vid>f r a m e n o ; } g e t t i m e (& e n d t i m e ) ; tmp time tmp time / / end t i m e i n ms

319 320 321 322 323 324 325 326

327

328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354

= t i m e d i f f (& s t a r t t i m e , &e n d t i m e ) ; = tim en o r m ( t m p t i m e ) ; = tim en o r m ( p Vid>m e t i m e ) ;

p Vid>t o t t i m e += t m p t i m e ; p Vid>m e t i m e

i f ( p Vid>p S t a t s > b i t c t r p a r a m e t e r s e t s n ! =0 && p I n p >V e r b o s e ! = 3 ) ReportNALNonVLCBits ( p Vid , t m p t i m e ) ; # i f ( MVC EXTENSION ENABLE) i f ( p Vid>c u r r f r m i d x == 0 && ! p Vid>v i e w i d ) # else i f ( p Vid>c u r r f r m i d x == 0 ) # endif R e p o r t F i r s t f r a m e ( p Vid , t m p t i m e ) ; else { b i t s = u p d a t e v i d e o s t a t s ( p Vid ) ; s w i t c h ( p Vid>t y p e ) { c a s e I SLI CE : c a s e SI SLICE : R e p o r t I ( p Vid , t m p t i m e ) ; break ;

143
c a s e B SLICE : Rep o r tB ( p Vid , t m p t i m e ) ; break ; c a s e SP SLICE : R e p o r t P ( p Vid , t m p t i m e ) ; break ; c a s e P SLICE : default : R e p o r t P ( p Vid , t m p t i m e ) ; } } i f ( p I n p >V e r b o s e == 0 ) { / / f o r ( i = 0 ; i <= ( p V i d >number & 0 x0F ) ; i ++) / / pri ntf (.) ; / / p r i n t f ( } / / Flush output s t a t i s t i c s fflush ( stdout ) ; / / Rate c o n t r o l i f ( p I n p >RCEnable ) p Vid>r c u p d a t e p i c t u r e p t r ( p Vid , p I n p , b i t s ) ; / / update b i t c o u n t e rs u p d a t e b i t c o u n t e r s t a t s ( p Vid ) ; u p d a t e i d r o r d e r s t a t s ( p Vid ) ; return 1; } \ r ) ; p r i n t f ( " Completed Encoding Frame %05d.\r" , p Vid>f r a m e n o ) ;

355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387

144

10 ANEXO B CODIGO FONTE DO DECODIFICADOR DO SOFTWARE DE REFERENCIA - ALTERACOES REALIZADAS

Este anexo cont m o c digo fonte das alteracoes realizadas no decodicador do software e o de refer ncia durante o desenvolvimento do trabalho. Como os fontes dos arquivos modicados e s o muito extensos apenas as partes mais relevantes se encontram neste anexo. a

10.1 ALTERACOES REALIZADAS NO ARQUIVO LDECOD/INC/GLO BAL.H


1 2 3 4 5 6 7 8 9

/ / video parameters typedef struct video par { / * O u t r o s campos * / /* metadata b u f f e r . */ ExtractedMetadataBuffer * metadata buffer ; } VideoParameters ;

10.2 ALTERACOES REALIZADAS NO ARQUIVO LDECOD/SRC/DECO DER TEST.C


1 2 3 4 5 6 7 8 9 10

i n t main ( i n t a r g c , cha r ** a r g v ) { int iRet ; DecodedPicList * pDecPicList ; i n t h F i l e D e c O u t p u t 0=1, h F i l e D e c O u t p u t 1 =1; i n t i F r a m e s O u t p u t =0 , i F r a m e s D e c o d e d = 0 ; InputParameters InputParams ; E x t r a c t e d M e t a d a t a B u f f e r * m e t a d a t a b u f f e r = NULL;

145
# i f DECOUTPUT TEST h F i l e D e c O u t p u t 0 = o p en ( DECOUTPUT VIEW0 FILENAME, OPENFLAGS WRITE , OPEN PERMISSIONS) ;
13 14

11 12

f p r i n t f ( s t d o u t , " Decoder output view0: %s\n" , DECOUTPUT VIEW0 FILENAME) ; h F i l e D e c O u t p u t 1 = o p en ( DECOUTPUT VIEW1 FILENAME, OPENFLAGS WRITE , OPEN PERMISSIONS) ; f p r i n t f ( s t d o u t , " Decoder output view1: %s\n" , DECOUTPUT VIEW1 FILENAME) ; # endif / / get input parameters ; C o n f i g u r e (& I n p u t P a r a m s , a r g c , a r g v ) ; / / o p en d e c o d e r ; /* Create the metadata b u f f e r */ metadata buffer = extracted metadata buffer new () ; i R e t = OpenDecoder (& I n p u t P a r a m s , m e t a d a t a b u f f e r ) ; i f ( i R e t ! = DEC OPEN NOERR ) { f p r i n t f ( s t d e r r , " Open encoder failed: 0x%x!\n" , i R e t ) ; r e t u r n 1; / / f a i l e d ; } / / decoding ; do { i R e t = DecodeOneFrame(& p D e c P i c L i s t ) ; i f ( i R e t ==DEC EOS | | i R e t ==DEC SUCCEED) { / / p ro c e ss t h e decoded p i c t u r e , o u t p u t or d i s p l a y ; i F r a m e s O u t p u t += Wr iteOn eFr am e ( p D e c P i c L i s t , h F i l e D e c O u t p u t 0 , hFileDecOutput1 , 0) ; i F r a m e s D e c o d e d ++; } else { / / error handling ; f p r i n t f ( s t d e r r , " Error in decoding process : 0x%x\n" , i R e t ) ; } } w h i l e ( ( i R e t == DEC SUCCEED) && ( ( p Dec>p I n p >iDecFrmNum ==0) | | ( iFr am esDeco d ed <p Dec>p I n p >iDecFrmNum ) ) ) ;

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

40 41 42 43 44 45 46 47

48 49

i R e t = F i n i t D e c o d e r (& p D e c P i c L i s t ) ;

146

50 51

i F r a m e s O u t p u t += Wr iteOn eFr am e ( p D e c P i c L i s t , h F i l e D e c O u t p u t 0 , hFileDecOutput1 , 1) ; iRet = CloseDecoder ( ) ; / / quit ; i f ( h F i l e D e c O u t p u t 0 >=0) { close ( hFileDecOutput0 ) ; } i f ( h F i l e D e c O u t p u t 1 >=0) { close ( hFileDecOutput1 ) ; } /* f r e e the metadata b u f f e r */ extracted metadata buffer free ( metadata buffer ) ; / / p r i n t f (%d f r a m e s a r e d e c o d e d . \ n , iFra mesDeco d ed ) ; / / p r i n t f (%d f r a m e s a r e d eco d ed , %d f r a m e s o u t p u t . \ n , iFra mesDeco d ed , iFramesOutput ) ; return 0; }

52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

69 70

10.3 ALTERACOES REALIZADAS NO ARQUIVO LDECOD/SRC/OUT PUT.C


1 2

s t a t i c void decoder draw bounding box ( E x t r a c t e d M e t a d a t a * metadata , S t o r a b l e P i c t u r e *p ) { s t a t i c c o n s t i n t BOUNDING BOX BORDER SIZE s t a t i c c o n s t u n s i g n e d cha r BOUNDING BOX U s t a t i c c o n s t u n s i g n e d cha r BOUNDING BOX V = 4; = 0; = 220; s t a t i c c o n s t u n s i g n e d cha r BOUNDING BOX LUMA = 0 ;

3 4 5 6 7 8 9

ExtractedObjectBoundingBox * bounding box = extracted object bounding box from metadata ( metadata ) ; i n t box x i n t box y i nt box width = 0; = 0; = 0;

10 11 12

147
int box height i n t row i f ( ! bounding box ) { return ; } e x t r a c t e d o b j e c t b o u n d i n g b o x g e t d a t a ( b o u n d i n g b o x , NULL, &b o x x , &b o x y , &b o x w i d t h , &b o x h e i g h t ) ;
21 22

13 14 15 16 17 18 19 20

= 0; = 0;

/ * p r i n t f ( d e c o d e r d r a w b o u n d i n g b o x : s i z e x [%d ] , s i z e y [%d ] , s i z e x c r [% d ] , s i z e y c r [%d ] \ n , p>s i z e x , p>s i z e y , p>s i z e x c r , p > s i z e y c r ) ; * /

23

24 25 26 27 28

/ * V a l i d a t e b o u n d i n g box * / i f ( ( b o x x + b o x w i d t h > p>s i z e x ) | | ( b o x y + b o x h e i g h t > p>s i z e y ) ) { p r i n t f ( " decoder_draw_bounding_box: ERROR: bouding box out of the frame !!!\n" ) ; return ; } / * l e t s drawn on t h e luma i n f o r m a t i o n * / / * drawn b o u n d i n g box t o p * / f o r ( row = b o x y ; row < b o x y + BOUNDING BOX BORDER SIZE ; row ++) { memset ( p>imgY [ row ] + b o x x , BOUNDING BOX LUMA, b o x w i d t h ) ; } / * drawn b o u n d i n g box l e f t and r i g h t * / f o r ( row = b o x y + BOUNDING BOX BORDER SIZE ; row <= b o x y + b o x h e i g h t BOUNDING BOX BORDER SIZE ; row ++) { / / p r i n t f ( KMLO row[%d ] \ n , row ) ; memset ( p>imgY [ row ] + b o x x , BOUNDING BOX LUMA, BOUNDING BOX BORDER SIZE ) ; / * l e f t s i d e * / memset ( p>imgY [ row ] + b o x x + b o x w i d t h BOUNDING BOX BORDER SIZE , BOUNDING BOX LUMA, BOUNDING BOX BORDER SIZE ) ; / * r i g h t s i d e * / } / * drawn b o u n d i n g box b o t t o m * / f o r ( row = b o x y + b o x h e i g h t 1 ; row > b o x y + b o x h e i g h t BOUNDING BOX BORDER SIZE ; row) {

29 30 31 32 33 34 35 36 37 38 39 40

41 42

43

44 45 46 47

148
memset ( p>imgY [ row ] + b o x x , BOUNDING BOX LUMA, b o x w i d t h ) ; } i f ( p>imgUV ) { / * l e t s draw on t h e chroma i n f o r m a t i o n * / f l o a t l u m a c h r o m a x r a t i o = p>s i z e x / p>s i z e x c r ; f l o a t l u m a c h r o m a y r a t i o = p>s i z e y / p>s i z e y c r ; / * drawn b o u n d i n g box t o p * / f o r ( row = b o x y / l u m a c h r o m a y r a t i o ; row < ( b o x y + BOUNDING BOX BORDER SIZE ) / l u m a c h r o m a y r a t i o ; row ++) {
59 60

48 49 50 51 52 53 54 55 56 57 58

memset ( p>imgUV [ 0 ] [ row ] + ( i n t ) ( b o x x / l u m a c h r o m a x r a t i o ) , BOUNDING BOX U , b o x w i d t h / l u m a c h r o m a x r a t i o ) ; memset ( p>imgUV [ 1 ] [ row ] + ( i n t ) ( b o x x / l u m a c h r o m a x r a t i o ) , BOUNDING BOX V , b o x w i d t h / l u m a c h r o m a x r a t i o ) ; } i n t c h r o m a s i d e b o r d e r s i z e = BOUNDING BOX BORDER SIZE / luma chroma x ratio ;

61

62 63 64

65 66 67 68

/ * drawn b o u n d i n g box l e f t and r i g h t * / f o r ( row = ( b o x y + BOUNDING BOX BORDER SIZE ) / l u m a c h r o m a y r a t i o ; row <= ( b o x y + b o x h e i g h t BOUNDING BOX BORDER SIZE ) / l u m a c h r o m a y r a t i o ; row ++) {

69 70

memset ( p>imgUV [ 0 ] [ row ] + ( i n t ) ( b o x x / l u m a c h r o m a x r a t i o ) , BOUNDING BOX U , c h r o m a s i d e b o r d e r s i z e ) ; / * l e f t s i d e * / memset ( p>imgUV [ 0 ] [ row ] + ( i n t ) ( ( b o x x + b o x w i d t h BOUNDING BOX BORDER SIZE ) / l u m a c h r o m a x r a t i o ) , BOUNDING BOX U , chroma side border size ) ; /* right side */

71

72

73 74

memset ( p>imgUV [ 1 ] [ row ] + ( i n t ) ( b o x x / l u m a c h r o m a x r a t i o ) , BOUNDING BOX V , c h r o m a s i d e b o r d e r s i z e ) ; / * l e f t s i d e * / memset ( p>imgUV [ 1 ] [ row ] + ( i n t ) ( ( b o x x + b o x w i d t h BOUNDING BOX BORDER SIZE ) / l u m a c h r o m a x r a t i o ) , BOUNDING BOX V , chroma side border size ) ; /* right side */

75

76

77

149

78 79 80 81

/ * drawn b o u n d i n g box b o t t o m * / f o r ( row = ( b o x y + b o x h e i g h t 1 ) / l u m a c h r o m a y r a t i o ; row > ( b o x y + b o x h e i g h t BOUNDING BOX BORDER SIZE ) / l u m a c h r o m a y r a t i o ; row) {

82 83

memset ( p>imgUV [ 0 ] [ row ] + ( i n t ) ( b o x x / l u m a c h r o m a x r a t i o ) , BOUNDING BOX U , b o x w i d t h / l u m a c h r o m a x r a t i o ) ; memset ( p>imgUV [ 1 ] [ row ] + ( i n t ) ( b o x x / l u m a c h r o m a x r a t i o ) , BOUNDING BOX V , b o x w i d t h / l u m a c h r o m a x r a t i o ) ; } } s t a t i c v o i d w r i t e o u t p i c t u r e ( V i d e o P a r a m e t e r s * p Vid , S t o r a b l e P i c t u r e * p , int p out ) { I n p u t P a r a m e t e r s * p I n p = p Vid>p I n p ; D e c o d e d P i c L i s t * p DecPic ; s t a t i c c o n s t i n t SubWidthC [4]= { 1 , 2 , 2 , 1};

84

85 86 87 88 89

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

s t a t i c c o n s t i n t Su b Heig h tC [ 4 ] = { 1 , 2 , 1 , 1 } ; # i f ( MVC EXTENSION ENABLE) cha r o u t V i e w F i l e N a m e [ FILE NAME SIZE ] , ch Bu f [ FILE NAME SIZE ] , * pch ; i n t i V i e w I d x = GetVOIdx ( p Vid , p>v i e w i d ) ; # endif int c r o p l ef t , cr o p r ig h t , crop top , crop bottom ; i n t s y m b o l s i z e i n b y t e s = ( ( p Vid> p i c u n i t b i t s i z e o n d i s k +7 ) >> 3 ) ; B o o l e a n r g b o u t p u t = ( B o o l e a n ) ( p Vid>a c t i v e s p s >v u i s e q p a r a m e t e r s . m a t r i x c o e f f i c i e n t s ==0) ; u n s i g n e d cha r * b u f ; / / i n t i P i c S i z e T a b [4] = {2 , 3 , 4 , 6}; i n t iLu m aSize , i F r a m e S i z e ; i n t iLumaSizeX , iLumaSizeY ; i n t iChromaSizeX , iCh r o m aSizeY ; int ret ; i f ( p>n o n e x i s t i n g ) return ;

105 106 107 108 109 110 111 112 113 114 115

150
/ * T h i s seems t h e b e s t p l a c e t o do some p r o c e s s on t h e d e c o d e d fra me , r i g h t b e f o r e i t i s w r i t t e n on t h e f i l e . * / s t a t i c i n t frameCount = 0 ; / * I s t h i s t h e b e s t way t o g e t t h e f r a m e number ? * / E x t r a c t e d M e t a d a t a * m e t a d a t a = e x t r a c t e d m e t a d a t a b u f f e r g e t ( p Vid> m e t a d a t a b u f f e r , frameCount ) ;
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136

116

117

118

f r a m e C o u n t ++; i f ( metadata ) { / * L e t s p r o c e s s and f r e e t h e m e t a d a t a r e l a t i v e t o t h e c u r r e n t f r a m e * / decoder draw bounding box ( metadata , p ) ; ex tr ac t ed m e t ad a t a f r ee ( metadata ) ; m e t a d a t a = NULL; } / * End o f m e t a d a t a p r o c e s s i n g on t h e d e c o d e d f r a m e . * /

# i f ( ENABLE OUTPUT TONEMAPPING) / / n o t e : t h i s t o n e mapping i s w o r k i n g f o r RGB f o r m a t o n l y . S h a rp i f ( p>s e i H a s T o n e m a p p i n g && r g b o u t p u t ) { / / p r i n t f ( o u t p u t f r a m e %d w i t h t o n e mo d el i d %d \ n , tone mapping model id ) ; p>frame num , p>

137 138 139 140 141 142 143 144 145 146

s y m b o l s i z e i n b y t e s = ( p>t o n e m a p p e d b i t d e p t h >8) ? 2 : 1 ; t o n e m a p ( p>imgY , p>t o n e m a p p i n g l u t , p>s i z e x , p>s i z e y ) ; t o n e m a p ( p>imgUV [ 0 ] , p>t o n e m a p p i n g l u t , p>s i z e x c r , p>s i z e y c r ) ; t o n e m a p ( p>imgUV [ 1 ] , p>t o n e m a p p i n g l u t , p>s i z e x c r , p>s i z e y c r ) ; } # endif i f ( p>f r a m e c r o p p i n g f l a g ) { crop left = SubWidthC [ p>c h r o m a f o r m a t i d c ] * p> frame cropping rect left offset ;

147

crop right crop top

= SubWidthC [ p>c h r o m a f o r m a t i d c ] * p> frame cropping rect right offset ; = Su b Heig h tC [ p>c h r o m a f o r m a t i d c ] * ( 2 p>

148

149

f r a m e m b s o n l y f l a g ) * p>f r a m e c r o p p i n g r e c t t o p o f f s e t ; c r o p b o t t o m = Su b Heig h tC [ p>c h r o m a f o r m a t i d c ] * ( 2 p> f r a m e m b s o n l y f l a g ) * p>f r a m e c r o p p i n g r e c t b o t t o m o f f s e t ; }

150

151
else { c r o p l e f t = cr o p r i g h t = crop top = crop bottom = 0; } iCh r o m aSizeX = p>s i z e x c r p> f r a m e c r o p p i n g r e c t l e f t o f f s e t p> frame cropping rect right offset ;
156

151 152 153 154 155

iCh r o m aSizeY = p>s i z e y c r ( 2 p>f r a m e m b s o n l y f l a g ) * p> f r a m e c r o p p i n g r e c t t o p o f f s e t ( 2 p>f r a m e m b s o n l y f l a g ) * p> frame cropping rect bottom offset ; iLumaSizeX = p>s i z e x c r o p l e f t c r o p r i g h t ; iLumaSizeY = p>s i z e y c r o p t o p c r o p b o t t o m ; i L u m a S i z e = iLumaSizeX * iLumaSizeY * s y m b o l s i z e i n b y t e s ; i F r a m e S i z e = ( iLumaSizeX * iLumaSizeY + 2 * ( iCh r o m aSizeX * iCh r o m aSizeY ) ) * s y m b o l s i z e i n b y t e s ; / / i L u m a S i z e * i P i c S i z e T a b [ p>c h r o m a f o r m a t i d c ] / 2 ;

157 158 159 160

161 162

/ / p r i n t f ( w r i t e f r a m e s i z e : %dx%d \ n , p>s i z e x c r o p l e f t c r o p r i g h t , p> s i z e y c r o p t o p c r o p b o t t o m ) ; i n i t O u t p u t ( p Vid , s y m b o l s i z e i n b y t e s ) ; / / KS : t h i s b u f f e r s h o u l d a c t u a l l y be a l l o c a t e d o n l y once , b u t t h i s i s s t i l l much f a s t e r t h a n t h e p r e v i o u s v e r s i o n p DecPic = G e t O n e A v a i l D e c P i c F r o m L i s t ( p Vid>p DecOu p u tPic , 0 ) ; i f ( pDecPic >pY == NULL) { pDecPic >pY = m a l l o c ( i F r a m e S i z e ) ; pDecPic >pU = pDecPic >pY+ i L u m a S i z e ; pDecPic >pV = pDecPic >pU + ( ( i F r a m e S i z e i L u m a S i z e ) >>1) ; // init ; pDecPic >iYUVFormat = p>c h r o m a f o r m a t i d c ; pDecPic >iYUVSto r ag eFo r m at = 0 ; pDecPic >i B i t D e p t h = p Vid> p i c u n i t b i t s i z e o n d i s k ; pDecPic >i W i d t h = iLumaSizeX ; / / p> s i z e x ; pDecPic >i H e i g h t = iLumaSizeY ; / / p> s i z e y ; pDecPic >i Y B u f S t r i d e = iLumaSizeX * s y m b o l s i z e i n b y t e s ; / / p>s i z e x * symbol size in bytes ; pDecPic >i U V B u f S t r i d e = iCh r o m aSizeX * s y m b o l s i z e i n b y t e s ; / / p> size x cr * symbol size in bytes ; } # i f ( MVC EXTENSION ENABLE) { pDecPic >b V a l i d = 1 ;

163 164 165

166 167 168 169 170 171 172 173 174 175 176 177 178 179

180

181 182 183 184 185

152
pDecPic >i V i e w I d = p>v i e w i d >=0 ? p>v i e w i d : 1; } # else pDecPic >b V a l i d = 1 ; # endif pDecPic >iPOC = p>f r a m e p o c ; / / b u f = pDecPic>pY ; / / m a l l o c ( p>s i z e x * p>s i z e y * s y m b o l s i z e i n b y t e s ) ; i f (NULL== pDecPic >pY ) { n o m e m e x i t ( " write_out_picture: buf" ) ; } # i f ( MVC EXTENSION ENABLE) i f ( p>v i e w i d >= 0 && p I n p >D e c o d e A l l L a y e r s == 1 ) { i f ( ( p Vid>p o u t m v c [ i V i e w I d x ] == 1) && ( s t r c a s e c m p ( p I n p >o u t f i l e , " \"\"" ) ! = 0 ) && ( s t r l e n ( p I n p > o u t f i l e ) >0) )
203 204 205 206 207 208 209 210 211 212

186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202

{ s t r c p y ( chBuf , p I n p > o u t f i l e ) ; pch = s t r r c h r ( chBuf , . ) ; i f ( pch ) * pch = \0 ; i f ( s t r c m p ( "nul" , ch Bu f ) ) { s p r i n t f ( o u t V i e w F i l e N a m e , "% s_ViewId%04d.yuv" , chBuf , p>v i e w i d ) ; i f ( ( p Vid>p o u t m v c [ i V i e w I d x ] = o p en ( o u t V i e w F i l e N a m e , OPENFLAGS WRITE , OPEN PERMISSIONS) ) ==1) { s n p r i n t f ( e r r o r t e x t , ET SIZE , "Error open file %s " , out ViewFileName ) ; f p r i n t f ( s t d e r r , "%s\n" , e r r o r t e x t ) ; exit (500) ; } } else { p Vid>p o u t m v c [ i V i e w I d x ] = 1; } } p o u t = p Vid>p o u t m v c [ i V i e w I d x ] ; }

213 214

215 216 217 218 219 220 221 222 223 224 225

153
else { / / Normal AVC i f ( ( p Vid>p o u t m v c [ 0 ] == 1) && ( s t r c a s e c m p ( p I n p >o u t f i l e , " \"\"" ) ! = 0 ) && ( s t r l e n ( p I n p > o u t f i l e ) >0) )
229 230

226 227 228

{ i f ( ( s t r c a s e c m p ( p I n p >o u t f i l e , "\"\"" ) ! = 0 ) && ( ( p Vid>p o u t m v c [ 0 ] = o p en ( p I n p >o u t f i l e , OPENFLAGS WRITE , OPEN PERMISSIONS) ) ==1) ) { s n p r i n t f ( e r r o r t e x t , ET SIZE , " Error open file %s " , p I n p > o u t f i l e ) ; / / error ( errortext ,500) ; f p r i n t f ( s t d e r r , "%s\n" , e r r o r t e x t ) ; exit (500) ; } } p o u t = p Vid>p o u t m v c [ 0 ] ; } # endif if ( rgb output ) { b u f = m a l l o c ( p>s i z e x * p>s i z e y * s y m b o l s i z e i n b y t e s ) ; crop left crop right crop top = p> f r a m e c r o p p i n g r e c t l e f t o f f s e t ; = p>f r a m e c r o p p i n g r e c t r i g h t o f f s e t ;

231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247

= ( 2 p>f r a m e m b s o n l y f l a g ) * p> frame cropping rect top offset ;

248

c r o p b o t t o m = ( 2 p>f r a m e m b s o n l y f l a g ) * p> frame cropping rect bottom offset ; p Vid>im g 2 b u f ( p>imgUV [ 1 ] , b u f , p>s i z e x c r , p>s i z e y c r , sy m b o l si z e i n b y t e s , c r o p l e f t , c r o p r i g h t , crop top , crop bottom , pDecPic >i Y B u f S t r i d e ) ; i f ( p o u t >= 0 ) { r e t = w r i t e ( p o u t , b u f , ( p>s i z e y c r c r o p b o t t o m c r o p t o p ) * ( p> s i z e x c r c r o p r i g h t c r o p l e f t ) * s y m b o l s i z e i n b y t e s ) ; i f ( r e t ! = ( ( p>s i z e y c r c r o p b o t t o m c r o p t o p ) * ( p>s i z e x c r c r o p r i g h t c r o p l e f t ) * s y m b o l s i z e i n b y t e s ) ) { e r r o r ( " write_out_picture: error writing to RGB file" , 5 0 0 ) ; } } i f ( p>f r a m e c r o p p i n g f l a g )

249 250

251 252 253

254

255 256 257 258 259 260

154
{ crop left = SubWidthC [ p>c h r o m a f o r m a t i d c ] * p> frame cropping rect left offset ;

261 262

263

crop right crop top

= SubWidthC [ p>c h r o m a f o r m a t i d c ] * p> frame cropping rect right offset ; = Su b Heig h tC [ p>c h r o m a f o r m a t i d c ] * ( 2 p>

264

265

f r a m e m b s o n l y f l a g ) * p>f r a m e c r o p p i n g r e c t t o p o f f s e t ; c r o p b o t t o m = Su b Heig h tC [ p>c h r o m a f o r m a t i d c ] * ( 2 p> f r a m e m b s o n l y f l a g ) * p>f r a m e c r o p p i n g r e c t b o t t o m o f f s e t ; } else { c r o p l e f t = c r o p r i g h t = crop top = crop bottom = 0; } i f ( buf ) fr e e ( buf ) ; } b u f = ( pDecPic >b V a l i d ==1) ? pDecPic >pY : pDecPic >pY+ iLumaSizeX * symbol size in bytes ;

266 267 268 269 270 271 272 273 274 275

276 277

p Vid>im g 2 b u f ( p>imgY , b u f , p>s i z e x , p>s i z e y , sy m b o l si z e i n b y t e s , c r o p l e f t , c r o p r i g h t , crop top , crop bottom , pDecPic >i Y B u f S t r i d e ) ;

278 279 280 281

i f ( p o u t >=0) { r e t = w r i t e ( p o u t , b u f , ( p>s i z e y c r o p b o t t o m c r o p t o p ) * ( p>s i z e x c r o p r i g h t c r o p l e f t ) * s y m b o l s i z e i n b y t e s ) ; i f ( r e t ! = ( ( p>s i z e y c r o p b o t t o m c r o p t o p ) * ( p>s i z e x c r o p r i g h t crop left )* symbol size in bytes ) ) { e r r o r ( " write_out_picture: error writing to YUV file" , 5 0 0 ) ; } } i f ( p>c h r o m a f o r m a t i d c ! =YUV400 ) { crop left crop right crop top = p> f r a m e c r o p p i n g r e c t l e f t o f f s e t ; = p>f r a m e c r o p p i n g r e c t r i g h t o f f s e t ;

282

283 284 285 286 287 288 289 290 291 292

= ( 2 p>f r a m e m b s o n l y f l a g ) * p> frame cropping rect top offset ;

155
c r o p b o t t o m = ( 2 p>f r a m e m b s o n l y f l a g ) * p> frame cropping rect bottom offset ; b u f = ( pDecPic >b V a l i d ==1) ? pDecPic >pU : pDecPic >pU + iCh r o m aSizeX * symbol size in bytes ;
295 296

293

294

p Vid>im g 2 b u f ( p>imgUV [ 0 ] , b u f , p>s i z e x c r , p>s i z e y c r , sy m b o l si z e i n b y t e s , c r o p l e f t , c r o p r i g h t , crop top , crop bottom , pDecPic >i U V B u f S t r i d e ) ; i f ( p o u t >= 0 ) { r e t = w r i t e ( p o u t , b u f , ( p>s i z e y c r c r o p b o t t o m c r o p t o p ) * ( p> s i z e x c r c r o p r i g h t c r o p l e f t ) * s y m b o l s i z e i n b y t e s ) ; i f ( r e t ! = ( ( p>s i z e y c r c r o p b o t t o m c r o p t o p ) * ( p>s i z e x c r c r o p r i g h t c r o p l e f t ) * s y m b o l s i z e i n b y t e s ) ) { e r r o r ( " write_out_picture: error writing to YUV file" , 5 0 0 ) ; } } i f (! rgb output ) { b u f = ( pDecPic >b V a l i d ==1) ? pDecPic >pV : pDecPic >pV + iCh r o m aSizeX * symbol size in bytes ; p Vid>im g 2 b u f ( p>imgUV [ 1 ] , b u f , p>s i z e x c r , p>s i z e y c r , sy m b o l si z e i n b y t e s , c r o p l e f t , c r o p r i g h t , crop top , crop bottom , pDecPic >i U V B u f S t r i d e ) ;

297 298 299

300

301 302 303 304 305 306 307 308

309

310 311 312 313

i f ( p o u t >= 0 ) { r e t = w r i t e ( p o u t , b u f , ( p>s i z e y c r c r o p b o t t o m c r o p t o p ) * ( p> s i z e x c r c r o p r i g h t c r o p l e f t ) * s y m b o l s i z e i n b y t e s ) ; i f ( r e t ! = ( ( p>s i z e y c r c r o p b o t t o m c r o p t o p ) * ( p>s i z e x c r c r o p r i g h t c r o p l e f t ) * s y m b o l s i z e i n b y t e s ) ) { e r r o r ( " write_out_picture: error writing to YUV file" , 5 0 0 ) ; } } } } else { i f ( p I n p >w r i t e u v ) {

314

315 316 317 318 319 320 321 322 323 324

156
int i , j ; i m g p e l c r v a l = ( i m g p e l ) (1<<( p Vid>b i t d e p t h l u m a 1 ) ) ; get mem3Dpel (&( p>imgUV ) , 1 , p>s i z e y / 2 , p>s i z e x / 2 ) ; f o r ( j = 0 ; j <p>s i z e y / 2 ; j ++) { f o r ( i = 0 ; i <p>s i z e x / 2 ; i ++) { p>imgUV [ 0 ] [ j ] [ i ] = c r v a l ; } } / / f a k e o u t U=V=128 t o make a YUV 4 : 2 : 0 s t r e a m b u f = m a l l o c ( p>s i z e x * p>s i z e y * s y m b o l s i z e i n b y t e s ) ; p Vid>im g 2 b u f ( p>imgUV [ 0 ] , b u f , p>s i z e x / 2 , p>s i z e y / 2 , symbol size in bytes , crop left /2 , crop right /2 , crop top /2 , c r o p b o t t o m / 2 , pDecPic >i Y B u f S t r i d e / 2 ) ;
341 342

325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340

r e t = w r i t e ( p o u t , b u f , s y m b o l s i z e i n b y t e s * ( p>s i z e y c r o p b o t t o m c r o p t o p ) / 2 * ( p>s i z e x c r o p r i g h t c r o p l e f t ) / 2 ) ; i f ( r e t ! = ( s y m b o l s i z e i n b y t e s * ( p>s i z e y c r o p b o t t o m c r o p t o p ) / 2 * ( p>s i z e x c r o p r i g h t c r o p l e f t ) / 2 ) ) { e r r o r ( " write_out_picture: error writing to YUV file" , 5 0 0 ) ; } r e t = w r i t e ( p o u t , b u f , s y m b o l s i z e i n b y t e s * ( p>s i z e y c r o p b o t t o m c r o p t o p ) / 2 * ( p>s i z e x c r o p r i g h t c r o p l e f t ) / 2 ) ; i f ( r e t ! = ( s y m b o l s i z e i n b y t e s * ( p>s i z e y c r o p b o t t o m c r o p t o p ) / 2 * ( p>s i z e x c r o p r i g h t c r o p l e f t ) / 2 ) ) { e r r o r ( " write_out_picture: error writing to YUV file" , 5 0 0 ) ; } fr e e ( buf ) ; f r e e m e m 3 D p e l ( p>imgUV ) ; p>imgUV=NULL; } } / / free ( buf ) ; // } fsync ( p out ) ;

343

344 345 346 347

348

349 350 351 352 353 354 355 356 357 358 359 360 361

157

362 363

10.4 ALTERACOES REALIZADAS NO ARQUIVO LDECOD/SRC/SEI.C


1 2

v o i d I n t e r p r e t S E I M e s s a g e ( b y t e * msg , i n t s i z e , V i d e o P a r a m e t e r s * p Vid , S l i c e *pSlice ) { int payload type = 0; int payload size = 0; int of fset = 1; byte tmp byte ; do { / / sei message ( ) ; payload type = 0; t m p b y t e = msg [ o f f s e t + + ] ; w h i l e ( t m p b y t e == 0xFF ) { p a y l o a d t y p e += 2 5 5 ; t m p b y t e = msg [ o f f s e t + + ] ; } p a y l o a d t y p e += t m p b y t e ; payload size = 0; t m p b y t e = msg [ o f f s e t + + ] ; w h i l e ( t m p b y t e == 0xFF ) { p a y l o a d s i z e += 2 5 5 ; t m p b y t e = msg [ o f f s e t + + ] ; } p a y l o a d s i z e += t m p b y t e ; switch ( payload type ) { case SEI BUFFERING PERIOD : i n t e r p r e t b u f f e r i n g p e r i o d i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI PIC TIMING : i n t e r p r e t p i c t u r e t i m i n g i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; // t hi s is the l as t byte // t hi s is the l as t byte

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

/ / se i p a y l o a d ( type , s i z e ) ;

158
break ; case SEI PAN SCAN RECT : i n t e r p r e t p a n s c a n r e c t i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI FILLER PAYLOAD : i n t e r p r e t f i l l e r p a y l o a d i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI USER DATA REGISTERED ITU T T35 : p a y l o a d s i z e , p Vid ) ;
46 47 48 49 50 51 52 53 54

37 38 39 40 41 42 43 44 45

i n t e r p r e t u s e r d a t a r e g i s t e r e d i t u t t 3 5 i n f o ( msg+ o f f s e t , break ; case { /* Receive the s e r i a l i z e d metadata */ = NULL; byte * s e r i a l i ze d m e t a d a t a int serialized m etadata size = 0; u s e r d a t a p a r s e r u n r e g i s t e r e d s e i g e t d a t a ( msg+ o f f s e t , p a y l o a d s i z e , &s e r i a l i z e d m e t a d a t a , & serialized metadata size ); SEI USER DATA UNREGISTERED :

55 56

e x t r a c t e d m e t a d a t a b u f f e r a d d ( p Vid>m e t a d a t a b u f f e r , e x t r a c t e d m e t a d a t a d e s e r i a l i z e ( ( c o n s t cha r * ) s e r i a l i z e d m e t a d a t a , serialized metadata size ) ) ;

57 58 59 60 61 62 63 64 65

/ * Ended r e c e i v i n g t h e s e r i a l i z e d m e t a d a t a * / break ; } case SEI RECOVERY POINT : i n t e r p r e t r e c o v e r y p o i n t i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI DEC REF PIC MARKING REPETITION : p a y l o a d s i z e , p Vid , p S l i c e ) ; i n t e r p r e t d e c r e f p i c m a r k i n g r e p e t i t i o n i n f o ( msg+ o f f s e t , break ; case SEI SPARE PIC : i n t e r p r e t s p a r e p i c ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI SCENE INFO : i n t e r p r e t s c e n e i n f o r m a t i o n ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI SUB SEQ INFO :

66 67 68 69 70 71 72 73

159
i n t e r p r e t s u b s e q u e n c e i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI SUB SEQ LAYER CHARACTERISTICS : p a y l o a d s i z e , p Vid ) ;
78 79 80

74 75 76 77

i n t e r p r e t s u b s e q u e n c e l a y e r c h a r a c t e r i s t i c s i n f o ( msg+ o f f s e t , break ; case SEI SUB SEQ CHARACTERISTICS : p Vid ) ; i n t e r p r e t s u b s e q u e n c e c h a r a c t e r i s t i c s i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ; case SEI FULL FRAME FREEZE : i n t e r p r e t f u l l f r a m e f r e e z e i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI FULL FRAME FREEZE RELEASE : p Vid ) ; i n t e r p r e t f u l l f r a m e f r e e z e r e l e a s e i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ; case SEI FULL FRAME SNAPSHOT : ; i n t e r p r e t f u l l f r a m e s n a p s h o t i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) break ; case SEI PROGRESSIVE REFINEMENT SEGMENT START : , p Vid ) ; i n t e r p r e t p r o g r e s s i v e r e f i n e m e n t s t a r t i n f o ( msg+ o f f s e t , p a y l o a d s i z e break ; case SEI PROGRESSIVE REFINEMENT SEGMENT END : p Vid ) ; i n t e r p r e t p r o g r e s s i v e r e f i n e m e n t e n d i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ; case SEI MOTION CONSTRAINED SLICE GROUP SET : p a y l o a d s i z e , p Vid ) ; i n t e r p r e t m o t i o n c o n s t r a i n e d s l i c e g r o u p s e t i n f o ( msg+ o f f s e t , case SEI FILM GRAIN CHARACTERISTICS : p Vid ) ;

81 82 83 84 85 86

87 88 89

90 91 92

93 94 95

96 97 98

99 100

i n t e r p r e t f i l m g r a i n c h a r a c t e r i s t i c s i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ; case SEI DEBLOCKING FILTER DISPLAY PREFERENCE : p a y l o a d s i z e , p Vid ) ; i n t e r p r e t d e b l o c k i n g f i l t e r d i s p l a y p r e f e r e n c e i n f o ( msg+ o f f s e t , break ; case SEI STEREO VIDEO INFO : i n t e r p r e t s t e r e o v i d e o i n f o i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ;

101 102 103

104 105 106 107

160
case SEI TONE MAPPING :

108 109 110 111 112 113 114 115

i n t e r p r e t t o n e m a p p i n g ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI POST FILTER HINTS : i n t e r p r e t p o s t f i l t e r h i n t s i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; case SEI FRAME PACKING ARRANGEMENT : p Vid ) ; i n t e r p r e t f r a m e p a c k i n g a r r a n g e m e n t i n f o ( msg+ o f f s e t , p a y l o a d s i z e , break ; default : i n t e r p r e t r e s e r v e d i n f o ( msg+ o f f s e t , p a y l o a d s i z e , p V i d ) ; break ; } o f f s e t += p a y l o a d s i z e ; } w h i l e ( msg [ o f f s e t ] ! = 0 x80 ) ; x80 / / more rbsp data ( ) msg [ o f f s e t ] != 0

116 117 118 119 120 121 122 123

124 125 126 127

/ / ignore the t r a i l i n g b i t s r b s p t r a i l i n g b i t s ( ) ; a s s e r t ( msg [ o f f s e t ] == 0 x80 ) ; a s s e r t ( o f f s e t +1 == s i z e ) ; } / / t h is is the t r a i l i n g b i t s

161

11 ANEXO C CODIGO FONTE DO MODULO COMMON DO SOFTWARE DE REFERENCIA - ARQUIVOS MODIFICADOS

Este anexo cont m o c digo fonte das alteracoes realizadas no m dulo lcommon do softe o o ware de refer ncia durante o desenvolvimento do trabalho. e

11.1 ALTERACOES REALIZADAS NO ARQUIVO LCOMMON/INC/PA RAMS.H


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

/* ! * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * \ f i l e params . h * * \ brief Input parameters re l a t e d d e f i n i t i o n s * * * \ author * * * * * * * * * * * * * * * * * * * * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * * ** * ** * ** * */ # ifndef # define PARAMS H PARAMS H

# i n c l u d e " defines .h" # i n c l u d e " types.h" # i n c l u d e " vui_params.h" # i n c l u d e " frame.h" # i n c l u d e " io_video.h" / / ! a l l input parameters struct inp par enc {

162
int ProfileIDC ; profile idc
27

26

/ / !< v a l u e o f s y n t a x e l e m e n t / / !< v a l u e o f s y n t a x e l e m e n t / / !< E n a b l e I n t r a p r o f i l e s / / !< number o f f r a m e s t o be e n c o d e d / / !< QP v a l u e s f o r a l l s l i c e t y p e s / / !< f r a m e i n d i s p l a y o r d e r fro m / / !< Change QP o f f s e t v a l u e s f o r / / !< QPSP q u a n t i z a t i o n v a l u e / / !< number o f f r a m e s t o s k i p i n / * !< number o f f r a m e s t o s k i p i n ( e . g 2 t a k e s frame 0 , 3 , 6 , 9 . . . )

i n t LevelIDC ; level idc int Int ra Prof il e ; int no frames ; i n t qp [ NUM SLICE TYPES ] ; i n t qp2frame ; i n t q p 2 o f f [ NUM SLICE TYPES ] ; all sli ce types i n t q p sp ; int frame skip ; i n t jumpd ;

28 29 30 31 32

wh ich t o a p p l y t h e Change QP o f f s e t s
33

34 35

i n p u t sequence ( e . g 2 t a k e s frame 0 , 3 , 6 , 9 . . . )
36

i n p u t sequence i n c l u d i n g i n t e r m e d i a t e p i c t u r e s
37

38

i n t D i s a b l e S u b p e l ME ; estimation int search range ; s e a r c h and 16 x16 b l o c k s .

*/ / / !< D i s a b l e subp i x e l m o t i o n / * !< s e a r c h r a n g e i n t e g e r p e l The s e a r c h window i s g e n e r a l l y a ro u n d t h e p r e d i c t e d v e c t o r . Max v e c t o r i s 2 */ / / !< number o f r e f e r e n c e f r a m e s t o / / !< number o f r e f e r e n c e p i c t u r e i n / / !< number o f r e f e r e n c e p i c t u r e i n / / !< number o f r e f e r e n c e p i c t u r e i n / / !< v a l u e o f s y n t a x e l e m e n t / / !< v a l u e o f s y n t a x e l e m e n t xmcra n g e .

39

40

41

int num ref frames ; be u s e d int P List0 refs ; l i s t 0 in P pictures int B List0 refs ; l i s t 0 in B pictures int B List1 refs ; l i s t 1 in B pictures i n t Log2MaxFNumMinus4 ; log2 max frame num i n t Log2MaxPOCLsbMinus4 ; log2 max pic order cnt lsb minus4

42

43

44

45

46

47 48 49 50 51

/ / Input / output sequence format r e l a t e d v a r i a b l e s Fr am eFo r m at s o u r c e ; Fr am eFo r m at o u t p u t ; int is interleaved ; / / !< s o u r c e r e l a t e d i n f o r m a t i o n / / !< o u t p u t r e l a t e d i n f o r m a t i o n

163
int src resi ze ; int src BitDepthRescale ; b i t d e p t h s h o u l d be a d j u s t e d
54

52

/ / !< C o n t r o l i f i n p u t s e q u e n c e w i l l / / !< C o n t r o l i f i n p u t s e q u e n c e / / !< YUV f o r m a t ( 0 = 4 : 0 : 0 , 1 = 4 : 2 : 0 , / * !< For e r r o r r o b u s t n e s s . 0 : no a s r e g u l a r u p d a t e . 2 : One GOB e v e r y 2 f r a m e s i s i n t r a co d ed e t c . In connection with t h i s i n t r a update , r e s t r i c t i o n s i s put on m o t i o n v e c t o r s to prevent errors to propagate fro m t h e p a s t */

be r e s i z e d ( c u r r e n t l y o n l y c r o p p i n g i s s u p p o r t e d )
53

int yuv format ; 2=4:2:2 , 3=4:4:4) int intra upd ;

55

s p e c i a l a c t i o n . 1 : One GOB/ f r a m e i s i n t r a co d ed
56

57

58

59 60

int slice mode ; for setting sli ces int slice argument ; s l i c e algorithm int UseConstrainedIntraPred ; int int int SetFirstAsLongTerm ; c o n s i d e r a t i o n s f o r CB p l u s e n c o d i n g infile header ; t h i s to the len g th of the header MultiSourceData ; input file2 ; input file3 ;

/ / !< I n d i c a t e wh a t a l g o r i t h m t o u s e / / !< Arg u men t t o t h e s p e c i f i e d / / !< 0 : I n t e r MB p i x e l s a r e a l l o w e d / / !< S u p p o r t f o r t e m p o r a l / / !< I f i n p u t f i l e h a s a h e a d e r s e t

61

62

f o r i n t r a p r e d i c t i o n 1 : Not a l l o w e d
63

64

65 66 67 68 69

VideoDataFile VideoDataFile

/ / !< I n p u t v i d e o f i l e 2 / / !< I n p u t v i d e o f i l e 3 / / !< number o f v i e w s t o e n c o d e (1=1 / / !< R e o r d e r R e f e r e n c e s a c c o r d i n g / / !< R e v e r s e t h e o r d e r o f t h e v i e w s / / !< Fo rce B s l i c e s f o r e n h a n c e m e n t / / !< QP o f f s e t d u r i n g r a t e c o n t r o l

# i f ( MVC EXTENSION ENABLE) i nt num of views ; view , 2=2 v i e w s ) i n t MVCI n ter ViewReo rder ; to interview pictures i n t MVCFlipViews ; i n t MVCInterViewForceB ; layer i n t View1 QPOf f set ; f o r View 1

70

71

i n t h e b i t s t r e a m ( v i e w 1 h a s VOIdx 0 and v i e w 1 h a s VOIdx 0 )


72

73

164
int enable inter view flag ; # endif VideoDataFile cha r o u t f i l e bitstream
79

74

/ / !< E n a b l e s i n t e r v i e w f l a g (

a l l o w s p i c t u r e s t h a t a r e t o be u s e d f o r i n t e r v i e w o n l y p r e d i c t i o n )
75 76 77 78

input file1 ; [ FILE NAME SIZE ] ; [ FILE NAME SIZE ] ; [ FILE NAME SIZE ] ;

/ / !< I n p u t v i d e o f i l e 1 / / !< H. 2 6 4 c o m p r e s s e d o u t p u t / / !< R e c o n s t r u c t e d P i c t u r e s ( v i e w 0 / / !< R e c o n s t r u c t e d P i c t u r e s ( v i e w

cha r R e c o n F i l e cha r R e c o n F i l e 2 1)

f o r MVC p r o f i l e )
80

81 82 83 84 85 86 87

cha r T r a c e F i l e cha r S t a t s F i l e cha r Q m a t r i x F i l e int int int int ProcessInput ; EnableOpenGOP ; EnableIDRGOP ;

[ FILE NAME SIZE ] ; [ FILE NAME SIZE ] ; [ FILE NAME SIZE ] ;

/ / !< T r a c e O u t p u t s / / !< S t a t s F i l e / / !< Q m a t r i x c f g f i l e / / !< F i l t e r I n p u t S e q u e n c e / / !< s u p p o r t f o r o p en g o p s . / / !< s u p p o r t f o r IDR c l o s e d g o p s / / !< e n c o d e i n g r a y s c a l e ( C u r r e n t l y

w i t h no s h a r e d B co d ed p i c t u r e s .
88

grayscale ; o n l y wo rks f o r 8 b i t , YUV 4 2 0 )

89 90 91 92 93 94

int idr period ; int intra period ; int intra delay ; int adaptive idr period ; int adaptive intra period ; period

/ / !< IDR p i c t u r e p e r i o d / / !< i n t r a p i c t u r e p e r i o d / / !< IDR p i c t u r e d e l a y / / !< r e i n i t i a l i z e st ar t of intra

95 96

int start frame ; Frame s t a r t f r a m e

/ / !< Encode s e q u e n c e s t a r t i n g fro m

97 98 99 100 101 102 103 104 105 106 107

int enable 32 pulldown ; int GenerateMultiplePPS ; i n t GenerateSEIMessage ; cha r S E I M e s s a g e T e x t [ INPUT TEXT SIZE ] ; i n t ResendSPS ; i n t ResendPPS ; i n t SendAUD ; NALU / / !< s e n d A c c e s s U n i t D e l i m i t e r

165
int s ki p g l s t a t s ; // B pictures i n t NumberBFrames ; be u s e d
112 113

108 109 110 111

/ / !< number o f B f r a m e s t h a t w i l l

int PReplaceBSlice ; i n t q p BRSOf f set ; pictures int direct spatial mv pred flag ; ( 0 : Temp o ra l , 1 : S p a t i a l ) int directInferenceFlag ; int BiPredMotionEstimation ; estimation int BiPredSearch [ 4 ] ; i n t B i P r e d M E R e f i n e m en t s ; Bip r e d i c t i v e m o t i o n e s t i m a t i o n i n t BiPr ed MESear ch Range ; motion e s t i m a t i o n i n t BiPredMESubPel ; Bi p r e d i c t i v e m o t i o n e s t i m a t i o n / / !< QP f o r r e f e r e n c e B s l i c e co d ed / / !< D i r e c t Mode t y p e t o be u s e d / / !< D i r e c t Mode I n f e r e n c e Fla g / / !< Use o f B i p r e d i c t i v e m o t i o n / / !< B i p r e d i c t i v e m o t i o n e s t i m a t i o n / / !< Max number o f I t e r a t i o n s f o r / / !< S e a r c h r a n g e o f Bip r e d i c t i v e / / !< Use o f s u b p i x e l r e f i n e m e n t f o r

114

115 116 117

118

f o r modes 16 x16 , 16 x8 , 8 x16 , and 8 x8


119

120

121

122 123 124 125

/ / SP / S I P i c t u r e s int sp periodicity ; int sp switch period ; int si frame indicator ; int sp2 frame indicator ; u sed , 1 : u s e d ) / / !< The p e r i o d i c i t y o f SPp i c t u r e s / / !< S w i t c h p e r i o d ( i n t e r m s o f / / !< Fla g i n d i c a t i n g w h e t h e r S I / / !< Fla g i n d i c a t i n g w h e t h e r

s w i t c h i n g SP / S I f r a m e s ) b e t w e e n b i t s t r e a m 1 and b i t s t r e a m 2
126

f r a m e s s h o u l d be e n c o d e d r a t h e r t h a n SP f r a m e s ( 0 : n o t u sed , 1 : u s e d )
127

s w i t c h i n g SP f r a m e s s h o u l d be e n c o d e d r a t h e r t h a n SP f r a m e s ( 0 : n o t int sp output indicator ; ( 0 : n o t u sed , 1 : u s e d )


129

128

/ / !< Fla g i n d i c a t i n g w h e t h e r

c o e f f i c i e n t s a r e o u t p u t t o a l l o w f u t u r e e n c o d i n g o f s w i t c h i n SP f r a m e s cha r s p o u t p u t f i l e n a m e [ FILE NAME SIZE ] ; c o e f f i c i e n t s are output


130

/ / !< F i l e n a m e wh ere SP / / !< F i l e n a m e o f c o e f f i c i e n t s / / !< F i l e n a m e s o f c o e f f i c i e n t s

cha r s p 2 i n p u t f i l e n a m e 1 [ FILE NAME SIZE ] ; cha r s p 2 i n p u t f i l e n a m e 2 [ FILE NAME SIZE ] ;

o f t h e f i r s t b i t s t r e a m when e n c o d i n g SP f r a m e s t o s w i t c h b i t s t r e a m s
131

o f t h e s e c o n d b i t s t r e a m when e n c o d i n g SP f r a m e s t o s w i t c h b i t s t r e a m s
132 133

/ / Weighted P r e d i c t i o n

166
int WeightedPrediction ; f r a m e s ( 0 : n o t u sed , 1 : e x p l i c i t )
135

134

/ / !< W e i g h t e d p r e d i c t i o n f o r P / / !< W e i g h t e d p r e d i c t i o n f o r B / / !< WP meth o d ( 0 : DC, 1 : LMS ) / / !< I t e r a t i v e WP meth o d

int WeightedBiprediction ; i n t WPMethod ; i n t WPIterMC ; i n t WPMCPrecision ; i n t WPMCPrecFullRef ; i n t WPMCPrecBSlice ; i n t EnhancedBWeightSupport ; i n t ChromaWeightSupport ; chroma ( 0 : d i s a b l e d , 1 : e n a b l e d ) i n t UseWeig h ted Ref er en ceME ; int RDPictureDecision ; i n t RDPSliceBTest ; int RDPSliceITest ; int RDPictureMaxPassISlice ; slice i n t RDPictureMaxPassPSlice ; slice i n t RDPictureMaxPassBSlice ; slice i n t RDPictureDeblocking ; i n t RDPictureDirectMode ; mode f o r B s l i c e s i n t RDPictureFrameQPPSlice ; l e v e l QP v a l u e s f o r P s l i c e s i n t RDPictureFrameQPBSlice ; l e v e l QP v a l u e s f o r B s l i c e s

f r a m e s ( 0 : n o t u sed , 1 : e x p l i c i t , 2 : i m p l i c i t )
136 137 138 139 140 141 142

/ / !< W e i g h t e d p r e d i c t i o n s u p p o r t f o r / / !< Use W e i g h t e d R e f e r e n c e f o r ME. / / !< P e r f o r m RD o p t i m a l d e c i s i o n / / !< T e s t s B s l i c e r e p l a c e m e n t f o r P . / / !< T e s t s I s l i c e r e p l a c e m e n t f o r P . / / !< Max # o f c o d i n g p a s s e s f o r I / / !< Max # o f c o d i n g p a s s e s f o r P / / !< Max # o f c o d i n g p a s s e s f o r B / / !< Wh eth er t o c h o o s e b e t w e e n / / !< Wh eth er t o c h e c k t h e o t h e r d i r e c t / / !< Wh eth er t o c h e c k a d d i t i o n a l f r a m e / / !< Wh eth er t o c h e c k a d d i t i o n a l f r a m e

143 144

b e t w e e n v a r i o u s co d ed v e r s i o n s o f same p i c t u r e
145 146 147

148

149

150

d e b l o c k e d and nond e b l o c k e d p i c t u r e
151

152

153

154 155

int SkipIntraInInterSlices ; slices int BRefPictures ; int HierarchicalCoding ; i n t HierarchyLevelQPEnable ;

/ / !< S k i p i n t r a t y p e c h e c k i n g i n i n t e r / / !< B co d ed r e f e r e n c e p i c t u r e s

i f best mode i s s k i p / d i r e c t

156

r e p l a c e P p i c t u r e s ( 0 : n o t u sed , 1 : u s e d )
157 158 159

cha r E x p l i c i t H i e r a r c h y F o r m a t [ INPUT TEXT SIZE ] ; H i e r a r c h i c a l C o d i n g ==3) . // int e x p l i c i t sequence i n f o r m a t i o n parameters ExplicitSeqCoding ;

/ / !< E x p l i c i t GOP f o r m a t (

160 161 162

cha r E x p l i c i t S e q F i l e [ FILE NAME SIZE ] ;

167
int LowDelay ; / / !< A p p l y H i e r a r c h i c a l C o d i n g w i t h o u t

163

d e l a y ( i . e . , encode i n t h e captured / d i s p l a y order )


164 165

int int

ReferenceReorder ; distances PocMemoryManagement ; d i s t a n c e s f o r h i e r a r c h i c a l coding

/ / !< R e o r d e r i n g b a s e d on Poc / / !< Memory management b a s e d on Poc

166

167 168

i n t symbol mode ; a r e mapped on b i t s i n t of mode ; file int partition mode ; partitioning

/ / !< S p e c i f i e s t h e mode t h e s y m b o l s / / !< S p e c i f i e s t h e mode o f t h e o u t p u t / / !< S p e c i f i e s t h e mode o f d a t a

169

170

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

int InterSearch [2][8] ; int DisableIntra4x4 ; int DisableIntra16x16 ; i n t FastMDEnable ; i n t FastIntraMD ; int FastIntra4x4 ; int FastIntra16x16 ; int FastIntra8x8 ; int FastIntraChroma ; int DisableIntraInInter ; int IntraDisableInterOnly ; int Intra4x4ParDisable ; int Intra4x4DiagDisable ; int Intra4x4DirDisable ; int Intra16x16ParDisable ; int Intra16x16PlaneDisable ; int ChromaIntraDisable ; i n t EnableIPCM ; do uble Fr am eRate ; int chroma qp index offset ; int full search ; int rdopt ;

168
i n t de ; int I16rdo ; i n t su b MBCo d in g State ; i n t D i s t o r t i o n [ TOTAL DIST TYPES ] ; do uble VisualResWavPSNR ; i n t SSIMOverlapSize ; i n t Disto r tio n YUVtoRGB ; i n t CtxAdptLagrangeMult ; int FastCrIntraDecision ; int disthres ; int nobskip ; i n t BiasSkipRDO ; i n t ForceTrueRateRDO ; # ifdef int LEAKYBUCKET Nu m b er Leak y Bu ck ets ; / / !< c o n t e x t a d a p t i v e l a g r a n g i a n m u l t i p l i e r / / !< t h e a l g o r i t h m t o e s t i m a t e t h e d i s t o r t i o n i n t h e d e c o d e r

200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

cha r L e a k y B u c k e t R a t e F i l e [ FILE NAME SIZE ] ; cha r L e a k y B u c k e t P a r a m F i l e [ FILE NAME SIZE ] ; # endif int PicInterlace ; int MbInterlace ; int IntraBottom ; / / !< p i c t u r e a d a p t i v e f r a m e / f i e l d / / !< m a c r o b l o c k a d a p t i v e f r a m e / f i e l d / / !< Fo rce I n t r a Bo tto m a t GOP p e r i o d s .

/ / E r r o r r e s i l i e n t RDO p a r a m e t e r s do uble Lo ssRateA ; p a r t i t i o n A ( or f u l l optimization do uble Lo ssRateB ; do uble Lo ssRateC ; int FirstFrameCorrect ; i n t NoOfDecoders ; int ErrorConcealment ; int RestrictRef ; i n t NumFramesInELSubSeq ; i n t Ran d o m I n tr aMBRef r esh ; picture / / !< Number o f p seu d orandom i n t r a MBs p e r / / !< E r r o r c o n c e a l m e n t meth o d u s e d f o r l o s s aware RDO ( 0 : Copy C o n c e a l m e n t ) / / !< a ssu med l o s s p r o b a b l i l i t y o f s l i c e ) , i n p e r c e n t , u s e d f o r l o s s aware R /D / / !< a ssu med l o s s p r o b a b l i l i t y o f / / !< a ssu med l o s s p r o b a b l i l i t y o f / / !< t h e f i r s t f r a m e i s e n c o d e d u n d e r t h e

226

p a r t i t i o n B , i n p e r c e n t , u s e d f o r l o s s aware R /D
227

p a r t i t i o n C , i n p e r c e n t , u s e d f o r l o s s aware R /D
228

assumption t h a t i t i s always c o r r e c t l y r e c e i v e d .
229 230

231 232 233 234

235

169
/ / Chroma i n t e r p o l a t i o n and b u f f e r i n g i n t ChromaMCBuffer ; B o o l e a n ChromaMEEnable ; i n t ChromaMEWeight ; i n t MEErrorMetric [ 3 ] ; i n t ModeDecisionMetric ; i n t Sk ip DeBlo ck NonRef ; // Deblocking F i l t e r parameters

236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

i n t DFSendParameters ; i n t D F D i s a b l e I d c [ 2 ] [ NUM SLICE TYPES ] ; i n t DFAlpha i n t DFBeta [ 2 ] [ NUM SLICE TYPES ] ; [ 2 ] [ NUM SLICE TYPES ] ;

int SparePictureOption ; int SPDetectionThreshold ; int SPPercentageThreshold ; / / FMO cha r S l i c e G r o u p C o n f i g F i l e N a m e [ FILE NAME SIZE ] ; config info fot type 0 , 2 , 6 int num slice groups minus1 ; int slice group map type ; unsigned i n t * t o p l e f t ; / / !< t o p l e f t and bottom right store values indicating foregrounds unsigned i n t * b o t t o m r i g h t ; byte * s l i c e g r o u p i d ; g ro u p t y p e b e i n g 6 int * run length minus1 ; s l i c e g ro u p t y p e b e i n g 0 int slice group change direction flag ; int slice group change rate minus1 ; int slice group change cycle ; int redundant pic flag ; int pic order cnt type ; int context init method ; i n t m o d el n u m b er ; i n t Tr an sf o r m8 x8Mode ; / / ! encoding of redundant p i c t u r e s / / ! POC t y p e / / !< s l i c e g r o u p i d i s f o r s l i c e / / !< r u n l e n g t h m i n u s 1 i s f o r / / !< F i l e n a m e f o r

256

/ / !< FmoNumSliceGroups i n

e n c o d e r . c f g , same a s FmoNumSliceGroups , wh ich s h o u l d be e r a s e d l a t e r


257 258 259

260 261

262

263 264 265 266 267 268 269 270 271 272 273

170
int ReportFrameStats ; i n t DisplayEncParams ; i n t Verbose ; / / ! Rate Control parameters i n t RCEnable ; int b i t r a t e ; int SeinitialQP ; unsigned i n t b a s i c u n i t ; int channel type ; i n t RCUpdateMode ; do uble R C I o v e r P R a t i o ; do uble RCBo v er PRatio ; do uble R C I S l i c e B i t R a t i o ; do uble R C B S l i c e B i t R a t i o [ RC MAX TEMPORAL LEVELS ] ; int int int RCMinQP [ NUM SLICE TYPES ] ; RCMaxQP [ NUM SLICE TYPES ] ; RCMaxQPChange ;

274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316

/ / Mo tio n E s t i m a t i o n r e l a t e d p a r a m e t e r s int int int UseMVLimits ; SetMVXLimit ; SetMVYLimit ;

/ / Search Algorithm S e a r c h T y p e SearchMode ; / / UMHEX r e l a t e d p a r a m e t e r s i n t UMHexDSR ; i n t UMHexScale ; / / EPZS r e l a t e d p a r a m e t e r s i n t EPZSPattern ; i n t EPZSDual ; i n t EPZSFixed ; i n t EPZSTemporal ; i n t EPZSSpatialMem ; i n t EPZSBlockType ; i n t EPZSMin Th r esScale ; i n t EPZSMaxThresScale ; i n t EPZSMedThresScale ; i n t EPZSSu b PelGr id ; i n t EPZSSubPelME ;

171
i n t EPZSSubPelMEBiPred ; i n t EPZSSubPelThresScale ; / / Lambda Params i n t UseExplicitLambdaParams ; i n t UpdateLambdaChromaME ; do uble LambdaWeight [ 6 ] ; do uble FixedLambda [ 6 ] ; cha r Q O f f s e t M a t r i x F i l e [ FILE NAME SIZE ] ; matrix cfg f i l e
327

317 318 319 320 321 322 323 324 325 326

/ / !< Q u a n t i z a t i o n O f f s e t / / !< E n a b l e E x p l i c i t

int

OffsetMatrixPresentFlag ; Quantization O f f s e t Matrices

328 329

i n t AdaptiveRounding ; p a r a m e t e r b a s e d on JVTN011 i n t AdaptRoundingFixed ; a l l qps i n t AdaptRndPeriod ; a d a p t i v e r o u n d i n g o f JVTN011 i n MBs i n t AdaptRndChroma ; i n t AdaptRndWFactor [ 2 ] [ NUM SLICE TYPES ] ;

/ / !< A d a p t i v e Ro u n d in g / / !< G l o b a l r o u n d i n g f o r / / !< S e t p e r i o d f o r

330

331

332 333

/ / !< W e i g h t i n g f a c t o r s f o r / / !< W e i g h t i n g f a c t o r s f o r

luma co mp o n en t b a s e d on r e f e r e n c e i n d i c a t o r and s l i c e t y p e
334

i n t AdaptRndCrWFactor [ 2 ] [ NUM SLICE TYPES ] ;

chroma c o m p o n e n t s b a s e d on r e f e r e n c e i n d i c a t o r and s l i c e t y p e
335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352

// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / F i d e l i t y Range E x t e n s i o n s int ScalingMatrixPresentFlag ; int ScalingListPresentFlag [12]; int cb qp index offset ; int cr qp index offset ; / / L o s s l e s s Co d in g int LosslessCoding ; / / F a s t Mode D e c i s i o n int EarlySkipEnable ; int SelectiveIntraEnable ; int DisposableP ; i n t DispPQPOffset ; / / Redundant p i c t u r e

172
i n t N u m R e d u n d an t Hi er a r ch y ; p i c t u r e s i n a GOP
354 355

353

/ / !< number o f e n t r i e s t o a l l o c a t e r e d u n d a n t / / !< GOP l e n g t h o f p r i m a r y p i c t u r e s / / !< number o f r e f e r e n c e f r a m e s f o r p r i m a r y

i n t Pr im ar y GOPLength ; i n t NumRefPrimary ; picture

356 357 358 359

/ / t o n e mapping SEI messa g e i n t ToneMappingSEIPresentFlag ; cha r T o n e M a p p i n g F i l e [ FILE NAME SIZE ] ; file / / !< ToneMapping SEI messa g e c f g

360 361 362

/ / prediction structure int PreferDispOrder ; i n t Pr ef er Po wer Of Two ; / / !< P r e f e r d i s p l a y o r d e r when b u i l d i n g t h e / / !< P r e f e r p r e d i c t i o n s t r u c t u r e s t h a t h a v e p r e d i c t i o n s t r u c t u r e as opposed t o coding o rd er

363

l e n g t h s e x p r e s s e d a s p o wers o f two
364

i n t F r m S t r u c t B u f f e r L e n g t h ; / / !< Number o f f r a m e s t h a t i s p o p u l a t e d e v e r y time p o p u l a t e fr m s t r u ct i s ca lled

365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385

int separate colour plane flag ; do uble WeightY ; do uble WeightCb ; do uble Weig h tCr ; i n t UseRDOQuant ; i n t RDOQ DC ; i n t RDOQ CR ; i n t RDOQ DC CR ; i n t RDOQ QP Num ; i n t RDOQ CP Mode ; i n t RDOQ CP MV ; i n t RDOQ Fast ; i n t EnableVUISupport ; / / VUI p a r a m e t e r s V U I P a r a m e t e r s VUI ; / / end o f VUI p a r a m e t e r s int Min I DRDistan ce ; / / !< 1 s t a n d a r d ra n g e , 0 f u l l / / !< 1 7 0 9 , 3 6 0 1 : See range

i n t stdRange ; i n t videoCode ; Vid eo Co d e i n i o t i f f .

386

387

173
/ * KATCIPIS a d d i n g c o n f i g u r a t i o n f o r O b j e c t d e t e c t i o n / t r a c k i n g * / / / !< E n a b l e / D i s a b l e int object detection enable ; object detection .
390

388 389

int object detection min width ; t h e o b j e c t t h a t w i l l be d e t e c t e d . int object detection min height ; t h e o b j e c t t h a t w i l l be d e t e c t e d . int object detection search hys teresis ; o b j e c t h y s t e r e s y s ( in frames ) . int object detecti on tracking hys teresis ; o b j e c t e x i s t e n c e h y s t e r e s i s ( in frames ) . cha r o b j e c t d e t e c t i o n t r a i n i n g f i l e [ FILE NAME SIZE ] ; t h e t r a i n i n g i n f o u s e d on t h e o b j e c t d e t e c t i o n . }; # endif

/ / !< Min w i d t h o f / / !< Min h e i g h t o f / / !< S e a r c h f o r new / / !< C o n f i r m t r a c k e d / / !< F i l e c o n t a i n i n g

391

392

393

394

395 396 397

174

12 ANEXO D ALTERACOES REALIZADAS NA CONFIGURACAO DO CODIFICADOR DO SOFTWARE DE REFERENCIA

Essas alteracoes representam as alteracoes realizadas no arquivo de conguracao que vem junto com a distribuicao do software de refer ncia, apenas os campos que sofreram alteracoes e s o apresentados aqui, os que n o s o apresentados foram mantidos com o mesmo valor que o a a a arquivo original.
1 2

ProfileIDC

= 66 # P r o f i l e IDC ( 6 6 = b a s e l i n e , 77= main , 88=

e x t e n d e d ; FREXT P r o f i l e s : 100= High , 110= High 1 0 , 122= High 4 : 2 : 2 , 244= High 4 : 4 : 4 , 44=CAVLC 4 : 4 : 4 I n t r a , 118= M u l t i v i e w High P r o f i l e , 128= S t e r e o High P r o f i l e )
3 4

IntraPeriod D i s a b l e S u b p e l ME d e f a u l t , 1=on ) SearchRange MEDistortionHPel MEDistortionQPel MDDistortion

= 12 = 1 = 16 = 0 = 0 = 0

# P e r i o d o f Ip i c t u r e s

(0= only f i r s t )

# D i s a b l e S u b p i x e l Mo tio n E s t i m a t i o n ( 0 = o f f / # Max s e a r c h r a n g e # S e l e c t e r r o r m e t r i c f o r H a l f P e l ME (0:

5 6

SAD, 1 : SSE , 2 : Hadamard SAD)


7

# S e l e c t e r r o r m e t r i c f o r Q u a r t e r P e l ME ( 0 : # S e l e c t e r r o r m e t r i c f o r Mode D e c i s i o n (0:

SAD, 1 : SSE , 2 : Hadamard SAD)


8

SAD, 1 : SSE , 2 : Hadamard SAD)


9

NumberReferenceFrames = 1 m o t i o n s e a r c h (0 16) GenerateMultiplePPS NumberBFrames ) HierarchicalCoding BiPredMESubPel SymbolMode = 0 = 0 = = 0 = 0 0

# Number o f p r e v i o u s f r a m e s u s e d f o r i n t e r # Transmit m u l t i p l e parameter s e t s . Currently # Number o f B co d ed f r a m e s i n s e r t e d ( 0 = n o t u s e d # B h i e r a r c h i c a l c o d i n g ( 0 = o f f , 1= 2 l a y e r s , # B i p r e d i c t i v e ME S u b p i x e l C o n s i d e r a t i o n ( 0 : # Symbol mode ( E n t r o p y c o d i n g method : 0=UVLC,

10

p a r a m e t e r s b a s i c a l l y e n a b l e a l l WP modes ( 0 : d i a b l e d , 1 : e n a b l e d )
11

12

2= 2 f u l l h i e r a r c h y , 3 = e x p l i c i t )
13

disabled , 1: si n gl e level , 2: dual le v e l )


14

175
1=CABAC)
15

WPMCPrecision RDPictureDecision FastCrIntraDecision ) UseExplicitLambdaParams FixedLambdaISlice FixedLambdaPSlice FixedLambdaBSlice FixedLambdaRefBSlice slices FixedLambdaSPSlice FixedLambdaSISlice RateControlEnable Bitrate BasicUnit RCMaxQPPSlice RCMaxQPBSlice RCMaxQPISlice RCMaxQPSISlice control Tr an sf o r m 8x8Mode OffsetMatrixPresentFlag Matrices AdaptRoundingFixed AdaptRndPeriod rounding o f f s e t s . Ad ap tRn d WFacto r I Ref AdaptRndWFactorPRef AdaptRndWFactorBRef AdaptRndWFactorINRef AdaptRndWFactorPNRef AdaptRndWFactorBNRef =

= = 1 = = = = = = = = 1 = 1 = 44 = 46 = 36 = 36 = 0 = 1 = 1

0 0

# I m p r o v ed Mo tio n C o m p e n s a t i o n P r e c i s i o n # P e r f o r m m u l t i p l e p a s s c o d i n g and make # F a s t Chroma i n t r a mode d e c i s i o n ( 0 : o f f , 1 : on

u s i n g WP b a s e d m eth o d s .
16

RD o p t i m a l d e c i s i o n among them
17

18

2 29.0 29.0 29.0 29.0 29.0 29.0

# Use e x p l i c i t lam b d a s c a l i n g p a r a m e t e r s # F i x e d Lambda v a l u e f o r I s l i c e s # F i x e d Lambda v a l u e f o r P s l i c e s # F i x e d Lambda v a l u e f o r B s l i c e s # F i x e d Lambda v a l u e f o r R e f e r e n c e d B # F i x e d Lambda v a l u e f o r SP s l i c e s # F i x e d Lambda v a l u e f o r S I s l i c e s # 0 Disable , 1 Enable # Number o f MBs i n t h e b a s i c u n i t # maximum P S l i c e QP v a l u e f o r r a t e c o n t r o l # maximum B S l i c e QP v a l u e f o r r a t e c o n t r o l # maximum I S l i c e QP v a l u e f o r r a t e c o n t r o l # maximum S I S l i c e QP v a l u e f o r r a t e # ( 0 : o n l y 4 x4 t r a n s f o r m , 1 : a l l o w u s i n g 8 # Enable E x p l i c i t O f f se t Q u a n t i z a t i o n # Enable Global Adaptive rounding for a l l # P e r i o d i n t e r m s o f MBs f o r u p d a t i n g # A d a p t i v e Ro u n d in g Weig h t f o r I / S I s l i c e s # A d a p t i v e Ro u n d in g Weig h t f o r P / SP s l i c e s # A d a p t i v e Ro u n d in g Weig h t f o r B s l i c e s i n # A d a p t i v e Ro u n d in g Weig h t f o r I / S I s l i c e s # A d a p t i v e Ro u n d in g Weig h t f o r P / SP s l i c e s # A d a p t i v e Ro u n d in g Weig h t f o r B s l i c e s i n

( 0 : d i s a b l e d , 1 : e n a b l e lam b d a w e i g h t , 2 : u s e e x p l i c i t lam b d a v a l u e )
19 20 21 22

23 24 25 26 27 28 29 30 31

= 996000 # B i t r a t e ( b p s )

32

x8 t r a n s f o r m a d d i t i o n a l l y , 2 : o n l y 8 x8 t r a n s f o r m )
33

(0: disable 1: enable )

34

qps ( 0 : d i s a b l e , 1 : en ab le def a ult / old )


35

= 16 = 4 = 4 = 4 = 4 = 4 = 4

36

in r e f e r e n c e p i c t u r e s /4096
37

in r e f e r e n c e p i c t u r e s /4096
38

r e f e r e n c e p i c t u r e s /4096
39

i n non r e f e r e n c e p i c t u r e s / 4 0 9 6
40

i n non r e f e r e n c e p i c t u r e s / 4 0 9 6
41

176
non r e f e r e n c e p i c t u r e s / 4 0 9 6
42

Ad ap tRn d Cr WFacto r I Ref Ad ap tRn d Cr WFacto rPRef AdaptRndCrWFactorBRef Ad ap tRn d Cr WFactorI NRef AdaptRndCrWFactorPNRef AdaptRndCrWFactorBNRef UseRDOQuant ( 0 = d i s a b l e , 1= e n a b l e ) RDOQ DC RDOQ CR RDOQ DC CR RDOQ QP Num slice ) RDOQ CP Mode RDOQ CP MV RDOQ Fast SearchMode

= 4 = 4 = 4 = 4 = 4 = 4 = = = = = = = =

# Chroma A d a p t i v e Ro u n d in g Weig h t f o r I / S I # Chroma A d a p t i v e Ro u n d in g Weig h t f o r P / SP # Chroma A d a p t i v e Ro u n d in g Weig h t f o r B # Chroma A d a p t i v e Ro u n d in g Weig h t f o r I / S I # Chroma A d a p t i v e Ro u n d in g Weig h t f o r P / SP # Chroma A d a p t i v e Ro u n d in g Weig h t f o r B 0 # Use R a t e D i s t o r t i o n O p t i m i z e d Q u a n t i z a t i o n 0 # Enable Rate D i s t o r t i o n Optimized 0 # Enable Rate D i s t o r t i o n Optimized 0 # Enable Rate D i s t o r t i o n Optimized 1 # 1 9: Number o f QP t e s t e d i n RDO Q ( I / P / B 1 # co p y Mode f r o m f i r s t QP t e s t e d 1 # co p y MV f r o m f i r s t QP t e s t e d 1 # F a s t RDOQ d e c i s i o n method f o r m u l t i p l e QPs # Mo tio n e s t i m a t i o n mode

s l i c e s in r e f e r e n c e p i c t u r e s /4096
43

s l i c e s in r e f e r e n c e p i c t u r e s /4096
44

s l i c e s in r e f e r e n c e p i c t u r e s /4096
45

s l i c e s i n non r e f e r e n c e p i c t u r e s / 4 0 9 6
46

s l i c e s i n non r e f e r e n c e p i c t u r e s / 4 0 9 6
47

s l i c e s i n non r e f e r e n c e p i c t u r e s / 4 0 9 6
48

49

Q u a n t i z a t i o n f o r DC c o m p o n e n t s ( 0 = d i s a b l e , 1= e n a b l e )
50

Q u a n t i z a t i o n f o r Chroma c o m p o n e n t s ( 0 = d i s a b l e , 1= e n a b l e )
51

Q u a n t i z a t i o n f o r Chroma DC c o m p o n e n t s ( 0 = d i s a b l e , 1= e n a b l e )
52

53 54 55 56

= 1

Você também pode gostar