Commit 05be5b7a2f7e8f876adfb54de70b99c365382351

Authored by Erickson Silva
2 parents d7f0c9d9 e9b85bfd
Exists in master

Merge devel

Showing 68 changed files with 5786 additions and 2815 deletions   Show diff stats
.gitignore
1 1 #general
2   -*.ts
3   -*.flv
4   -*.swp*
5   -*.class
6   -*.a
7   -*.so
8 2 *.o
9   -*.log
10   -*.jar
11   -*.pyc
12   -*.srt
13 3 vlibras_user
14   -tamanho.txt
15   -vlibras
16 4 \ No newline at end of file
  5 +vlibras
  6 +doc
17 7 \ No newline at end of file
... ...
Makefile
1   -
2   -REVISION=`svn info |grep Rev | sed 2d | cut -d" " -f2`
3   -
4   -CC=g++
5   -FLAGS=-g
6   -
7   -#LIBS= -L libs/jthread/lib -L libs/jcommon/lib -L libs/jsocket/lib -ljthread -lpthread -ljcommon -ljsocket
8   -
9   -LIBS= \
  1 +BIN = vlibras
  2 +
  3 +CC = g++
  4 +FLAGS = -g
  5 +
  6 +EXTRATORDIR = extrator/src/
  7 +MIXERDIR = mixer/src/
  8 +RECOGNIZEDIR = recognize/src/
  9 +RENDERDIR = renderer/src/
  10 +SERVICODIR = servico/src/
  11 +TRADUTORDIR = tradutor/src/
  12 +UTILDIR = util/src/
  13 +
  14 +INCLUDES = \
  15 + -I $(EXTRATORDIR)include \
  16 + -I $(MIXERDIR)include \
  17 + -I $(RECOGNIZEDIR)include \
  18 + -I $(RENDERDIR)include \
  19 + -I $(SERVICODIR)include \
  20 + -I $(TRADUTORDIR)include \
  21 + -I $(UTILDIR)include \
  22 + -I /usr/include/python2.7 \
  23 + -I /usr/include/julius \
  24 + -I /usr/include/sent
  25 +
  26 +CFLAGS = \
10 27 `pkg-config --cflags jlibcpp` \
11   - `pkg-config --libs jlibcpp` \
12 28 `pkg-config --cflags jsoncpp` \
  29 + $(INCLUDES)
  30 +
  31 +LDFLAGS = \
  32 + `pkg-config --libs jlibcpp` \
13 33 `pkg-config --libs jsoncpp` \
14   - -lpython2.7 -llavid_base -llavid_io
15   -
16   -INCLUDES= \
17   - -I /usr/include/python2.7 \
18   - -I util/src/include \
19   - -I tradutor/src/include \
20   - -I extrator/src/include \
21   - -I input/src/include \
22   - -I servico/src/include \
23   - -I synchronizer/src/include \
24   - -I mixer/src/include \
25   - -I recognize/src/include
26   -#-I libs/jthread/include -I libs/jcommon/include -I libs/jsocket/include -Wall
27   -
28   -utilObjs= \
29   - logger.o
30   -
31   -tradutorObjs = \
32   - pyTradutor.o \
33   - tradutorPortGlosa.o
34   -
35   -extratorObjs= \
36   - extratorFactory.o \
37   - extratorSRT.o \
38   - extratorTXT.o \
39   - subtitle.o \
40   - extratorException.o
41   -
42   -inputObjs= \
43   - inputFile.o \
44   - inputException.o
45   -
46   -servicoObjs= \
47   - serviceWindowGenerationFromSRT.o \
48   - serviceWindowGenerationFromRec.o \
49   - serviceWindowGenerationFromText.o \
50   - serviceException.o
51   -
52   -synchronizerObjs= \
53   - synchronizer.o
54   -
55   -mixerObjs= \
56   - Mixer.o
57   -
58   -recognizeObjs = \
59   - recognize.o \
60   - recognizeException.o
61   -
62   -utilObjsPre = $(addprefix util/src/,$(utilObjs) )
63   -tradutorObjsPre = $(addprefix tradutor/src/,$(tradutorObjs) )
64   -inputObjsPre = $(addprefix input/src/,$(inputObjs) )
65   -servicoObjsPre = $(addprefix servico/src/,$(servicoObjs) )
66   -synchronizerObjsPre = $(addprefix synchronizer/src/,$(synchronizerObjs) )
67   -mixerObjsPre = $(addprefix mixer/src/,$(mixerObjs) )
68   -extratorObjsPre = $(addprefix extrator/src/,$(extratorObjs) )
69   -recognizeObjsPre = $(addprefix recognize/src/,$(recognizeObjs) )
70   -extratorTXTObjsPre = $(addprefix extratorTXT/src/,$(extratorTXTObjs) )
  34 + -lpython2.7 -llavid_base -llavid_io -llavid_net -ljulius -ldl -lsent
  35 +
  36 +extratorOBJS = \
  37 + extratorException.o \
  38 + extratorFactory.o \
  39 + extratorSRT.o \
  40 + extratorTXT.o \
  41 + extratorVTT.o \
  42 + subtitle.o
  43 +
  44 +mixerOBJS = \
  45 + mixer.o
  46 +
  47 +recognizeOBJS = \
  48 + audiofile.o \
  49 + recognize.o \
  50 + recognizeException.o \
  51 + recognizer.o \
  52 + wavcut.o
  53 +
  54 +rendererOBJS = \
  55 + renderer.o
  56 +
  57 +servicoOBJS = \
  58 + serviceException.o \
  59 + serviceTester.o \
  60 + serviceWindowGenerationFromRec.o \
  61 + serviceWindowGenerationFromSubtitle.o \
  62 + serviceWindowGenerationFromText.o
  63 +
  64 +tradutorOBJS = \
  65 + pyTradutor.o \
  66 + tradutorPortGlosa.o
  67 +
  68 +utilOBJS = \
  69 + argParser.o \
  70 + logging.o
  71 +
  72 +extratorOBJSPre = $(addprefix $(EXTRATORDIR),$(extratorOBJS) )
  73 +mixerOBJSPre = $(addprefix $(MIXERDIR),$(mixerOBJS) )
  74 +recognizeOBJSPre = $(addprefix $(RECOGNIZEDIR),$(recognizeOBJS) )
  75 +rendererOBJSPre = $(addprefix $(RENDERDIR),$(rendererOBJS) )
  76 +servicoOBJSPre = $(addprefix $(SERVICODIR),$(servicoOBJS) )
  77 +tradutorOBJSPre = $(addprefix $(TRADUTORDIR),$(tradutorOBJS) )
  78 +utilOBJSPre = $(addprefix $(UTILDIR),$(utilOBJS) )
71 79  
72 80 OBJECTS = \
73   - $(utilObjsPre) \
74   - $(tradutorObjsPre) \
75   - $(extratorObjsPre) \
76   - $(inputObjsPre) \
77   - $(servicoObjsPre) \
78   - $(synchronizerObjsPre) \
79   - $(mixerObjsPre) \
80   - $(recognizeObjsPre) \
81   - main.o
82   -
83   -all: user_config libras
84   -
  81 + $(extratorOBJSPre) \
  82 + $(mixerOBJSPre) \
  83 + $(recognizeOBJSPre) \
  84 + $(rendererOBJSPre) \
  85 + $(servicoOBJSPre) \
  86 + $(tradutorOBJSPre) \
  87 + $(utilOBJSPre) \
  88 + main.o
  89 +
  90 +all: user_config compile
  91 +
85 92 user_config:
86 93 @if [ ! -e "vlibras_user" ];then \
87 94 echo -n "Criando um link simbólico para este diretório...\n"; \
88 95 sudo chmod +x link_config.sh; \
89 96 sh link_config.sh; \
90 97 fi
91   -
92   -libras: $(OBJECTS)
93   - $(CC) -o vlibras $(OBJECTS) $(LIBS) $(INCLUDES) $(FLAGS)
94 98  
95   -
96   -.c.o: $<
97   - $(CC) -DDEBUG_LEVEL=15 -c $< -o $@ $(LIBS) $(INCLUDES) $(FLAGS)
  99 +compile: $(OBJECTS)
  100 + $(CC) $(CFLAGS) -o $(BIN) $(OBJECTS) $(LDFLAGS) $(FLAGS) -lz
98 101  
99 102 .cpp.o: $<
100   - $(CC) -DDEBUG_LEVEL=15 -c $< -o $@ $(LIBS) $(INCLUDES) $(FLAGS)
  103 + $(CC) -DDEBUG_LEVEL=15 -c $< -o $@ $(LDFLAGS) $(CFLAGS) $(FLAGS)
101 104  
102 105 clean:
103 106 @find -iname "*.o" -exec rm {} \;
104   - @find -iname ".*.o" -exec rm {} \;
105   - @find -iname "*.so" -exec rm {} \;
106   - @find -iname "*~" -exec rm {} \;
107   - @find -iname "*.swp" -exec rm {} \;
108 107 @find -iname "vlibras" -exec rm {} \;
109   - @find -iname "*.class" -exec rm {} \;
110   - @find -iname "*.pyc" -exec rm {} \;
111 108 @if [ -e "vlibras_user" ];then \
112 109 echo -n "Removendo o link simbólico deste usuário...\n"; \
113 110 rm vlibras_user; \
114 111 fi
  112 + @if [ -e "doc" ];then \
  113 + echo -n "Removendo documentação...\n"; \
  114 + rm -r doc; \
  115 + fi
115 116  
116   -del:
117   - @find -iname "*.java" -exec rm {} \;
118   - @find -iname "*.c" -exec rm {} \;
119   - @find -iname "*.cpp" -exec rm {} \;
120   - @find -iname "*.h" -exec rm {} \;
121   - @find -iname "*.class" -exec rm {} \;
122   - @find -iname "*.form" -exec rm {} \;
123   - @find -iname "*.o" -exec rm {} \;
124   - @find -iname ".*.o" -exec rm {} \;
125   - @find -iname "*~" -exec rm {} \;
126   - @find -iname "*.log" -exec rm {} \;
127   - @find -iname "*.swp" -exec rm {} \;
128   - @find -iname "*.tmp" -exec rm {} \;
129   - @find -iname "*.svn-base" -exec rm -r {} \;
130   - @find -iname "*.svn" -exec rm -r {} \;
131   - @find -iname "Makefile" -exec rm {} \;
132   -
133   -svn:
134   - @find -iname "*.log" -exec rm {} \;
135   - @find -iname "*.swp" -exec rm {} \;
136   - @find -iname "*.tmp" -exec rm {} \;
137   - @find -iname "*.svn-base" -exec rm -r {} \;
138   - @find -iname "*.svn" -exec rm -r {} ;\
  117 +doc:
  118 + @echo -n "Gerando Documentação...\n"; \
  119 + doxygen doc_config
... ...
core_install.sh
1 1 #!/bin/bash
2 2  
3   -echo -e "\n## Iniciando a instalação do vlibras-core ##\n"
  3 +echo -e "\n\033[32m##### Iniciando a instalação VLibras-Core #####\033[0m\n"
4 4  
5 5 DIR=$HOME/vlibras-libs
6 6  
... ... @@ -11,38 +11,45 @@ fi
11 11 #garanto que não tem nenhuma versão prévia instalada
12 12 sudo apt-get remove -y ffmpeg x264 libx264-dev yasm
13 13  
14   -echo -e "\n## Fazendo download das dependências...\n"
  14 +echo -e "\n\033[32m##### Fazendo download das dependências #####\033[0m\n"
15 15  
16 16 sudo apt-get update
17 17 sudo apt-get install -y aptitude
18   -sudo aptitude install -y build-essential cmake libvpx-dev sox libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev automake autoconf libmad0-dev libgpm-dev libavcodec-dev libavformat-dev libdirectfb-extra libtool libavcodec-extra-52 libavformat-extra-52 libdirectfb-bin libdirectfb-dev libgtk+2.0-directfb0 libgtk+2.0-directfb-dev
  18 +sudo aptitude install -y build-essential git cmake recode python-pip libssl-dev python-dev xvfb xserver-xephyr libjsoncpp-dev libvpx-dev sox curl libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev automake autoconf libmad0-dev libgpm-dev libavcodec-dev libavformat-dev libdirectfb-extra libtool libavcodec-extra-52 libavformat-extra-52 libdirectfb-bin libdirectfb-dev libgtk+2.0-directfb0 libgtk+2.0-directfb-dev
  19 +sudo pip install pyvirtualdisplay
19 20  
20 21 cd ~/vlibras-libs
21 22  
  23 +wget http://150.165.204.30:8080/core/linux/unityVideo.tar.gz
22 24 wget http://150.165.204.30:8080/core/linux/yasm-1.2.0.tar.gz
23 25 wget http://150.165.204.30:8080/core/linux/jlibcpp-1.5.0.tar.gz
24 26 wget http://150.165.204.30:8080/core/linux/julius-4.3.1.tar.gz
25 27 wget http://150.165.204.30:8080/core/linux/lavid-lib.tar.gz
26 28 wget http://150.165.204.30:8080/core/linux/ffmpeg-vlibras.tar.gz
27 29  
28   -echo -e "\n## Extraindo...\n"
  30 +echo -e "\n\033[32m##### Extraindo #####\033[0m\n"
29 31  
  32 +tar -xf unityVideo.tar.gz -C $HOME
30 33 tar -xf ffmpeg-vlibras.tar.gz
31 34 tar -xf yasm-1.2.0.tar.gz
32 35 tar -xf jlibcpp-1.5.0.tar.gz
33 36 tar -xf julius-4.3.1.tar.gz
34 37 tar -xf lavid-lib.tar.gz
35 38  
36   -echo -e "\n## Instalando dependências...\n"
  39 +echo -e "\n\033[32m##### Baixando sinais #####\033[0m\n"
37 40  
38   -echo -e "\n## Instalando Yasm...\n"
  41 +cd ~/vlibras-core
  42 +./dict_update.sh
  43 +
  44 +echo -e "\n\033[32m##### Instalando Yasm #####\033[0m\n"
  45 +cd ~/vlibras-libs
39 46 cd yasm-1.2.0
40 47 chmod +x configure
41 48 ./configure
42 49 make
43 50 sudo make install
44 51  
45   -echo -e "\n## Instalando x264...\n"
  52 +echo -e "\n\033[32m##### Instalando x264 #####\033[0m\n"
46 53 cd ..
47 54 git clone --depth 1 git://git.videolan.org/x264
48 55 cd x264
... ... @@ -52,7 +59,7 @@ make
52 59 sudo make install
53 60 sudo ldconfig
54 61  
55   -echo -e "\n## Instalando FFmpeg...\n"
  62 +echo -e "\n\033[32m##### Instalando FFMPEG #####\033[0m\n"
56 63 cd ..
57 64 cd ffmpeg
58 65 chmod +x configure
... ... @@ -61,30 +68,21 @@ make
61 68 sudo make install
62 69 hash x264 ffmpeg ffprobe
63 70  
64   -echo -e "\n## Instalando jlibcpp...\n"
  71 +echo -e "\n\033[32m##### Instalando jlibcpp #####\033[0m\n"
65 72 cd ..
66 73 cd jlibcpp
67 74 make ENABLE_DIRECTFB=no
68 75 sudo make install
69 76 sudo ldconfig
70 77  
71   -echo -e "\n## Instalando JsonCpp...\n"
72   -cd ..
73   -git clone https://github.com/open-source-parsers/jsoncpp.git
74   -cd jsoncpp
75   -python amalgamate.py
76   -./travis.sh
77   -make
78   -sudo make install
79   -
80   -echo -e "\n## Instalando Julius...\n"
  78 +echo -e "\n\033[32m##### Instalando Julius #####\033[0m\n"
81 79 cd ..
82 80 cd julius-4.3.1
83 81 ./configure
84 82 make
85 83 sudo make install
86 84  
87   -echo -e "\n## Instalando Lavidlib...\n"
  85 +echo -e "\n\033[32m##### Instalando Lavidlib #####\033[0m\n"
88 86 cd ..
89 87 cd lavid-lib
90 88 make
... ... @@ -92,4 +90,4 @@ sudo make install
92 90  
93 91 cd ..
94 92 rm ffmpeg-vlibras.tar.gz yasm-1.2.0.tar.gz jlibcpp-1.5.0.tar.gz julius-4.3.1.tar.gz lavid-lib.tar.gz
95   -echo -e "\n## Instalação finalizada! ##\n"
96 93 \ No newline at end of file
  94 +echo -e "\n\033[32m##### Instalação Finalizada! #####\033[0m\n"
... ...
dict_update.sh 0 → 100755
... ... @@ -0,0 +1,47 @@
  1 +#!/bin/bash
  2 +
  3 +echo -e "\n\033[32m##### Atualizando dicionário #####\033[0m\n"
  4 +
  5 +NOT_INSTALLED=false
  6 +DIR=/opt/vlibras_desktop/vlibras_player_Data/Bundles
  7 +PLAYER_DATA="$HOME/unityVideo/videoCreator_Data"
  8 +BUNDLES="$PLAYER_DATA/Bundles"
  9 +
  10 +function check_update_patches()
  11 +{
  12 + count=0
  13 + for d in "$DIR/*" ; do
  14 + count=$((count+1))
  15 + apt-get install --only-upgrade --force-yes --yes patch${count}.0.0 > /dev/null 2>&1
  16 + done
  17 +}
  18 +
  19 +if [ ! -f /etc/apt/sources.list.d/dicionario-vlibras.list ]; then
  20 + # Add repository to update the dictionary
  21 + echo 'deb http://150.165.204.46:8080 precise main' | sudo tee /etc/apt/sources.list.d/dicionario-vlibras.list > /dev/null 2>&1
  22 +fi
  23 +
  24 +PKG_DICT=$(dpkg-query -W --showformat='${Status}\n' dicionario-vlibras:i386|grep "install ok installed")
  25 +if [ "" == "$PKG_DICT" ]; then
  26 + NOT_INSTALLED=true
  27 + sudo apt-get install --force-yes --yes dicionario-vlibras:i386
  28 +else
  29 + sudo apt-get update
  30 + check_update_patches
  31 + sudo apt-get install --only-upgrade --force-yes --yes dicionario-vlibras:i386
  32 +fi
  33 +
  34 +#remove pasta bundles
  35 +if [ -d "$BUNDLES" ] ; then
  36 + rm -r $BUNDLES
  37 +fi
  38 +
  39 +#copia dicionário para pasta de bundles
  40 +cp -r $DIR $PLAYER_DATA
  41 +cd $BUNDLES
  42 +rm *.description
  43 +
  44 +#remove pacote
  45 +if [ "$NOT_INSTALLED" = true ] ; then
  46 + sudo apt-get autoremove -y dicionario-vlibras:i386
  47 +fi
0 48 \ No newline at end of file
... ...
doc_config 0 → 100644
... ... @@ -0,0 +1,1781 @@
  1 +# Doxyfile 1.7.6.1
  2 +
  3 +# This file describes the settings to be used by the documentation system
  4 +# doxygen (www.doxygen.org) for a project.
  5 +#
  6 +# All text after a hash (#) is considered a comment and will be ignored.
  7 +# The format is:
  8 +# TAG = value [value, ...]
  9 +# For lists items can also be appended using:
  10 +# TAG += value [value, ...]
  11 +# Values that contain spaces should be placed between quotes (" ").
  12 +
  13 +#---------------------------------------------------------------------------
  14 +# Project related configuration options
  15 +#---------------------------------------------------------------------------
  16 +
  17 +# This tag specifies the encoding used for all characters in the config file
  18 +# that follow. The default is UTF-8 which is also the encoding used for all
  19 +# text before the first occurrence of this tag. Doxygen uses libiconv (or the
  20 +# iconv built into libc) for the transcoding. See
  21 +# http://www.gnu.org/software/libiconv for the list of possible encodings.
  22 +
  23 +DOXYFILE_ENCODING = UTF-8
  24 +
  25 +# The PROJECT_NAME tag is a single word (or sequence of words) that should
  26 +# identify the project. Note that if you do not use Doxywizard you need
  27 +# to put quotes around the project name if it contains spaces.
  28 +
  29 +PROJECT_NAME = "VLibras Core"
  30 +
  31 +# The PROJECT_NUMBER tag can be used to enter a project or revision number.
  32 +# This could be handy for archiving the generated documentation or
  33 +# if some version control system is used.
  34 +
  35 +PROJECT_NUMBER =
  36 +
  37 +# Using the PROJECT_BRIEF tag one can provide an optional one line description
  38 +# for a project that appears at the top of each page and should give viewer
  39 +# a quick idea about the purpose of the project. Keep the description short.
  40 +
  41 +PROJECT_BRIEF = "Ferramenta para tradução de conteúdo digital para LIBRAS"
  42 +
  43 +# With the PROJECT_LOGO tag one can specify an logo or icon that is
  44 +# included in the documentation. The maximum height of the logo should not
  45 +# exceed 55 pixels and the maximum width should not exceed 200 pixels.
  46 +# Doxygen will copy the logo to the output directory.
  47 +
  48 +PROJECT_LOGO =
  49 +
  50 +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
  51 +# base path where the generated documentation will be put.
  52 +# If a relative path is entered, it will be relative to the location
  53 +# where doxygen was started. If left blank the current directory will be used.
  54 +
  55 +OUTPUT_DIRECTORY = doc/
  56 +
  57 +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
  58 +# 4096 sub-directories (in 2 levels) under the output directory of each output
  59 +# format and will distribute the generated files over these directories.
  60 +# Enabling this option can be useful when feeding doxygen a huge amount of
  61 +# source files, where putting all generated files in the same directory would
  62 +# otherwise cause performance problems for the file system.
  63 +
  64 +CREATE_SUBDIRS = NO
  65 +
  66 +# The OUTPUT_LANGUAGE tag is used to specify the language in which all
  67 +# documentation generated by doxygen is written. Doxygen will use this
  68 +# information to generate all constant output in the proper language.
  69 +# The default language is English, other supported languages are:
  70 +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
  71 +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
  72 +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
  73 +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
  74 +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
  75 +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
  76 +
  77 +OUTPUT_LANGUAGE = Brazilian
  78 +
  79 +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
  80 +# include brief member descriptions after the members that are listed in
  81 +# the file and class documentation (similar to JavaDoc).
  82 +# Set to NO to disable this.
  83 +
  84 +BRIEF_MEMBER_DESC = YES
  85 +
  86 +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
  87 +# the brief description of a member or function before the detailed description.
  88 +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
  89 +# brief descriptions will be completely suppressed.
  90 +
  91 +REPEAT_BRIEF = YES
  92 +
  93 +# This tag implements a quasi-intelligent brief description abbreviator
  94 +# that is used to form the text in various listings. Each string
  95 +# in this list, if found as the leading text of the brief description, will be
  96 +# stripped from the text and the result after processing the whole list, is
  97 +# used as the annotated text. Otherwise, the brief description is used as-is.
  98 +# If left blank, the following values are used ("$name" is automatically
  99 +# replaced with the name of the entity): "The $name class" "The $name widget"
  100 +# "The $name file" "is" "provides" "specifies" "contains"
  101 +# "represents" "a" "an" "the"
  102 +
  103 +ABBREVIATE_BRIEF =
  104 +
  105 +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
  106 +# Doxygen will generate a detailed section even if there is only a brief
  107 +# description.
  108 +
  109 +ALWAYS_DETAILED_SEC = NO
  110 +
  111 +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
  112 +# inherited members of a class in the documentation of that class as if those
  113 +# members were ordinary class members. Constructors, destructors and assignment
  114 +# operators of the base classes will not be shown.
  115 +
  116 +INLINE_INHERITED_MEMB = NO
  117 +
  118 +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
  119 +# path before files name in the file list and in the header files. If set
  120 +# to NO the shortest path that makes the file name unique will be used.
  121 +
  122 +FULL_PATH_NAMES = YES
  123 +
  124 +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
  125 +# can be used to strip a user-defined part of the path. Stripping is
  126 +# only done if one of the specified strings matches the left-hand part of
  127 +# the path. The tag can be used to show relative paths in the file list.
  128 +# If left blank the directory from which doxygen is run is used as the
  129 +# path to strip.
  130 +
  131 +STRIP_FROM_PATH =
  132 +
  133 +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
  134 +# the path mentioned in the documentation of a class, which tells
  135 +# the reader which header file to include in order to use a class.
  136 +# If left blank only the name of the header file containing the class
  137 +# definition is used. Otherwise one should specify the include paths that
  138 +# are normally passed to the compiler using the -I flag.
  139 +
  140 +STRIP_FROM_INC_PATH =
  141 +
  142 +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
  143 +# (but less readable) file names. This can be useful if your file system
  144 +# doesn't support long names like on DOS, Mac, or CD-ROM.
  145 +
  146 +SHORT_NAMES = NO
  147 +
  148 +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
  149 +# will interpret the first line (until the first dot) of a JavaDoc-style
  150 +# comment as the brief description. If set to NO, the JavaDoc
  151 +# comments will behave just like regular Qt-style comments
  152 +# (thus requiring an explicit @brief command for a brief description.)
  153 +
  154 +JAVADOC_AUTOBRIEF = NO
  155 +
  156 +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
  157 +# interpret the first line (until the first dot) of a Qt-style
  158 +# comment as the brief description. If set to NO, the comments
  159 +# will behave just like regular Qt-style comments (thus requiring
  160 +# an explicit \brief command for a brief description.)
  161 +
  162 +QT_AUTOBRIEF = NO
  163 +
  164 +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
  165 +# treat a multi-line C++ special comment block (i.e. a block of //! or ///
  166 +# comments) as a brief description. This used to be the default behaviour.
  167 +# The new default is to treat a multi-line C++ comment block as a detailed
  168 +# description. Set this tag to YES if you prefer the old behaviour instead.
  169 +
  170 +MULTILINE_CPP_IS_BRIEF = NO
  171 +
  172 +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
  173 +# member inherits the documentation from any documented member that it
  174 +# re-implements.
  175 +
  176 +INHERIT_DOCS = YES
  177 +
  178 +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
  179 +# a new page for each member. If set to NO, the documentation of a member will
  180 +# be part of the file/class/namespace that contains it.
  181 +
  182 +SEPARATE_MEMBER_PAGES = NO
  183 +
  184 +# The TAB_SIZE tag can be used to set the number of spaces in a tab.
  185 +# Doxygen uses this value to replace tabs by spaces in code fragments.
  186 +
  187 +TAB_SIZE = 8
  188 +
  189 +# This tag can be used to specify a number of aliases that acts
  190 +# as commands in the documentation. An alias has the form "name=value".
  191 +# For example adding "sideeffect=\par Side Effects:\n" will allow you to
  192 +# put the command \sideeffect (or @sideeffect) in the documentation, which
  193 +# will result in a user-defined paragraph with heading "Side Effects:".
  194 +# You can put \n's in the value part of an alias to insert newlines.
  195 +
  196 +ALIASES =
  197 +
  198 +# This tag can be used to specify a number of word-keyword mappings (TCL only).
  199 +# A mapping has the form "name=value". For example adding
  200 +# "class=itcl::class" will allow you to use the command class in the
  201 +# itcl::class meaning.
  202 +
  203 +TCL_SUBST =
  204 +
  205 +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
  206 +# sources only. Doxygen will then generate output that is more tailored for C.
  207 +# For instance, some of the names that are used will be different. The list
  208 +# of all members will be omitted, etc.
  209 +
  210 +OPTIMIZE_OUTPUT_FOR_C = NO
  211 +
  212 +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
  213 +# sources only. Doxygen will then generate output that is more tailored for
  214 +# Java. For instance, namespaces will be presented as packages, qualified
  215 +# scopes will look different, etc.
  216 +
  217 +OPTIMIZE_OUTPUT_JAVA = NO
  218 +
  219 +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
  220 +# sources only. Doxygen will then generate output that is more tailored for
  221 +# Fortran.
  222 +
  223 +OPTIMIZE_FOR_FORTRAN = NO
  224 +
  225 +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
  226 +# sources. Doxygen will then generate output that is tailored for
  227 +# VHDL.
  228 +
  229 +OPTIMIZE_OUTPUT_VHDL = NO
  230 +
  231 +# Doxygen selects the parser to use depending on the extension of the files it
  232 +# parses. With this tag you can assign which parser to use for a given extension.
  233 +# Doxygen has a built-in mapping, but you can override or extend it using this
  234 +# tag. The format is ext=language, where ext is a file extension, and language
  235 +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
  236 +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
  237 +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
  238 +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
  239 +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
  240 +
  241 +EXTENSION_MAPPING =
  242 +
  243 +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
  244 +# to include (a tag file for) the STL sources as input, then you should
  245 +# set this tag to YES in order to let doxygen match functions declarations and
  246 +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
  247 +# func(std::string) {}). This also makes the inheritance and collaboration
  248 +# diagrams that involve STL classes more complete and accurate.
  249 +
  250 +BUILTIN_STL_SUPPORT = NO
  251 +
  252 +# If you use Microsoft's C++/CLI language, you should set this option to YES to
  253 +# enable parsing support.
  254 +
  255 +CPP_CLI_SUPPORT = NO
  256 +
  257 +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
  258 +# Doxygen will parse them like normal C++ but will assume all classes use public
  259 +# instead of private inheritance when no explicit protection keyword is present.
  260 +
  261 +SIP_SUPPORT = NO
  262 +
  263 +# For Microsoft's IDL there are propget and propput attributes to indicate getter
  264 +# and setter methods for a property. Setting this option to YES (the default)
  265 +# will make doxygen replace the get and set methods by a property in the
  266 +# documentation. This will only work if the methods are indeed getting or
  267 +# setting a simple type. If this is not the case, or you want to show the
  268 +# methods anyway, you should set this option to NO.
  269 +
  270 +IDL_PROPERTY_SUPPORT = YES
  271 +
  272 +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
  273 +# tag is set to YES, then doxygen will reuse the documentation of the first
  274 +# member in the group (if any) for the other members of the group. By default
  275 +# all members of a group must be documented explicitly.
  276 +
  277 +DISTRIBUTE_GROUP_DOC = NO
  278 +
  279 +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
  280 +# the same type (for instance a group of public functions) to be put as a
  281 +# subgroup of that type (e.g. under the Public Functions section). Set it to
  282 +# NO to prevent subgrouping. Alternatively, this can be done per class using
  283 +# the \nosubgrouping command.
  284 +
  285 +SUBGROUPING = YES
  286 +
  287 +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
  288 +# unions are shown inside the group in which they are included (e.g. using
  289 +# @ingroup) instead of on a separate page (for HTML and Man pages) or
  290 +# section (for LaTeX and RTF).
  291 +
  292 +INLINE_GROUPED_CLASSES = NO
  293 +
  294 +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
  295 +# unions with only public data fields will be shown inline in the documentation
  296 +# of the scope in which they are defined (i.e. file, namespace, or group
  297 +# documentation), provided this scope is documented. If set to NO (the default),
  298 +# structs, classes, and unions are shown on a separate page (for HTML and Man
  299 +# pages) or section (for LaTeX and RTF).
  300 +
  301 +INLINE_SIMPLE_STRUCTS = NO
  302 +
  303 +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
  304 +# is documented as struct, union, or enum with the name of the typedef. So
  305 +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
  306 +# with name TypeT. When disabled the typedef will appear as a member of a file,
  307 +# namespace, or class. And the struct will be named TypeS. This can typically
  308 +# be useful for C code in case the coding convention dictates that all compound
  309 +# types are typedef'ed and only the typedef is referenced, never the tag name.
  310 +
  311 +TYPEDEF_HIDES_STRUCT = NO
  312 +
  313 +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
  314 +# determine which symbols to keep in memory and which to flush to disk.
  315 +# When the cache is full, less often used symbols will be written to disk.
  316 +# For small to medium size projects (<1000 input files) the default value is
  317 +# probably good enough. For larger projects a too small cache size can cause
  318 +# doxygen to be busy swapping symbols to and from disk most of the time
  319 +# causing a significant performance penalty.
  320 +# If the system has enough physical memory increasing the cache will improve the
  321 +# performance by keeping more symbols in memory. Note that the value works on
  322 +# a logarithmic scale so increasing the size by one will roughly double the
  323 +# memory usage. The cache size is given by this formula:
  324 +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
  325 +# corresponding to a cache size of 2^16 = 65536 symbols.
  326 +
  327 +SYMBOL_CACHE_SIZE = 0
  328 +
  329 +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
  330 +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
  331 +# their name and scope. Since this can be an expensive process and often the
  332 +# same symbol appear multiple times in the code, doxygen keeps a cache of
  333 +# pre-resolved symbols. If the cache is too small doxygen will become slower.
  334 +# If the cache is too large, memory is wasted. The cache size is given by this
  335 +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,
  336 +# corresponding to a cache size of 2^16 = 65536 symbols.
  337 +
  338 +LOOKUP_CACHE_SIZE = 0
  339 +
  340 +#---------------------------------------------------------------------------
  341 +# Build related configuration options
  342 +#---------------------------------------------------------------------------
  343 +
  344 +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
  345 +# documentation are documented, even if no documentation was available.
  346 +# Private class members and static file members will be hidden unless
  347 +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
  348 +
  349 +EXTRACT_ALL = NO
  350 +
  351 +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
  352 +# will be included in the documentation.
  353 +
  354 +EXTRACT_PRIVATE = NO
  355 +
  356 +# If the EXTRACT_STATIC tag is set to YES all static members of a file
  357 +# will be included in the documentation.
  358 +
  359 +EXTRACT_STATIC = NO
  360 +
  361 +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
  362 +# defined locally in source files will be included in the documentation.
  363 +# If set to NO only classes defined in header files are included.
  364 +
  365 +EXTRACT_LOCAL_CLASSES = YES
  366 +
  367 +# This flag is only useful for Objective-C code. When set to YES local
  368 +# methods, which are defined in the implementation section but not in
  369 +# the interface are included in the documentation.
  370 +# If set to NO (the default) only methods in the interface are included.
  371 +
  372 +EXTRACT_LOCAL_METHODS = NO
  373 +
  374 +# If this flag is set to YES, the members of anonymous namespaces will be
  375 +# extracted and appear in the documentation as a namespace called
  376 +# 'anonymous_namespace{file}', where file will be replaced with the base
  377 +# name of the file that contains the anonymous namespace. By default
  378 +# anonymous namespaces are hidden.
  379 +
  380 +EXTRACT_ANON_NSPACES = NO
  381 +
  382 +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
  383 +# undocumented members of documented classes, files or namespaces.
  384 +# If set to NO (the default) these members will be included in the
  385 +# various overviews, but no documentation section is generated.
  386 +# This option has no effect if EXTRACT_ALL is enabled.
  387 +
  388 +HIDE_UNDOC_MEMBERS = NO
  389 +
  390 +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
  391 +# undocumented classes that are normally visible in the class hierarchy.
  392 +# If set to NO (the default) these classes will be included in the various
  393 +# overviews. This option has no effect if EXTRACT_ALL is enabled.
  394 +
  395 +HIDE_UNDOC_CLASSES = NO
  396 +
  397 +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
  398 +# friend (class|struct|union) declarations.
  399 +# If set to NO (the default) these declarations will be included in the
  400 +# documentation.
  401 +
  402 +HIDE_FRIEND_COMPOUNDS = NO
  403 +
  404 +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
  405 +# documentation blocks found inside the body of a function.
  406 +# If set to NO (the default) these blocks will be appended to the
  407 +# function's detailed documentation block.
  408 +
  409 +HIDE_IN_BODY_DOCS = NO
  410 +
  411 +# The INTERNAL_DOCS tag determines if documentation
  412 +# that is typed after a \internal command is included. If the tag is set
  413 +# to NO (the default) then the documentation will be excluded.
  414 +# Set it to YES to include the internal documentation.
  415 +
  416 +INTERNAL_DOCS = NO
  417 +
  418 +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
  419 +# file names in lower-case letters. If set to YES upper-case letters are also
  420 +# allowed. This is useful if you have classes or files whose names only differ
  421 +# in case and if your file system supports case sensitive file names. Windows
  422 +# and Mac users are advised to set this option to NO.
  423 +
  424 +CASE_SENSE_NAMES = YES
  425 +
  426 +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
  427 +# will show members with their full class and namespace scopes in the
  428 +# documentation. If set to YES the scope will be hidden.
  429 +
  430 +HIDE_SCOPE_NAMES = NO
  431 +
  432 +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
  433 +# will put a list of the files that are included by a file in the documentation
  434 +# of that file.
  435 +
  436 +SHOW_INCLUDE_FILES = YES
  437 +
  438 +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
  439 +# will list include files with double quotes in the documentation
  440 +# rather than with sharp brackets.
  441 +
  442 +FORCE_LOCAL_INCLUDES = NO
  443 +
  444 +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
  445 +# is inserted in the documentation for inline members.
  446 +
  447 +INLINE_INFO = YES
  448 +
  449 +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
  450 +# will sort the (detailed) documentation of file and class members
  451 +# alphabetically by member name. If set to NO the members will appear in
  452 +# declaration order.
  453 +
  454 +SORT_MEMBER_DOCS = YES
  455 +
  456 +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
  457 +# brief documentation of file, namespace and class members alphabetically
  458 +# by member name. If set to NO (the default) the members will appear in
  459 +# declaration order.
  460 +
  461 +SORT_BRIEF_DOCS = NO
  462 +
  463 +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
  464 +# will sort the (brief and detailed) documentation of class members so that
  465 +# constructors and destructors are listed first. If set to NO (the default)
  466 +# the constructors will appear in the respective orders defined by
  467 +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
  468 +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
  469 +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
  470 +
  471 +SORT_MEMBERS_CTORS_1ST = NO
  472 +
  473 +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
  474 +# hierarchy of group names into alphabetical order. If set to NO (the default)
  475 +# the group names will appear in their defined order.
  476 +
  477 +SORT_GROUP_NAMES = NO
  478 +
  479 +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
  480 +# sorted by fully-qualified names, including namespaces. If set to
  481 +# NO (the default), the class list will be sorted only by class name,
  482 +# not including the namespace part.
  483 +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
  484 +# Note: This option applies only to the class list, not to the
  485 +# alphabetical list.
  486 +
  487 +SORT_BY_SCOPE_NAME = NO
  488 +
  489 +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
  490 +# do proper type resolution of all parameters of a function it will reject a
  491 +# match between the prototype and the implementation of a member function even
  492 +# if there is only one candidate or it is obvious which candidate to choose
  493 +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
  494 +# will still accept a match between prototype and implementation in such cases.
  495 +
  496 +STRICT_PROTO_MATCHING = NO
  497 +
  498 +# The GENERATE_TODOLIST tag can be used to enable (YES) or
  499 +# disable (NO) the todo list. This list is created by putting \todo
  500 +# commands in the documentation.
  501 +
  502 +GENERATE_TODOLIST = YES
  503 +
  504 +# The GENERATE_TESTLIST tag can be used to enable (YES) or
  505 +# disable (NO) the test list. This list is created by putting \test
  506 +# commands in the documentation.
  507 +
  508 +GENERATE_TESTLIST = YES
  509 +
  510 +# The GENERATE_BUGLIST tag can be used to enable (YES) or
  511 +# disable (NO) the bug list. This list is created by putting \bug
  512 +# commands in the documentation.
  513 +
  514 +GENERATE_BUGLIST = YES
  515 +
  516 +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
  517 +# disable (NO) the deprecated list. This list is created by putting
  518 +# \deprecated commands in the documentation.
  519 +
  520 +GENERATE_DEPRECATEDLIST= YES
  521 +
  522 +# The ENABLED_SECTIONS tag can be used to enable conditional
  523 +# documentation sections, marked by \if sectionname ... \endif.
  524 +
  525 +ENABLED_SECTIONS =
  526 +
  527 +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
  528 +# the initial value of a variable or macro consists of for it to appear in
  529 +# the documentation. If the initializer consists of more lines than specified
  530 +# here it will be hidden. Use a value of 0 to hide initializers completely.
  531 +# The appearance of the initializer of individual variables and macros in the
  532 +# documentation can be controlled using \showinitializer or \hideinitializer
  533 +# command in the documentation regardless of this setting.
  534 +
  535 +MAX_INITIALIZER_LINES = 30
  536 +
  537 +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
  538 +# at the bottom of the documentation of classes and structs. If set to YES the
  539 +# list will mention the files that were used to generate the documentation.
  540 +
  541 +SHOW_USED_FILES = YES
  542 +
  543 +# If the sources in your project are distributed over multiple directories
  544 +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
  545 +# in the documentation. The default is NO.
  546 +
  547 +SHOW_DIRECTORIES = NO
  548 +
  549 +# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
  550 +# This will remove the Files entry from the Quick Index and from the
  551 +# Folder Tree View (if specified). The default is YES.
  552 +
  553 +SHOW_FILES = YES
  554 +
  555 +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
  556 +# Namespaces page.
  557 +# This will remove the Namespaces entry from the Quick Index
  558 +# and from the Folder Tree View (if specified). The default is YES.
  559 +
  560 +SHOW_NAMESPACES = YES
  561 +
  562 +# The FILE_VERSION_FILTER tag can be used to specify a program or script that
  563 +# doxygen should invoke to get the current version for each file (typically from
  564 +# the version control system). Doxygen will invoke the program by executing (via
  565 +# popen()) the command <command> <input-file>, where <command> is the value of
  566 +# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
  567 +# provided by doxygen. Whatever the program writes to standard output
  568 +# is used as the file version. See the manual for examples.
  569 +
  570 +FILE_VERSION_FILTER =
  571 +
  572 +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
  573 +# by doxygen. The layout file controls the global structure of the generated
  574 +# output files in an output format independent way. The create the layout file
  575 +# that represents doxygen's defaults, run doxygen with the -l option.
  576 +# You can optionally specify a file name after the option, if omitted
  577 +# DoxygenLayout.xml will be used as the name of the layout file.
  578 +
  579 +LAYOUT_FILE =
  580 +
  581 +# The CITE_BIB_FILES tag can be used to specify one or more bib files
  582 +# containing the references data. This must be a list of .bib files. The
  583 +# .bib extension is automatically appended if omitted. Using this command
  584 +# requires the bibtex tool to be installed. See also
  585 +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
  586 +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
  587 +# feature you need bibtex and perl available in the search path.
  588 +
  589 +CITE_BIB_FILES =
  590 +
  591 +#---------------------------------------------------------------------------
  592 +# configuration options related to warning and progress messages
  593 +#---------------------------------------------------------------------------
  594 +
  595 +# The QUIET tag can be used to turn on/off the messages that are generated
  596 +# by doxygen. Possible values are YES and NO. If left blank NO is used.
  597 +
  598 +QUIET = NO
  599 +
  600 +# The WARNINGS tag can be used to turn on/off the warning messages that are
  601 +# generated by doxygen. Possible values are YES and NO. If left blank
  602 +# NO is used.
  603 +
  604 +WARNINGS = YES
  605 +
  606 +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
  607 +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
  608 +# automatically be disabled.
  609 +
  610 +WARN_IF_UNDOCUMENTED = YES
  611 +
  612 +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
  613 +# potential errors in the documentation, such as not documenting some
  614 +# parameters in a documented function, or documenting parameters that
  615 +# don't exist or using markup commands wrongly.
  616 +
  617 +WARN_IF_DOC_ERROR = YES
  618 +
  619 +# The WARN_NO_PARAMDOC option can be enabled to get warnings for
  620 +# functions that are documented, but have no documentation for their parameters
  621 +# or return value. If set to NO (the default) doxygen will only warn about
  622 +# wrong or incomplete parameter documentation, but not about the absence of
  623 +# documentation.
  624 +
  625 +WARN_NO_PARAMDOC = NO
  626 +
  627 +# The WARN_FORMAT tag determines the format of the warning messages that
  628 +# doxygen can produce. The string should contain the $file, $line, and $text
  629 +# tags, which will be replaced by the file and line number from which the
  630 +# warning originated and the warning text. Optionally the format may contain
  631 +# $version, which will be replaced by the version of the file (if it could
  632 +# be obtained via FILE_VERSION_FILTER)
  633 +
  634 +WARN_FORMAT = "$file:$line: $text"
  635 +
  636 +# The WARN_LOGFILE tag can be used to specify a file to which warning
  637 +# and error messages should be written. If left blank the output is written
  638 +# to stderr.
  639 +
  640 +WARN_LOGFILE =
  641 +
  642 +#---------------------------------------------------------------------------
  643 +# configuration options related to the input files
  644 +#---------------------------------------------------------------------------
  645 +
  646 +# The INPUT tag can be used to specify the files and/or directories that contain
  647 +# documented source files. You may enter file names like "myfile.cpp" or
  648 +# directories like "/usr/src/myproject". Separate the files or directories
  649 +# with spaces.
  650 +
  651 +INPUT = extrator/src/include servico/src/include renderer/src/include mixer/src/include util/src/include tradutor/src/include
  652 +
  653 +# This tag can be used to specify the character encoding of the source files
  654 +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
  655 +# also the default input encoding. Doxygen uses libiconv (or the iconv built
  656 +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
  657 +# the list of possible encodings.
  658 +
  659 +INPUT_ENCODING = UTF-8
  660 +
  661 +# If the value of the INPUT tag contains directories, you can use the
  662 +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
  663 +# and *.h) to filter out the source-files in the directories. If left
  664 +# blank the following patterns are tested:
  665 +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
  666 +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
  667 +# *.f90 *.f *.for *.vhd *.vhdl
  668 +
  669 +FILE_PATTERNS =
  670 +
  671 +# The RECURSIVE tag can be used to turn specify whether or not subdirectories
  672 +# should be searched for input files as well. Possible values are YES and NO.
  673 +# If left blank NO is used.
  674 +
  675 +RECURSIVE = NO
  676 +
  677 +# The EXCLUDE tag can be used to specify files and/or directories that should be
  678 +# excluded from the INPUT source files. This way you can easily exclude a
  679 +# subdirectory from a directory tree whose root is specified with the INPUT tag.
  680 +# Note that relative paths are relative to the directory from which doxygen is
  681 +# run.
  682 +
  683 +EXCLUDE =
  684 +
  685 +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
  686 +# directories that are symbolic links (a Unix file system feature) are excluded
  687 +# from the input.
  688 +
  689 +EXCLUDE_SYMLINKS = NO
  690 +
  691 +# If the value of the INPUT tag contains directories, you can use the
  692 +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
  693 +# certain files from those directories. Note that the wildcards are matched
  694 +# against the file with absolute path, so to exclude all test directories
  695 +# for example use the pattern */test/*
  696 +
  697 +EXCLUDE_PATTERNS =
  698 +
  699 +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
  700 +# (namespaces, classes, functions, etc.) that should be excluded from the
  701 +# output. The symbol name can be a fully qualified name, a word, or if the
  702 +# wildcard * is used, a substring. Examples: ANamespace, AClass,
  703 +# AClass::ANamespace, ANamespace::*Test
  704 +
  705 +EXCLUDE_SYMBOLS =
  706 +
  707 +# The EXAMPLE_PATH tag can be used to specify one or more files or
  708 +# directories that contain example code fragments that are included (see
  709 +# the \include command).
  710 +
  711 +EXAMPLE_PATH =
  712 +
  713 +# If the value of the EXAMPLE_PATH tag contains directories, you can use the
  714 +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
  715 +# and *.h) to filter out the source-files in the directories. If left
  716 +# blank all files are included.
  717 +
  718 +EXAMPLE_PATTERNS =
  719 +
  720 +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
  721 +# searched for input files to be used with the \include or \dontinclude
  722 +# commands irrespective of the value of the RECURSIVE tag.
  723 +# Possible values are YES and NO. If left blank NO is used.
  724 +
  725 +EXAMPLE_RECURSIVE = NO
  726 +
  727 +# The IMAGE_PATH tag can be used to specify one or more files or
  728 +# directories that contain image that are included in the documentation (see
  729 +# the \image command).
  730 +
  731 +IMAGE_PATH =
  732 +
  733 +# The INPUT_FILTER tag can be used to specify a program that doxygen should
  734 +# invoke to filter for each input file. Doxygen will invoke the filter program
  735 +# by executing (via popen()) the command <filter> <input-file>, where <filter>
  736 +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
  737 +# input file. Doxygen will then use the output that the filter program writes
  738 +# to standard output.
  739 +# If FILTER_PATTERNS is specified, this tag will be
  740 +# ignored.
  741 +
  742 +INPUT_FILTER =
  743 +
  744 +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
  745 +# basis.
  746 +# Doxygen will compare the file name with each pattern and apply the
  747 +# filter if there is a match.
  748 +# The filters are a list of the form:
  749 +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
  750 +# info on how filters are used. If FILTER_PATTERNS is empty or if
  751 +# non of the patterns match the file name, INPUT_FILTER is applied.
  752 +
  753 +FILTER_PATTERNS =
  754 +
  755 +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
  756 +# INPUT_FILTER) will be used to filter the input files when producing source
  757 +# files to browse (i.e. when SOURCE_BROWSER is set to YES).
  758 +
  759 +FILTER_SOURCE_FILES = NO
  760 +
  761 +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
  762 +# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
  763 +# and it is also possible to disable source filtering for a specific pattern
  764 +# using *.ext= (so without naming a filter). This option only has effect when
  765 +# FILTER_SOURCE_FILES is enabled.
  766 +
  767 +FILTER_SOURCE_PATTERNS =
  768 +
  769 +#---------------------------------------------------------------------------
  770 +# configuration options related to source browsing
  771 +#---------------------------------------------------------------------------
  772 +
  773 +# If the SOURCE_BROWSER tag is set to YES then a list of source files will
  774 +# be generated. Documented entities will be cross-referenced with these sources.
  775 +# Note: To get rid of all source code in the generated output, make sure also
  776 +# VERBATIM_HEADERS is set to NO.
  777 +
  778 +SOURCE_BROWSER = NO
  779 +
  780 +# Setting the INLINE_SOURCES tag to YES will include the body
  781 +# of functions and classes directly in the documentation.
  782 +
  783 +INLINE_SOURCES = NO
  784 +
  785 +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
  786 +# doxygen to hide any special comment blocks from generated source code
  787 +# fragments. Normal C and C++ comments will always remain visible.
  788 +
  789 +STRIP_CODE_COMMENTS = YES
  790 +
  791 +# If the REFERENCED_BY_RELATION tag is set to YES
  792 +# then for each documented function all documented
  793 +# functions referencing it will be listed.
  794 +
  795 +REFERENCED_BY_RELATION = NO
  796 +
  797 +# If the REFERENCES_RELATION tag is set to YES
  798 +# then for each documented function all documented entities
  799 +# called/used by that function will be listed.
  800 +
  801 +REFERENCES_RELATION = NO
  802 +
  803 +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
  804 +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
  805 +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
  806 +# link to the source code.
  807 +# Otherwise they will link to the documentation.
  808 +
  809 +REFERENCES_LINK_SOURCE = YES
  810 +
  811 +# If the USE_HTAGS tag is set to YES then the references to source code
  812 +# will point to the HTML generated by the htags(1) tool instead of doxygen
  813 +# built-in source browser. The htags tool is part of GNU's global source
  814 +# tagging system (see http://www.gnu.org/software/global/global.html). You
  815 +# will need version 4.8.6 or higher.
  816 +
  817 +USE_HTAGS = NO
  818 +
  819 +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
  820 +# will generate a verbatim copy of the header file for each class for
  821 +# which an include is specified. Set to NO to disable this.
  822 +
  823 +VERBATIM_HEADERS = YES
  824 +
  825 +#---------------------------------------------------------------------------
  826 +# configuration options related to the alphabetical class index
  827 +#---------------------------------------------------------------------------
  828 +
  829 +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
  830 +# of all compounds will be generated. Enable this if the project
  831 +# contains a lot of classes, structs, unions or interfaces.
  832 +
  833 +ALPHABETICAL_INDEX = YES
  834 +
  835 +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
  836 +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
  837 +# in which this list will be split (can be a number in the range [1..20])
  838 +
  839 +COLS_IN_ALPHA_INDEX = 5
  840 +
  841 +# In case all classes in a project start with a common prefix, all
  842 +# classes will be put under the same header in the alphabetical index.
  843 +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
  844 +# should be ignored while generating the index headers.
  845 +
  846 +IGNORE_PREFIX =
  847 +
  848 +#---------------------------------------------------------------------------
  849 +# configuration options related to the HTML output
  850 +#---------------------------------------------------------------------------
  851 +
  852 +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
  853 +# generate HTML output.
  854 +
  855 +GENERATE_HTML = YES
  856 +
  857 +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
  858 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be
  859 +# put in front of it. If left blank `html' will be used as the default path.
  860 +
  861 +HTML_OUTPUT = html
  862 +
  863 +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
  864 +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
  865 +# doxygen will generate files with .html extension.
  866 +
  867 +HTML_FILE_EXTENSION = .html
  868 +
  869 +# The HTML_HEADER tag can be used to specify a personal HTML header for
  870 +# each generated HTML page. If it is left blank doxygen will generate a
  871 +# standard header. Note that when using a custom header you are responsible
  872 +# for the proper inclusion of any scripts and style sheets that doxygen
  873 +# needs, which is dependent on the configuration options used.
  874 +# It is advised to generate a default header using "doxygen -w html
  875 +# header.html footer.html stylesheet.css YourConfigFile" and then modify
  876 +# that header. Note that the header is subject to change so you typically
  877 +# have to redo this when upgrading to a newer version of doxygen or when
  878 +# changing the value of configuration settings such as GENERATE_TREEVIEW!
  879 +
  880 +HTML_HEADER =
  881 +
  882 +# The HTML_FOOTER tag can be used to specify a personal HTML footer for
  883 +# each generated HTML page. If it is left blank doxygen will generate a
  884 +# standard footer.
  885 +
  886 +HTML_FOOTER =
  887 +
  888 +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
  889 +# style sheet that is used by each HTML page. It can be used to
  890 +# fine-tune the look of the HTML output. If the tag is left blank doxygen
  891 +# will generate a default style sheet. Note that doxygen will try to copy
  892 +# the style sheet file to the HTML output directory, so don't put your own
  893 +# style sheet in the HTML output directory as well, or it will be erased!
  894 +
  895 +HTML_STYLESHEET =
  896 +
  897 +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
  898 +# other source files which should be copied to the HTML output directory. Note
  899 +# that these files will be copied to the base HTML output directory. Use the
  900 +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
  901 +# files. In the HTML_STYLESHEET file, use the file name only. Also note that
  902 +# the files will be copied as-is; there are no commands or markers available.
  903 +
  904 +HTML_EXTRA_FILES =
  905 +
  906 +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
  907 +# Doxygen will adjust the colors in the style sheet and background images
  908 +# according to this color. Hue is specified as an angle on a colorwheel,
  909 +# see http://en.wikipedia.org/wiki/Hue for more information.
  910 +# For instance the value 0 represents red, 60 is yellow, 120 is green,
  911 +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
  912 +# The allowed range is 0 to 359.
  913 +
  914 +HTML_COLORSTYLE_HUE = 220
  915 +
  916 +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
  917 +# the colors in the HTML output. For a value of 0 the output will use
  918 +# grayscales only. A value of 255 will produce the most vivid colors.
  919 +
  920 +HTML_COLORSTYLE_SAT = 100
  921 +
  922 +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
  923 +# the luminance component of the colors in the HTML output. Values below
  924 +# 100 gradually make the output lighter, whereas values above 100 make
  925 +# the output darker. The value divided by 100 is the actual gamma applied,
  926 +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
  927 +# and 100 does not change the gamma.
  928 +
  929 +HTML_COLORSTYLE_GAMMA = 80
  930 +
  931 +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
  932 +# page will contain the date and time when the page was generated. Setting
  933 +# this to NO can help when comparing the output of multiple runs.
  934 +
  935 +HTML_TIMESTAMP = YES
  936 +
  937 +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
  938 +# files or namespaces will be aligned in HTML using tables. If set to
  939 +# NO a bullet list will be used.
  940 +
  941 +HTML_ALIGN_MEMBERS = YES
  942 +
  943 +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
  944 +# documentation will contain sections that can be hidden and shown after the
  945 +# page has loaded. For this to work a browser that supports
  946 +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
  947 +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
  948 +
  949 +HTML_DYNAMIC_SECTIONS = NO
  950 +
  951 +# If the GENERATE_DOCSET tag is set to YES, additional index files
  952 +# will be generated that can be used as input for Apple's Xcode 3
  953 +# integrated development environment, introduced with OSX 10.5 (Leopard).
  954 +# To create a documentation set, doxygen will generate a Makefile in the
  955 +# HTML output directory. Running make will produce the docset in that
  956 +# directory and running "make install" will install the docset in
  957 +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
  958 +# it at startup.
  959 +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
  960 +# for more information.
  961 +
  962 +GENERATE_DOCSET = NO
  963 +
  964 +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
  965 +# feed. A documentation feed provides an umbrella under which multiple
  966 +# documentation sets from a single provider (such as a company or product suite)
  967 +# can be grouped.
  968 +
  969 +DOCSET_FEEDNAME = "Doxygen generated docs"
  970 +
  971 +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
  972 +# should uniquely identify the documentation set bundle. This should be a
  973 +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
  974 +# will append .docset to the name.
  975 +
  976 +DOCSET_BUNDLE_ID = org.doxygen.Project
  977 +
  978 +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
  979 +# the documentation publisher. This should be a reverse domain-name style
  980 +# string, e.g. com.mycompany.MyDocSet.documentation.
  981 +
  982 +DOCSET_PUBLISHER_ID = org.doxygen.Publisher
  983 +
  984 +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
  985 +
  986 +DOCSET_PUBLISHER_NAME = Publisher
  987 +
  988 +# If the GENERATE_HTMLHELP tag is set to YES, additional index files
  989 +# will be generated that can be used as input for tools like the
  990 +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
  991 +# of the generated HTML documentation.
  992 +
  993 +GENERATE_HTMLHELP = NO
  994 +
  995 +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
  996 +# be used to specify the file name of the resulting .chm file. You
  997 +# can add a path in front of the file if the result should not be
  998 +# written to the html output directory.
  999 +
  1000 +CHM_FILE =
  1001 +
  1002 +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
  1003 +# be used to specify the location (absolute path including file name) of
  1004 +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
  1005 +# the HTML help compiler on the generated index.hhp.
  1006 +
  1007 +HHC_LOCATION =
  1008 +
  1009 +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
  1010 +# controls if a separate .chi index file is generated (YES) or that
  1011 +# it should be included in the master .chm file (NO).
  1012 +
  1013 +GENERATE_CHI = NO
  1014 +
  1015 +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
  1016 +# is used to encode HtmlHelp index (hhk), content (hhc) and project file
  1017 +# content.
  1018 +
  1019 +CHM_INDEX_ENCODING =
  1020 +
  1021 +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
  1022 +# controls whether a binary table of contents is generated (YES) or a
  1023 +# normal table of contents (NO) in the .chm file.
  1024 +
  1025 +BINARY_TOC = NO
  1026 +
  1027 +# The TOC_EXPAND flag can be set to YES to add extra items for group members
  1028 +# to the contents of the HTML help documentation and to the tree view.
  1029 +
  1030 +TOC_EXPAND = NO
  1031 +
  1032 +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
  1033 +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
  1034 +# that can be used as input for Qt's qhelpgenerator to generate a
  1035 +# Qt Compressed Help (.qch) of the generated HTML documentation.
  1036 +
  1037 +GENERATE_QHP = NO
  1038 +
  1039 +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
  1040 +# be used to specify the file name of the resulting .qch file.
  1041 +# The path specified is relative to the HTML output folder.
  1042 +
  1043 +QCH_FILE =
  1044 +
  1045 +# The QHP_NAMESPACE tag specifies the namespace to use when generating
  1046 +# Qt Help Project output. For more information please see
  1047 +# http://doc.trolltech.com/qthelpproject.html#namespace
  1048 +
  1049 +QHP_NAMESPACE = org.doxygen.Project
  1050 +
  1051 +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
  1052 +# Qt Help Project output. For more information please see
  1053 +# http://doc.trolltech.com/qthelpproject.html#virtual-folders
  1054 +
  1055 +QHP_VIRTUAL_FOLDER = doc
  1056 +
  1057 +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
  1058 +# add. For more information please see
  1059 +# http://doc.trolltech.com/qthelpproject.html#custom-filters
  1060 +
  1061 +QHP_CUST_FILTER_NAME =
  1062 +
  1063 +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
  1064 +# custom filter to add. For more information please see
  1065 +# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
  1066 +# Qt Help Project / Custom Filters</a>.
  1067 +
  1068 +QHP_CUST_FILTER_ATTRS =
  1069 +
  1070 +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
  1071 +# project's
  1072 +# filter section matches.
  1073 +# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
  1074 +# Qt Help Project / Filter Attributes</a>.
  1075 +
  1076 +QHP_SECT_FILTER_ATTRS =
  1077 +
  1078 +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
  1079 +# be used to specify the location of Qt's qhelpgenerator.
  1080 +# If non-empty doxygen will try to run qhelpgenerator on the generated
  1081 +# .qhp file.
  1082 +
  1083 +QHG_LOCATION =
  1084 +
  1085 +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
  1086 +# will be generated, which together with the HTML files, form an Eclipse help
  1087 +# plugin. To install this plugin and make it available under the help contents
  1088 +# menu in Eclipse, the contents of the directory containing the HTML and XML
  1089 +# files needs to be copied into the plugins directory of eclipse. The name of
  1090 +# the directory within the plugins directory should be the same as
  1091 +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
  1092 +# the help appears.
  1093 +
  1094 +GENERATE_ECLIPSEHELP = NO
  1095 +
  1096 +# A unique identifier for the eclipse help plugin. When installing the plugin
  1097 +# the directory name containing the HTML and XML files should also have
  1098 +# this name.
  1099 +
  1100 +ECLIPSE_DOC_ID = org.doxygen.Project
  1101 +
  1102 +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
  1103 +# at top of each HTML page. The value NO (the default) enables the index and
  1104 +# the value YES disables it. Since the tabs have the same information as the
  1105 +# navigation tree you can set this option to NO if you already set
  1106 +# GENERATE_TREEVIEW to YES.
  1107 +
  1108 +DISABLE_INDEX = NO
  1109 +
  1110 +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
  1111 +# structure should be generated to display hierarchical information.
  1112 +# If the tag value is set to YES, a side panel will be generated
  1113 +# containing a tree-like index structure (just like the one that
  1114 +# is generated for HTML Help). For this to work a browser that supports
  1115 +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
  1116 +# Windows users are probably better off using the HTML help feature.
  1117 +# Since the tree basically has the same information as the tab index you
  1118 +# could consider to set DISABLE_INDEX to NO when enabling this option.
  1119 +
  1120 +GENERATE_TREEVIEW = NO
  1121 +
  1122 +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
  1123 +# (range [0,1..20]) that doxygen will group on one line in the generated HTML
  1124 +# documentation. Note that a value of 0 will completely suppress the enum
  1125 +# values from appearing in the overview section.
  1126 +
  1127 +ENUM_VALUES_PER_LINE = 4
  1128 +
  1129 +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
  1130 +# and Class Hierarchy pages using a tree view instead of an ordered list.
  1131 +
  1132 +USE_INLINE_TREES = NO
  1133 +
  1134 +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
  1135 +# used to set the initial width (in pixels) of the frame in which the tree
  1136 +# is shown.
  1137 +
  1138 +TREEVIEW_WIDTH = 250
  1139 +
  1140 +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
  1141 +# links to external symbols imported via tag files in a separate window.
  1142 +
  1143 +EXT_LINKS_IN_WINDOW = NO
  1144 +
  1145 +# Use this tag to change the font size of Latex formulas included
  1146 +# as images in the HTML documentation. The default is 10. Note that
  1147 +# when you change the font size after a successful doxygen run you need
  1148 +# to manually remove any form_*.png images from the HTML output directory
  1149 +# to force them to be regenerated.
  1150 +
  1151 +FORMULA_FONTSIZE = 10
  1152 +
  1153 +# Use the FORMULA_TRANPARENT tag to determine whether or not the images
  1154 +# generated for formulas are transparent PNGs. Transparent PNGs are
  1155 +# not supported properly for IE 6.0, but are supported on all modern browsers.
  1156 +# Note that when changing this option you need to delete any form_*.png files
  1157 +# in the HTML output before the changes have effect.
  1158 +
  1159 +FORMULA_TRANSPARENT = YES
  1160 +
  1161 +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
  1162 +# (see http://www.mathjax.org) which uses client side Javascript for the
  1163 +# rendering instead of using prerendered bitmaps. Use this if you do not
  1164 +# have LaTeX installed or if you want to formulas look prettier in the HTML
  1165 +# output. When enabled you also need to install MathJax separately and
  1166 +# configure the path to it using the MATHJAX_RELPATH option.
  1167 +
  1168 +USE_MATHJAX = NO
  1169 +
  1170 +# When MathJax is enabled you need to specify the location relative to the
  1171 +# HTML output directory using the MATHJAX_RELPATH option. The destination
  1172 +# directory should contain the MathJax.js script. For instance, if the mathjax
  1173 +# directory is located at the same level as the HTML output directory, then
  1174 +# MATHJAX_RELPATH should be ../mathjax. The default value points to the
  1175 +# mathjax.org site, so you can quickly see the result without installing
  1176 +# MathJax, but it is strongly recommended to install a local copy of MathJax
  1177 +# before deployment.
  1178 +
  1179 +MATHJAX_RELPATH = http://www.mathjax.org/mathjax
  1180 +
  1181 +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
  1182 +# names that should be enabled during MathJax rendering.
  1183 +
  1184 +MATHJAX_EXTENSIONS =
  1185 +
  1186 +# When the SEARCHENGINE tag is enabled doxygen will generate a search box
  1187 +# for the HTML output. The underlying search engine uses javascript
  1188 +# and DHTML and should work on any modern browser. Note that when using
  1189 +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
  1190 +# (GENERATE_DOCSET) there is already a search function so this one should
  1191 +# typically be disabled. For large projects the javascript based search engine
  1192 +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
  1193 +
  1194 +SEARCHENGINE = YES
  1195 +
  1196 +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
  1197 +# implemented using a PHP enabled web server instead of at the web client
  1198 +# using Javascript. Doxygen will generate the search PHP script and index
  1199 +# file to put on the web server. The advantage of the server
  1200 +# based approach is that it scales better to large projects and allows
  1201 +# full text search. The disadvantages are that it is more difficult to setup
  1202 +# and does not have live searching capabilities.
  1203 +
  1204 +SERVER_BASED_SEARCH = NO
  1205 +
  1206 +#---------------------------------------------------------------------------
  1207 +# configuration options related to the LaTeX output
  1208 +#---------------------------------------------------------------------------
  1209 +
  1210 +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
  1211 +# generate Latex output.
  1212 +
  1213 +GENERATE_LATEX = NO
  1214 +
  1215 +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
  1216 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be
  1217 +# put in front of it. If left blank `latex' will be used as the default path.
  1218 +
  1219 +LATEX_OUTPUT = latex
  1220 +
  1221 +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
  1222 +# invoked. If left blank `latex' will be used as the default command name.
  1223 +# Note that when enabling USE_PDFLATEX this option is only used for
  1224 +# generating bitmaps for formulas in the HTML output, but not in the
  1225 +# Makefile that is written to the output directory.
  1226 +
  1227 +LATEX_CMD_NAME = latex
  1228 +
  1229 +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
  1230 +# generate index for LaTeX. If left blank `makeindex' will be used as the
  1231 +# default command name.
  1232 +
  1233 +MAKEINDEX_CMD_NAME = makeindex
  1234 +
  1235 +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
  1236 +# LaTeX documents. This may be useful for small projects and may help to
  1237 +# save some trees in general.
  1238 +
  1239 +COMPACT_LATEX = NO
  1240 +
  1241 +# The PAPER_TYPE tag can be used to set the paper type that is used
  1242 +# by the printer. Possible values are: a4, letter, legal and
  1243 +# executive. If left blank a4wide will be used.
  1244 +
  1245 +PAPER_TYPE = a4
  1246 +
  1247 +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
  1248 +# packages that should be included in the LaTeX output.
  1249 +
  1250 +EXTRA_PACKAGES =
  1251 +
  1252 +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
  1253 +# the generated latex document. The header should contain everything until
  1254 +# the first chapter. If it is left blank doxygen will generate a
  1255 +# standard header. Notice: only use this tag if you know what you are doing!
  1256 +
  1257 +LATEX_HEADER =
  1258 +
  1259 +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
  1260 +# the generated latex document. The footer should contain everything after
  1261 +# the last chapter. If it is left blank doxygen will generate a
  1262 +# standard footer. Notice: only use this tag if you know what you are doing!
  1263 +
  1264 +LATEX_FOOTER =
  1265 +
  1266 +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
  1267 +# is prepared for conversion to pdf (using ps2pdf). The pdf file will
  1268 +# contain links (just like the HTML output) instead of page references
  1269 +# This makes the output suitable for online browsing using a pdf viewer.
  1270 +
  1271 +PDF_HYPERLINKS = YES
  1272 +
  1273 +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
  1274 +# plain latex in the generated Makefile. Set this option to YES to get a
  1275 +# higher quality PDF documentation.
  1276 +
  1277 +USE_PDFLATEX = YES
  1278 +
  1279 +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
  1280 +# command to the generated LaTeX files. This will instruct LaTeX to keep
  1281 +# running if errors occur, instead of asking the user for help.
  1282 +# This option is also used when generating formulas in HTML.
  1283 +
  1284 +LATEX_BATCHMODE = NO
  1285 +
  1286 +# If LATEX_HIDE_INDICES is set to YES then doxygen will not
  1287 +# include the index chapters (such as File Index, Compound Index, etc.)
  1288 +# in the output.
  1289 +
  1290 +LATEX_HIDE_INDICES = NO
  1291 +
  1292 +# If LATEX_SOURCE_CODE is set to YES then doxygen will include
  1293 +# source code with syntax highlighting in the LaTeX output.
  1294 +# Note that which sources are shown also depends on other settings
  1295 +# such as SOURCE_BROWSER.
  1296 +
  1297 +LATEX_SOURCE_CODE = NO
  1298 +
  1299 +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
  1300 +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
  1301 +# http://en.wikipedia.org/wiki/BibTeX for more info.
  1302 +
  1303 +LATEX_BIB_STYLE = plain
  1304 +
  1305 +#---------------------------------------------------------------------------
  1306 +# configuration options related to the RTF output
  1307 +#---------------------------------------------------------------------------
  1308 +
  1309 +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
  1310 +# The RTF output is optimized for Word 97 and may not look very pretty with
  1311 +# other RTF readers or editors.
  1312 +
  1313 +GENERATE_RTF = NO
  1314 +
  1315 +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
  1316 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be
  1317 +# put in front of it. If left blank `rtf' will be used as the default path.
  1318 +
  1319 +RTF_OUTPUT = rtf
  1320 +
  1321 +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
  1322 +# RTF documents. This may be useful for small projects and may help to
  1323 +# save some trees in general.
  1324 +
  1325 +COMPACT_RTF = NO
  1326 +
  1327 +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
  1328 +# will contain hyperlink fields. The RTF file will
  1329 +# contain links (just like the HTML output) instead of page references.
  1330 +# This makes the output suitable for online browsing using WORD or other
  1331 +# programs which support those fields.
  1332 +# Note: wordpad (write) and others do not support links.
  1333 +
  1334 +RTF_HYPERLINKS = NO
  1335 +
  1336 +# Load style sheet definitions from file. Syntax is similar to doxygen's
  1337 +# config file, i.e. a series of assignments. You only have to provide
  1338 +# replacements, missing definitions are set to their default value.
  1339 +
  1340 +RTF_STYLESHEET_FILE =
  1341 +
  1342 +# Set optional variables used in the generation of an rtf document.
  1343 +# Syntax is similar to doxygen's config file.
  1344 +
  1345 +RTF_EXTENSIONS_FILE =
  1346 +
  1347 +#---------------------------------------------------------------------------
  1348 +# configuration options related to the man page output
  1349 +#---------------------------------------------------------------------------
  1350 +
  1351 +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
  1352 +# generate man pages
  1353 +
  1354 +GENERATE_MAN = NO
  1355 +
  1356 +# The MAN_OUTPUT tag is used to specify where the man pages will be put.
  1357 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be
  1358 +# put in front of it. If left blank `man' will be used as the default path.
  1359 +
  1360 +MAN_OUTPUT = man
  1361 +
  1362 +# The MAN_EXTENSION tag determines the extension that is added to
  1363 +# the generated man pages (default is the subroutine's section .3)
  1364 +
  1365 +MAN_EXTENSION = .3
  1366 +
  1367 +# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
  1368 +# then it will generate one additional man file for each entity
  1369 +# documented in the real man page(s). These additional files
  1370 +# only source the real man page, but without them the man command
  1371 +# would be unable to find the correct page. The default is NO.
  1372 +
  1373 +MAN_LINKS = NO
  1374 +
  1375 +#---------------------------------------------------------------------------
  1376 +# configuration options related to the XML output
  1377 +#---------------------------------------------------------------------------
  1378 +
  1379 +# If the GENERATE_XML tag is set to YES Doxygen will
  1380 +# generate an XML file that captures the structure of
  1381 +# the code including all documentation.
  1382 +
  1383 +GENERATE_XML = NO
  1384 +
  1385 +# The XML_OUTPUT tag is used to specify where the XML pages will be put.
  1386 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be
  1387 +# put in front of it. If left blank `xml' will be used as the default path.
  1388 +
  1389 +XML_OUTPUT = xml
  1390 +
  1391 +# The XML_SCHEMA tag can be used to specify an XML schema,
  1392 +# which can be used by a validating XML parser to check the
  1393 +# syntax of the XML files.
  1394 +
  1395 +XML_SCHEMA =
  1396 +
  1397 +# The XML_DTD tag can be used to specify an XML DTD,
  1398 +# which can be used by a validating XML parser to check the
  1399 +# syntax of the XML files.
  1400 +
  1401 +XML_DTD =
  1402 +
  1403 +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
  1404 +# dump the program listings (including syntax highlighting
  1405 +# and cross-referencing information) to the XML output. Note that
  1406 +# enabling this will significantly increase the size of the XML output.
  1407 +
  1408 +XML_PROGRAMLISTING = YES
  1409 +
  1410 +#---------------------------------------------------------------------------
  1411 +# configuration options for the AutoGen Definitions output
  1412 +#---------------------------------------------------------------------------
  1413 +
  1414 +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
  1415 +# generate an AutoGen Definitions (see autogen.sf.net) file
  1416 +# that captures the structure of the code including all
  1417 +# documentation. Note that this feature is still experimental
  1418 +# and incomplete at the moment.
  1419 +
  1420 +GENERATE_AUTOGEN_DEF = NO
  1421 +
  1422 +#---------------------------------------------------------------------------
  1423 +# configuration options related to the Perl module output
  1424 +#---------------------------------------------------------------------------
  1425 +
  1426 +# If the GENERATE_PERLMOD tag is set to YES Doxygen will
  1427 +# generate a Perl module file that captures the structure of
  1428 +# the code including all documentation. Note that this
  1429 +# feature is still experimental and incomplete at the
  1430 +# moment.
  1431 +
  1432 +GENERATE_PERLMOD = NO
  1433 +
  1434 +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
  1435 +# the necessary Makefile rules, Perl scripts and LaTeX code to be able
  1436 +# to generate PDF and DVI output from the Perl module output.
  1437 +
  1438 +PERLMOD_LATEX = NO
  1439 +
  1440 +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
  1441 +# nicely formatted so it can be parsed by a human reader.
  1442 +# This is useful
  1443 +# if you want to understand what is going on.
  1444 +# On the other hand, if this
  1445 +# tag is set to NO the size of the Perl module output will be much smaller
  1446 +# and Perl will parse it just the same.
  1447 +
  1448 +PERLMOD_PRETTY = YES
  1449 +
  1450 +# The names of the make variables in the generated doxyrules.make file
  1451 +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
  1452 +# This is useful so different doxyrules.make files included by the same
  1453 +# Makefile don't overwrite each other's variables.
  1454 +
  1455 +PERLMOD_MAKEVAR_PREFIX =
  1456 +
  1457 +#---------------------------------------------------------------------------
  1458 +# Configuration options related to the preprocessor
  1459 +#---------------------------------------------------------------------------
  1460 +
  1461 +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
  1462 +# evaluate all C-preprocessor directives found in the sources and include
  1463 +# files.
  1464 +
  1465 +ENABLE_PREPROCESSING = YES
  1466 +
  1467 +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
  1468 +# names in the source code. If set to NO (the default) only conditional
  1469 +# compilation will be performed. Macro expansion can be done in a controlled
  1470 +# way by setting EXPAND_ONLY_PREDEF to YES.
  1471 +
  1472 +MACRO_EXPANSION = NO
  1473 +
  1474 +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
  1475 +# then the macro expansion is limited to the macros specified with the
  1476 +# PREDEFINED and EXPAND_AS_DEFINED tags.
  1477 +
  1478 +EXPAND_ONLY_PREDEF = NO
  1479 +
  1480 +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
  1481 +# pointed to by INCLUDE_PATH will be searched when a #include is found.
  1482 +
  1483 +SEARCH_INCLUDES = YES
  1484 +
  1485 +# The INCLUDE_PATH tag can be used to specify one or more directories that
  1486 +# contain include files that are not input files but should be processed by
  1487 +# the preprocessor.
  1488 +
  1489 +INCLUDE_PATH =
  1490 +
  1491 +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
  1492 +# patterns (like *.h and *.hpp) to filter out the header-files in the
  1493 +# directories. If left blank, the patterns specified with FILE_PATTERNS will
  1494 +# be used.
  1495 +
  1496 +INCLUDE_FILE_PATTERNS =
  1497 +
  1498 +# The PREDEFINED tag can be used to specify one or more macro names that
  1499 +# are defined before the preprocessor is started (similar to the -D option of
  1500 +# gcc). The argument of the tag is a list of macros of the form: name
  1501 +# or name=definition (no spaces). If the definition and the = are
  1502 +# omitted =1 is assumed. To prevent a macro definition from being
  1503 +# undefined via #undef or recursively expanded use the := operator
  1504 +# instead of the = operator.
  1505 +
  1506 +PREDEFINED =
  1507 +
  1508 +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
  1509 +# this tag can be used to specify a list of macro names that should be expanded.
  1510 +# The macro definition that is found in the sources will be used.
  1511 +# Use the PREDEFINED tag if you want to use a different macro definition that
  1512 +# overrules the definition found in the source code.
  1513 +
  1514 +EXPAND_AS_DEFINED =
  1515 +
  1516 +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
  1517 +# doxygen's preprocessor will remove all references to function-like macros
  1518 +# that are alone on a line, have an all uppercase name, and do not end with a
  1519 +# semicolon, because these will confuse the parser if not removed.
  1520 +
  1521 +SKIP_FUNCTION_MACROS = YES
  1522 +
  1523 +#---------------------------------------------------------------------------
  1524 +# Configuration::additions related to external references
  1525 +#---------------------------------------------------------------------------
  1526 +
  1527 +# The TAGFILES option can be used to specify one or more tagfiles.
  1528 +# Optionally an initial location of the external documentation
  1529 +# can be added for each tagfile. The format of a tag file without
  1530 +# this location is as follows:
  1531 +#
  1532 +# TAGFILES = file1 file2 ...
  1533 +# Adding location for the tag files is done as follows:
  1534 +#
  1535 +# TAGFILES = file1=loc1 "file2 = loc2" ...
  1536 +# where "loc1" and "loc2" can be relative or absolute paths or
  1537 +# URLs. If a location is present for each tag, the installdox tool
  1538 +# does not have to be run to correct the links.
  1539 +# Note that each tag file must have a unique name
  1540 +# (where the name does NOT include the path)
  1541 +# If a tag file is not located in the directory in which doxygen
  1542 +# is run, you must also specify the path to the tagfile here.
  1543 +
  1544 +TAGFILES =
  1545 +
  1546 +# When a file name is specified after GENERATE_TAGFILE, doxygen will create
  1547 +# a tag file that is based on the input files it reads.
  1548 +
  1549 +GENERATE_TAGFILE =
  1550 +
  1551 +# If the ALLEXTERNALS tag is set to YES all external classes will be listed
  1552 +# in the class index. If set to NO only the inherited external classes
  1553 +# will be listed.
  1554 +
  1555 +ALLEXTERNALS = NO
  1556 +
  1557 +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
  1558 +# in the modules index. If set to NO, only the current project's groups will
  1559 +# be listed.
  1560 +
  1561 +EXTERNAL_GROUPS = YES
  1562 +
  1563 +# The PERL_PATH should be the absolute path and name of the perl script
  1564 +# interpreter (i.e. the result of `which perl').
  1565 +
  1566 +PERL_PATH = /usr/bin/perl
  1567 +
  1568 +#---------------------------------------------------------------------------
  1569 +# Configuration options related to the dot tool
  1570 +#---------------------------------------------------------------------------
  1571 +
  1572 +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
  1573 +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
  1574 +# or super classes. Setting the tag to NO turns the diagrams off. Note that
  1575 +# this option also works with HAVE_DOT disabled, but it is recommended to
  1576 +# install and use dot, since it yields more powerful graphs.
  1577 +
  1578 +CLASS_DIAGRAMS = YES
  1579 +
  1580 +# You can define message sequence charts within doxygen comments using the \msc
  1581 +# command. Doxygen will then run the mscgen tool (see
  1582 +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
  1583 +# documentation. The MSCGEN_PATH tag allows you to specify the directory where
  1584 +# the mscgen tool resides. If left empty the tool is assumed to be found in the
  1585 +# default search path.
  1586 +
  1587 +MSCGEN_PATH =
  1588 +
  1589 +# If set to YES, the inheritance and collaboration graphs will hide
  1590 +# inheritance and usage relations if the target is undocumented
  1591 +# or is not a class.
  1592 +
  1593 +HIDE_UNDOC_RELATIONS = YES
  1594 +
  1595 +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
  1596 +# available from the path. This tool is part of Graphviz, a graph visualization
  1597 +# toolkit from AT&T and Lucent Bell Labs. The other options in this section
  1598 +# have no effect if this option is set to NO (the default)
  1599 +
  1600 +HAVE_DOT = NO
  1601 +
  1602 +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
  1603 +# allowed to run in parallel. When set to 0 (the default) doxygen will
  1604 +# base this on the number of processors available in the system. You can set it
  1605 +# explicitly to a value larger than 0 to get control over the balance
  1606 +# between CPU load and processing speed.
  1607 +
  1608 +DOT_NUM_THREADS = 0
  1609 +
  1610 +# By default doxygen will use the Helvetica font for all dot files that
  1611 +# doxygen generates. When you want a differently looking font you can specify
  1612 +# the font name using DOT_FONTNAME. You need to make sure dot is able to find
  1613 +# the font, which can be done by putting it in a standard location or by setting
  1614 +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
  1615 +# directory containing the font.
  1616 +
  1617 +DOT_FONTNAME = Helvetica
  1618 +
  1619 +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
  1620 +# The default size is 10pt.
  1621 +
  1622 +DOT_FONTSIZE = 10
  1623 +
  1624 +# By default doxygen will tell dot to use the Helvetica font.
  1625 +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
  1626 +# set the path where dot can find it.
  1627 +
  1628 +DOT_FONTPATH =
  1629 +
  1630 +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
  1631 +# will generate a graph for each documented class showing the direct and
  1632 +# indirect inheritance relations. Setting this tag to YES will force the
  1633 +# CLASS_DIAGRAMS tag to NO.
  1634 +
  1635 +CLASS_GRAPH = YES
  1636 +
  1637 +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
  1638 +# will generate a graph for each documented class showing the direct and
  1639 +# indirect implementation dependencies (inheritance, containment, and
  1640 +# class references variables) of the class with other documented classes.
  1641 +
  1642 +COLLABORATION_GRAPH = YES
  1643 +
  1644 +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
  1645 +# will generate a graph for groups, showing the direct groups dependencies
  1646 +
  1647 +GROUP_GRAPHS = YES
  1648 +
  1649 +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
  1650 +# collaboration diagrams in a style similar to the OMG's Unified Modeling
  1651 +# Language.
  1652 +
  1653 +UML_LOOK = NO
  1654 +
  1655 +# If set to YES, the inheritance and collaboration graphs will show the
  1656 +# relations between templates and their instances.
  1657 +
  1658 +TEMPLATE_RELATIONS = NO
  1659 +
  1660 +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
  1661 +# tags are set to YES then doxygen will generate a graph for each documented
  1662 +# file showing the direct and indirect include dependencies of the file with
  1663 +# other documented files.
  1664 +
  1665 +INCLUDE_GRAPH = YES
  1666 +
  1667 +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
  1668 +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
  1669 +# documented header file showing the documented files that directly or
  1670 +# indirectly include this file.
  1671 +
  1672 +INCLUDED_BY_GRAPH = YES
  1673 +
  1674 +# If the CALL_GRAPH and HAVE_DOT options are set to YES then
  1675 +# doxygen will generate a call dependency graph for every global function
  1676 +# or class method. Note that enabling this option will significantly increase
  1677 +# the time of a run. So in most cases it will be better to enable call graphs
  1678 +# for selected functions only using the \callgraph command.
  1679 +
  1680 +CALL_GRAPH = NO
  1681 +
  1682 +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
  1683 +# doxygen will generate a caller dependency graph for every global function
  1684 +# or class method. Note that enabling this option will significantly increase
  1685 +# the time of a run. So in most cases it will be better to enable caller
  1686 +# graphs for selected functions only using the \callergraph command.
  1687 +
  1688 +CALLER_GRAPH = NO
  1689 +
  1690 +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
  1691 +# will generate a graphical hierarchy of all classes instead of a textual one.
  1692 +
  1693 +GRAPHICAL_HIERARCHY = YES
  1694 +
  1695 +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
  1696 +# then doxygen will show the dependencies a directory has on other directories
  1697 +# in a graphical way. The dependency relations are determined by the #include
  1698 +# relations between the files in the directories.
  1699 +
  1700 +DIRECTORY_GRAPH = YES
  1701 +
  1702 +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
  1703 +# generated by dot. Possible values are svg, png, jpg, or gif.
  1704 +# If left blank png will be used. If you choose svg you need to set
  1705 +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
  1706 +# visible in IE 9+ (other browsers do not have this requirement).
  1707 +
  1708 +DOT_IMAGE_FORMAT = png
  1709 +
  1710 +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
  1711 +# enable generation of interactive SVG images that allow zooming and panning.
  1712 +# Note that this requires a modern browser other than Internet Explorer.
  1713 +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
  1714 +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
  1715 +# visible. Older versions of IE do not have SVG support.
  1716 +
  1717 +INTERACTIVE_SVG = NO
  1718 +
  1719 +# The tag DOT_PATH can be used to specify the path where the dot tool can be
  1720 +# found. If left blank, it is assumed the dot tool can be found in the path.
  1721 +
  1722 +DOT_PATH =
  1723 +
  1724 +# The DOTFILE_DIRS tag can be used to specify one or more directories that
  1725 +# contain dot files that are included in the documentation (see the
  1726 +# \dotfile command).
  1727 +
  1728 +DOTFILE_DIRS =
  1729 +
  1730 +# The MSCFILE_DIRS tag can be used to specify one or more directories that
  1731 +# contain msc files that are included in the documentation (see the
  1732 +# \mscfile command).
  1733 +
  1734 +MSCFILE_DIRS =
  1735 +
  1736 +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
  1737 +# nodes that will be shown in the graph. If the number of nodes in a graph
  1738 +# becomes larger than this value, doxygen will truncate the graph, which is
  1739 +# visualized by representing a node as a red box. Note that doxygen if the
  1740 +# number of direct children of the root node in a graph is already larger than
  1741 +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
  1742 +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
  1743 +
  1744 +DOT_GRAPH_MAX_NODES = 50
  1745 +
  1746 +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
  1747 +# graphs generated by dot. A depth value of 3 means that only nodes reachable
  1748 +# from the root by following a path via at most 3 edges will be shown. Nodes
  1749 +# that lay further from the root node will be omitted. Note that setting this
  1750 +# option to 1 or 2 may greatly reduce the computation time needed for large
  1751 +# code bases. Also note that the size of a graph can be further restricted by
  1752 +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
  1753 +
  1754 +MAX_DOT_GRAPH_DEPTH = 0
  1755 +
  1756 +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
  1757 +# background. This is disabled by default, because dot on Windows does not
  1758 +# seem to support this out of the box. Warning: Depending on the platform used,
  1759 +# enabling this option may lead to badly anti-aliased labels on the edges of
  1760 +# a graph (i.e. they become hard to read).
  1761 +
  1762 +DOT_TRANSPARENT = NO
  1763 +
  1764 +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
  1765 +# files in one run (i.e. multiple -o and -T options on the command line). This
  1766 +# makes dot run faster, but since only newer versions of dot (>1.8.10)
  1767 +# support this, this feature is disabled by default.
  1768 +
  1769 +DOT_MULTI_TARGETS = YES
  1770 +
  1771 +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
  1772 +# generate a legend page explaining the meaning of the various boxes and
  1773 +# arrows in the dot generated graphs.
  1774 +
  1775 +GENERATE_LEGEND = YES
  1776 +
  1777 +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
  1778 +# remove the intermediate dot files that are used to generate
  1779 +# the various graphs.
  1780 +
  1781 +DOT_CLEANUP = YES
... ...
extrator/src/extratorFactory.cpp
1 1 #include "extratorFactory.h"
2 2  
3   -ExtratorFactory::ExtratorFactory(){
4   - //TODO
5   -}
6   -
7   -ExtratorFactory::~ExtratorFactory(){
8   - //TODO
9   -}
10   -
11 3 Extrator* ExtratorFactory::getExtrator(Extrator::ExtratorType extrator_type) {
12 4 extrator = extrator_type;
13 5 switch(extrator){
14 6 case Extrator::SRT:
  7 + PRINTL(util::_DEBUG, "ExtratorSRT selected!\n");
15 8 return new ExtratorSRT();
16 9 case Extrator::TXT:
  10 + PRINTL(util::_DEBUG, "ExtratorTXT selected!\n");
17 11 return new ExtratorTXT();
  12 + case Extrator::VTT:
  13 + PRINTL(util::_DEBUG, "ExtratorVTT selected!\n");
  14 + return new ExtratorVTT();
18 15 }
19 16 }
20 17 \ No newline at end of file
... ...
extrator/src/extratorSRT.cpp
1 1 #include "extratorSRT.h"
2 2  
3 3 ExtratorSRT::ExtratorSRT(){
4   - listeners = new list<ListenerSRT*>();
  4 + listeners = new list<ListenerSub*>();
5 5 finish = false;
6 6 seek_pos = 0;
7 7 hasNextSub = true;
8   - DPRINTF("Done!\n");
  8 + PRINTL(util::_DEBUG, "ExtratorSTR Done!\n");
9 9 }
10 10  
11   -ExtratorSRT::~ExtratorSRT(){
12   - listeners->clear();
  11 +ExtratorSRT::~ExtratorSRT(){
  12 + listeners->clear();
13 13 delete listeners;
14   - //if (bff_reader) delete bff_reader;
15 14 if (file_io) delete file_io;
16   - DDDPRINTF("ExtratorSTR finalized!\n");
  15 + PRINTL(util::_DEBUG, "ExtratorSTR finalized!\n");
17 16 }
18 17  
19   -void ExtratorSRT::initialize(){
20   -
21   - file = new lavidlib::File(filePath);
22   -
23   - try{
24   - file_io = new lavidlib::FileIO(file->getPath(), FileIO::MODE_READ);
25   - }catch(Exception ex){
26   - finish = true;
27   - Util::Logger::Instance()->writeLog((char*) "[ERRO: extratorSRT.cpp] Arquivo de legenda não encontrado.");
28   - throw ExtratorException("Falha ao abrir o arquivo de legenda! Verifique se o mesmo existe.\n");
29   - }
30   -
31   - this->Start();
32   -}
33   -
34   -
35   -void ExtratorSRT::addListener(ListenerSRT* listener){
  18 +void ExtratorSRT::addListener(ListenerSub* listener){
36 19 listeners->push_back(listener);
37 20 }
38 21  
39 22 void ExtratorSRT::notifyListeners(unsigned char* subtitle, int64_t pts) {
40   - for(list<ListenerSRT*>::iterator it = listeners->begin(); it != listeners->end(); it++){
  23 + for(list<ListenerSub*>::iterator it = listeners->begin(); it != listeners->end(); it++){
41 24 (*it)->notifySubtitle(subtitle, pts);
42   - }
  25 + }
43 26 }
44 27  
45 28 void ExtratorSRT::notifyEndExtraction(int size) {
46   - DPRINTF("Extrator SRT concluiu a extração: %d legendas.\n", size);
47   - for(list<ListenerSRT*>::iterator it = listeners->begin(); it != listeners->end(); it++){
  29 + PRINTL(util::_DEBUG, "Extrator SRT concluiu a extração: %d legendas.\n", size);
  30 + for(list<ListenerSub*>::iterator it = listeners->begin(); it != listeners->end(); it++){
48 31 (*it)->notifyEnd(size);
49 32 }
50 33 }
51 34  
52   -void ExtratorSRT::setFilePath(char* path){
53   - filePath = (char*) path;
54   - string command1 = "perl -p -e 's/\r$//' < ";
55   - command1.append(filePath).append(" > ").append(INPUT_SRT);
56   - system(command1.c_str());
57   -
58   - string command2 = "iconv -f";
59   - command2.append(" $(file --mime-encoding -b ")
60   - .append(INPUT_SRT).append(")")
61   - .append(" -t utf-8 ").append(INPUT_SRT).append(" > ").append(filePath)
62   - .append(" && rm -f ").append(INPUT_SRT);
63   - system(command2.c_str());
  35 +void ExtratorSRT::encodingfiletoUTF8() {
  36 + string recmd = "recode ";
  37 + recmd.append("$(file --mime-encoding -b ")
  38 + .append(this->filePath).append(")..utf-8 ")
  39 + .append(this->filePath);
  40 + system(recmd.c_str());
  41 +
  42 + string sedcmd = "sed -i 's/\r$//;$d' ";
  43 + sedcmd.append(this->filePath);
  44 + system(sedcmd.c_str());
  45 +
  46 +}
  47 +
  48 +void ExtratorSRT::setFilePath(char* path) {
  49 + this->filePath = path;
  50 + encodingfiletoUTF8();
  51 +}
  52 +
  53 +void ExtratorSRT::initialize(){
  54 +
  55 + file = new lavidlib::File(this->filePath);
  56 +
  57 + try{
  58 + file_io = new lavidlib::FileIO(file->getPath(), FileIO::MODE_READ);
  59 + }catch(Exception &ex){
  60 + finish = true;
  61 + Logging::instance()->writeLog("extratorSRT.cpp <Error>: Arquivo de legenda não encontrado.");
  62 + throw ExtratorException("Falha ao abrir o arquivo de legenda! Verifique se o mesmo existe.\n");
  63 + }
  64 + this->Start();
  65 +
64 66 }
65 67  
66 68 bool ExtratorSRT::isFinished(){
... ... @@ -72,15 +74,15 @@ bool ExtratorSRT::hasNextSubtitle() {
72 74 }
73 75  
74 76 void ExtratorSRT::Run(){
75   - DPRINTF("[AGUARDE] Extraindo Legendas...\n");
76   -
  77 + PRINTL(util::_INFO, "Extraindo Legendas...\n");
77 78 int sub_index = 0;
78 79 string sub_text = "";
79   -
80 80 while(hasNextSubtitle()){
81 81 try{
82 82 subtitle = next();
83   - }catch(ExtratorException ex){ break; }
  83 + }catch(ExtratorException ex){
  84 + break;
  85 + }
84 86 sub_text = subtitle->getSubtitleText();
85 87 notifyListeners((unsigned char*)sub_text.c_str(), calcula_pts((double) subtitle->getTimeIn()));
86 88 sub_index++;
... ... @@ -88,63 +90,83 @@ void ExtratorSRT::Run(){
88 90 }
89 91 if(sub_index == 0)
90 92 notifyListeners((unsigned char*)"ARQUIVO_INVALIDO", 0);
  93 +
91 94 finish = true;
92 95 notifyEndExtraction(sub_index);
93 96 }
94 97  
95 98 Subtitle* ExtratorSRT::next() {
96   -
97   - if (seek_pos >= file_io->getSize())
98   - throw ExtratorException("[ERRO: extratorSRT.cpp] Esse arquivo já foi lido.");
99   -
  99 +
100 100 file_io->seek(seek_pos);
101 101 try{
102 102 bff_reader = new BufferedReader(file_io);
103 103 }catch(Exception &ex){
104   - throw ExtratorException("[ERRO: extratorSRT.cpp] O BufferedReader não foi inicializado.");
  104 + Logging::instance()->writeLog("extratorSRT.cpp <Error>: BufferedReader não inicializado.");
  105 + throw ExtratorException("O BufferedReader não foi inicializado.");
105 106 }
106 107  
107 108 Subtitle* sub = new Subtitle();
108   - string line = "";
  109 + string line = "";
109 110 string text_sub = "";
110   -
  111 +
111 112 try {
112 113 /* ID */
113 114 int id = 0;
114 115 line = bff_reader->readLine();
115 116 seek_pos += (int64_t) line.size() + SIZE_CSCAPE;
116   - id = atoi(line.c_str());
  117 + id = atoi(line.c_str());
117 118 sub->setID(id);
118 119  
119 120 /* TimeIn and TimeOut */
120 121 int64_t t_in = 0, t_out = 0;
121 122 line = bff_reader->readLine();
122 123 seek_pos += (int64_t) line.size() + SIZE_CSCAPE;
123   -
  124 +
124 125 int target_pos = line.find(TARGET_TIME);
125 126 t_in = str_to_time(line.substr(0, target_pos));
126 127 sub->setTimeIn(t_in);
127 128 t_out = str_to_time(line.substr(target_pos + strlen(TARGET_TIME)+1, line.size()));
128   - sub->setTimeOut(t_out);
129   -
130   - /* Text: read until line be empty */
  129 + sub->setTimeOut(t_out);
  130 +
  131 + /* Text: read until line be empty */
131 132 while ((line = bff_reader->readLine()).size() > 0) {
132 133 text_sub += line;
133   - text_sub.append(" ");
  134 + text_sub.append(" ");
134 135 }
135 136 seek_pos += (int64_t) text_sub.size() + SIZE_CSCAPE;
136   -
  137 +
137 138 } catch (lavidlib::EOFException &ex) {
138   - sub->setSubtitleText(text_sub);
  139 + if(text_sub == "")
  140 + sub->setTimeIn(0); //seta o valor 0 para nao gerar um valor aleatório
  141 +
  142 + sub->setSubtitleText(formatText(text_sub));
139 143 seek_pos += (int64_t) text_sub.size() + SIZE_CSCAPE;
140 144 hasNextSub = false;
  145 + delete(bff_reader);
141 146 return sub;
142 147 }
143   - sub->setSubtitleText(text_sub);
  148 + sub->setSubtitleText(formatText(text_sub));
144 149 delete(bff_reader);
145 150 return sub;
146 151 }
147   -
  152 +
  153 +string ExtratorSRT::formatText(string line){
  154 + int lessThanPos;
  155 + int moreThanPos;
  156 + string f_line = line;
  157 +
  158 + lessThanPos = f_line.find_first_of(LESS_THAN); //pega a posição do simbolo '<'
  159 + moreThanPos = f_line.find_first_of(MORE_THAN); //pega a posição do simbolo '>'
  160 +
  161 + while(lessThanPos != string::npos && moreThanPos != string::npos){
  162 + f_line = f_line.erase(lessThanPos, moreThanPos - (lessThanPos-1)); //remove o trecho '<string>'
  163 + lessThanPos = f_line.find_first_of(LESS_THAN);
  164 + moreThanPos = f_line.find_first_of(MORE_THAN);
  165 + }
  166 +
  167 + return f_line;
  168 +}
  169 +
148 170 int64_t ExtratorSRT::str_to_time(string str_time) {
149 171  
150 172 int64_t ttime = 0;
... ... @@ -153,7 +175,7 @@ int64_t ExtratorSRT::str_to_time(string str_time) {
153 175  
154 176 int index = 0;
155 177 int values [4]; // hh, mm, ss, ms
156   - char * str = strtok(tokens, ":,");
  178 + char * str = strtok(tokens, ":,");
157 179 while (str != NULL) {
158 180 values[index] = atoi(str);
159 181 str = strtok(NULL, ":,");
... ... @@ -162,7 +184,7 @@ int64_t ExtratorSRT::str_to_time(string str_time) {
162 184 delete(tokens);
163 185  
164 186 /* calculate time */
165   - ttime = /*hour to sec*/((((values[0] * 60) * 60) +
  187 + ttime = /*hour to sec*/((((values[0] * 60) * 60) +
166 188 /*min to sec*/(values[1] * 60) +/*sec*/values[2])*1000) + values[3];
167 189  
168 190 return ttime;
... ... @@ -170,5 +192,5 @@ int64_t ExtratorSRT::str_to_time(string str_time) {
170 192 }
171 193  
172 194 uint64_t ExtratorSRT::calcula_pts(double msec) {
173   - return (uint64_t)(1000 /*pcr_base*/ + ((msec/1000) * 90000.0));
  195 + return (uint64_t)msec;
174 196 }
... ...
extrator/src/extratorTXT.cpp
... ... @@ -8,35 +8,22 @@
8 8 * Author: Erickson Silva (erickson.silva@lavid.ufpb.br) *
9 9 * *
10 10 **************************************************************************/
11   -
  11 +
12 12 #include "extratorTXT.h"
13 13  
14 14 ExtratorTXT::ExtratorTXT(){
15 15 listeners = new list<ListenerTXT*>();
16 16 finish = false;
17   - DPRINTF("Done!\n");
  17 + PRINTL(util::_DEBUG, "ExtratorTXT Done!\n");
18 18 }
19 19  
20   -ExtratorTXT::~ExtratorTXT(){
  20 +ExtratorTXT::~ExtratorTXT(){
21 21 listeners->clear();
22 22 delete listeners;
23 23 delete file;
24 24 delete file_io;
25 25 delete bff_reader;
26   - DDDPRINTF("ExtratorTXT finalized!\n");
27   -}
28   -
29   -void ExtratorTXT::initialize(){
30   - file = new lavidlib::File(filePath);
31   - try{
32   - file_io = new lavidlib::FileIO(file->getPath(), FileIO::MODE_READ);
33   - bff_reader = new BufferedReader(file_io);
34   - }catch(Exception &ex){
35   - finish = true;
36   - Util::Logger::Instance()->writeLog((char*) "[ERRO: extratorTXT.cpp] Arquivo de texto não encontrado.");
37   - throw ExtratorException("Falha ao abrir o arquivo de texto! Verifique se o mesmo existe.");
38   - }
39   - this->Start();
  26 + PRINTL(util::_DEBUG, "ExtratorTXT finalized!\n");
40 27 }
41 28  
42 29 void ExtratorTXT::addListener(ListenerTXT* listener){
... ... @@ -46,28 +33,44 @@ void ExtratorTXT::addListener(ListenerTXT* listener){
46 33 void ExtratorTXT::notifyListeners(unsigned char* line) {
47 34 for(list<ListenerTXT*>::iterator it = listeners->begin(); it != listeners->end(); it++){
48 35 (*it)->notifyLine(line);
49   - }
  36 + }
50 37 }
51 38  
52 39 void ExtratorTXT::notifyEndExtraction(int size) {
53   - DPRINTF("ExtratorTXT concluiu a extração: %d linhas.\n", size);
  40 + PRINTL(util::_DEBUG, "ExtratorTXT concluiu a extração: %d linhas.\n", size);
54 41 for(list<ListenerTXT*>::iterator it = listeners->begin(); it != listeners->end(); it++){
55 42 (*it)->notifyEnd(size);
56 43 }
57 44 }
58 45  
  46 +void ExtratorTXT::encodingfiletoUTF8() {
  47 + string recmd = "recode ";
  48 + recmd.append("$(file --mime-encoding -b ")
  49 + .append(this->filePath).append(")..utf-8 ")
  50 + .append(this->filePath);
  51 + system(recmd.c_str());
  52 +
  53 + string sedcmd = "sed -i 's/\\r//' ";
  54 + sedcmd.append(this->filePath);
  55 + system(sedcmd.c_str());
  56 +}
  57 +
59 58 void ExtratorTXT::setFilePath(char* path){
60   - filePath = (char*) path;
61   - string command1 = "perl -p -e 's/\r$//' < ";
62   - command1.append(filePath).append(" > ").append(INPUT_TXT);
63   - system(command1.c_str());
  59 + this->filePath = path;
  60 + encodingfiletoUTF8();
  61 +}
64 62  
65   - string command2 = "iconv -f";
66   - command2.append(" $(file --mime-encoding -b ")
67   - .append(INPUT_TXT).append(")")
68   - .append(" -t utf-8 ").append(INPUT_TXT).append(" > ").append(filePath)
69   - .append(" && rm -f ").append(INPUT_TXT);
70   - system(command2.c_str());
  63 +void ExtratorTXT::initialize(){
  64 + file = new lavidlib::File(filePath);
  65 + try{
  66 + file_io = new lavidlib::FileIO(file->getPath(), FileIO::MODE_READ);
  67 + bff_reader = new BufferedReader(file_io);
  68 + }catch(Exception &ex){
  69 + finish = true;
  70 + Logging::instance()->writeLog("extratorTXT.cpp <Error>: Arquivo de texto não encontrado.");
  71 + throw ExtratorException("Falha ao abrir o arquivo de texto! Verifique se o mesmo existe.");
  72 + }
  73 + this->Start();
71 74 }
72 75  
73 76 bool ExtratorTXT::isFinished(){
... ... @@ -75,19 +78,16 @@ bool ExtratorTXT::isFinished(){
75 78 }
76 79  
77 80 void ExtratorTXT::Run(){
78   -
79   - DPRINTF("[AGUARDE] Extraindo Texto...\n")
80   -
  81 + PRINTL(util::_INFO, "Extraindo Texto...\n");
81 82 int line_index = 0;
82   - bool hasNext = true;
  83 + bool hasNext = true;
83 84 string line;
84 85  
85 86 while (hasNext) {
86 87 try{
87 88 line = bff_reader->readLine();
88   - if (line.length() > 0){
  89 + if (line.length() > 0){
89 90 notifyListeners((unsigned char*) line.c_str());
90   - //cout << " . ";
91 91 line_index++;
92 92 }
93 93 }catch (EOFException &ex){
... ... @@ -95,8 +95,8 @@ void ExtratorTXT::Run(){
95 95 notifyListeners((unsigned char*)"ARQUIVO_INVALIDO");
96 96 hasNext = false;
97 97 }catch (...){
98   - Util::Logger::Instance()->writeLog((char*) "[ERRO: extratorTXT.cpp] Erro durante a leitura do arquivo de texto.");
99   - throw ExtratorException("Falha desconhecida na leitura do arquivo. Tente novamente.");
  98 + Logging::instance()->writeLog("extratorTXT.cpp <Error>: Erro durante a leitura do arquivo de texto.");
  99 + throw ExtratorException("Falha desconhecida na leitura do arquivo. Tente novamente.");
100 100 }
101 101 }
102 102 finish = true;
... ...
extrator/src/extratorVTT.cpp 0 → 100644
... ... @@ -0,0 +1,171 @@
  1 +#include "extratorVTT.h"
  2 +
  3 +ExtratorVTT::ExtratorVTT() {
  4 + listeners = new list<ListenerSub*>();
  5 + seekPos = 0;
  6 + this->finish = false;
  7 + hasNextCue = true;
  8 + PRINTL(util::_DEBUG, "ExtratorVTT Done!\n");
  9 +}
  10 +
  11 +ExtratorVTT::~ExtratorVTT() {
  12 + listeners->clear();
  13 + delete listeners;
  14 + if (file_io) delete file_io;
  15 + PRINTL(util::_DEBUG, "ExtratorVTT finalized!\n");
  16 +}
  17 +
  18 +void ExtratorVTT::addListener(ListenerSub* listener){
  19 + listeners->push_back(listener);
  20 +}
  21 +
  22 +void ExtratorVTT::notifyListeners(unsigned char* subtitle, uint64_t pts) {
  23 + for(list<ListenerSub*>::iterator it = listeners->begin(); it != listeners->end(); it++){
  24 + (*it)->notifySubtitle(subtitle, pts);
  25 + }
  26 +}
  27 +
  28 +void ExtratorVTT::notifyEndExtraction(int size) {
  29 + PRINTL(util::_DEBUG, "Extrator webVTT concluiu a extração: %d legendas.\n", size);
  30 + for(list<ListenerSub*>::iterator it = listeners->begin(); it != listeners->end(); it++){
  31 + (*it)->notifyEnd(size);
  32 + }
  33 +}
  34 +
  35 +void ExtratorVTT::encodingfiletoUTF8() {
  36 + string recmd = "recode ";
  37 + recmd.append("$(file --mime-encoding -b ")
  38 + .append(this->filePath).append(")..utf-8 ")
  39 + .append(this->filePath);
  40 + system(recmd.c_str());
  41 +
  42 + string sedcmd = "sed -i 's/\r$//;$d' ";
  43 + sedcmd.append(this->filePath);
  44 + system(sedcmd.c_str());
  45 +}
  46 +
  47 +void ExtratorVTT::setFilePath(char* path) {
  48 + this->filePath = path;
  49 + encodingfiletoUTF8();
  50 +}
  51 +
  52 +void ExtratorVTT::initialize() {
  53 + file = new lavidlib::File(this->filePath);
  54 +
  55 + try{
  56 + file_io = new lavidlib::FileIO(file->getPath(), FileIO::MODE_READ);
  57 + }catch(Exception &ex){
  58 + finish = true;
  59 + Logging::instance()->writeLog("extratorVTT.cpp <Error>: Arquivo de legenda não encontrado.");
  60 + throw lavidlib::RuntimeException("Falha ao abrir o arquivo de legenda! Verifique se o mesmo existe.\n");
  61 + }
  62 + this->Start();
  63 +}
  64 +
  65 +bool ExtratorVTT::isFinished() {
  66 + return this->finish;
  67 +}
  68 +
  69 +Subtitle* ExtratorVTT::nextCue() {
  70 + string line;
  71 + string cueText = "";
  72 + int target_pos;
  73 + int64_t time_in;
  74 +
  75 + file_io->seek(seekPos);
  76 + try{
  77 + bff_reader = new BufferedReader(file_io);
  78 + }catch(Exception &ex){
  79 + Logging::instance()->writeLog("extratorSRT.cpp <Error>: BufferedReader não inicializado.");
  80 + throw lavidlib::RuntimeException("O BufferedReader não foi inicializado.");
  81 + }
  82 +
  83 + Subtitle* cue = new Subtitle();
  84 +
  85 + try{
  86 + do{
  87 + line = bff_reader->readLine();
  88 + seekPos += line.size() + SIZE_SCAPE;
  89 + }while(line.find(TARGET_TIME) == string::npos);
  90 +
  91 + target_pos = line.find(TARGET_TIME);
  92 + time_in = str_to_time(line.substr(0, target_pos));
  93 + cue->setTimeIn(time_in);
  94 +
  95 + while((line = bff_reader->readLine()) != ""){
  96 + cueText += line;
  97 + cueText += " ";
  98 + }
  99 +
  100 + }catch(lavidlib::EOFException &ex){
  101 + if(cueText == "")
  102 + cue->setTimeIn(0); //seta o valor 0 para nao gerar um valor aleatório
  103 +
  104 + cue->setSubtitleText(formatText(cueText));
  105 + seekPos += (int64_t) cueText.size() + SIZE_SCAPE;
  106 + hasNextCue =false;
  107 + delete(bff_reader);
  108 + return cue;
  109 + }
  110 +
  111 + cue->setSubtitleText(formatText(cueText));
  112 + seekPos += (int64_t) cueText.size() + SIZE_SCAPE;
  113 + delete(bff_reader);
  114 + return cue;
  115 +}
  116 +
  117 +string ExtratorVTT::formatText(string line){
  118 + int lessThanPos;
  119 + int moreThanPos;
  120 + string f_line = line;
  121 +
  122 + lessThanPos = f_line.find_first_of(LESS_THAN); //pega a posição do simbolo '<'
  123 + moreThanPos = f_line.find_first_of(MORE_THAN); //pega a posição do simbolo '>'
  124 +
  125 + while(lessThanPos != string::npos && moreThanPos != string::npos){
  126 + f_line = f_line.erase(lessThanPos, moreThanPos - (lessThanPos-1)); //remove o trecho '<string>'
  127 + lessThanPos = f_line.find_first_of(LESS_THAN);
  128 + moreThanPos = f_line.find_first_of(MORE_THAN);
  129 + }
  130 + return f_line;
  131 +}
  132 +
  133 +int64_t ExtratorVTT::str_to_time(string str_time) {
  134 + int64_t ttime = 0;
  135 + char* tokens = new char[4]; // hh, mm, ss, ms
  136 + strcpy(tokens, (char*)str_time.c_str());
  137 +
  138 + int index = 0;
  139 + int values [4]; // hh, mm, ss, ms
  140 + char * str = strtok(tokens, ":,.");
  141 + while (str != NULL) {
  142 + values[index] = atoi(str);
  143 + str = strtok(NULL, ":,.");
  144 + index++;
  145 + }
  146 + delete(tokens);
  147 +
  148 + /* calculate time */
  149 + ttime = /*hour to sec*/((((values[0] * 60) * 60) +
  150 + /*min to sec*/(values[1] * 60) +/*sec*/values[2])*1000) + values[3];
  151 +
  152 + return ttime;
  153 +}
  154 +
  155 +void ExtratorVTT::Run() {
  156 + PRINTL(util::_INFO, "Extraindo Legendas...\n");
  157 +
  158 + int sub_index = 0;
  159 + string cue_text = "";
  160 + while(hasNextCue){
  161 + subtitle = nextCue();
  162 + cue_text = subtitle->getSubtitleText();
  163 + notifyListeners((unsigned char*)cue_text.c_str(), (uint64_t) subtitle->getTimeIn());
  164 + sub_index++;
  165 + free(subtitle);
  166 + }
  167 + if(sub_index == 0)
  168 + notifyListeners((unsigned char*)"ARQUIVO_INVALIDO", 0);
  169 + this->finish = true;
  170 + notifyEndExtraction(sub_index);
  171 +}
... ...
extrator/src/include/extrator.h
  1 +/**
  2 + * \file extrator.h
  3 + *
  4 + * \author Wesnydy Lima Ribeiro <wesnydy@lavid.ufpb.br>
  5 + * \date 2015
  6 + */
  7 +
1 8 #ifndef EXTRATOR_H
2 9 #define EXTRATOR_H
3 10  
  11 +#include "logging.h"
4 12 #include <lavidlib/io/File.h>
5 13 #include <lavidlib/io/FileIO.h>
6 14 #include <lavidlib/io/BufferedReader.h>
7 15 #include <lavidlib/io/IOException.h>
8 16 #include <lavidlib/io/EOFException.h>
9 17  
  18 +using namespace util;
10 19 using namespace lavidlib;
11 20  
  21 +/** \brief A classe base para todos os extratores.
  22 + *
  23 + * \headerfile extrator/src/include/extrator.h
  24 + */
12 25 class Extrator {
13 26  
14 27 protected:
... ... @@ -18,16 +31,33 @@ protected:
18 31 File* file;
19 32 FileIO* file_io;
20 33 BufferedReader* bff_reader;
21   -
  34 +
22 35 public:
23   - enum ExtratorType {
24   - SRT,
25   - TXT
26   - };
  36 + enum ExtratorType {SRT, TXT, VTT};
  37 +
  38 + /** Notifica o fim da extração do conteúdo do arquivo.
  39 + *
  40 + * \param size Quantidade de conteúdo extraído.
  41 + */
27 42 virtual void notifyEndExtraction(int size) = 0;
  43 +
  44 + /** Define o path do arquivo de entrada.
  45 + *
  46 + * \param path O path do arquivo.
  47 + */
28 48 virtual void setFilePath(char* path) = 0;
  49 +
  50 + /** Recodifica o arquivo para utf-8 */
  51 + virtual void encodingfiletoUTF8() = 0;
  52 +
  53 + /** Inicializa a extração do conteúdo. */
29 54 virtual void initialize() = 0;
  55 +
  56 + /** Indica o fim do processo de extração.
  57 + *
  58 + * \return O status do do processo.
  59 + */
30 60 virtual bool isFinished() = 0;
31 61 };
32 62  
33   -#endif /* EXTRATOR_H */
34 63 \ No newline at end of file
  64 +#endif /* EXTRATOR_H */
... ...
extrator/src/include/extratorException.h
  1 +/**
  2 + * \file extratorException.h
  3 + */
  4 +
1 5 #ifndef EXTRATOREXCEPTION_H
2 6 #define EXTRATOREXCEPTION_H
3 7  
... ... @@ -8,18 +12,7 @@ using namespace std;
8 12  
9 13 class ExtratorException : public RuntimeException {
10 14 public:
11   - /**
12   - * Construtor da classe.
13   - * Cria uma nova exceção com uma mensagem detalhada.
14   - * @param message A mensagem em forma de um objeto string.
15   - */
16 15 ExtratorException(const string message);
17   -
18   - /**
19   - * Construtor da classe.
20   - * Cria uma nova exceção com uma mensagem detalhada.
21   - * @param message A mensagem em forma de um array de caracteres.
22   - */
23 16 ExtratorException(const char* message);
24 17 };
25 18  
... ...
extrator/src/include/extratorFactory.h
  1 +/**
  2 + * \file extratorFactory.h
  3 + *
  4 + * \author Wesnydy Lima Ribeiro <wesnydy@lavid.ufpb.br>
  5 + * \date 2015
  6 + */
1 7 #ifndef EXTRATORFACTORY_H
2 8 #define EXTRATORFACTORY_H
3 9  
4 10 #include "extrator.h"
5 11 #include "extratorSRT.h"
6 12 #include "extratorTXT.h"
  13 +#include "extratorVTT.h"
7 14  
  15 +/** \brief Classe que implementa o factory pattern. */
8 16 class ExtratorFactory{
9 17  
10 18 public:
11   - ExtratorFactory();
12   - ~ExtratorFactory();
  19 + /** Construtor */
  20 + ExtratorFactory(){};
13 21  
  22 + /** Destrutor */
  23 + ~ExtratorFactory(){};
  24 +
  25 + /** Retorna uma referência para o tipo de extrator selecionado. */
14 26 Extrator* getExtrator(Extrator::ExtratorType extrator_type);
15 27  
16 28 private:
... ...
extrator/src/include/extratorSRT.h
1   -/*
2   - * File: extratorSRT.h
3   - * Author: leonardo
  1 +/**
  2 + * \file extratorSRT.h
4 3 *
5   - * Created on 17 de Fevereiro de 2012, 17:51
  4 + * \author Leonardo de Araújo Domingues <leonardo.araujo@lavid.ufpb.br>
  5 + * \date 17/02/2012
6 6 */
  7 +
7 8 #ifndef EXTRATORSRT_H
8 9 #define EXTRATORSRT_H
9 10  
10 11 #include <list>
11 12 #include <string.h>
12 13 #include <stdlib.h>
13   -#include <fstream>
  14 +#include <fstream>
14 15 #include <stdio.h>
15 16 #include "jthread.h"
16   -#include "dprintf.h"
17   -#include "logger.h"
18 17 #include "extrator.h"
19 18 #include "subtitle.h"
20   -#include "listenerSRT.h"
  19 +#include "listenerSub.h"
21 20 #include "extratorException.h"
22 21  
23 22 #define SIZE_CSCAPE 1
24 23 #define TARGET_TIME "-->"
25   -#define INPUT_SRT "vlibras_user/inputSRT.srt"
  24 +#define LESS_THAN "<"
  25 +#define MORE_THAN ">"
26 26 //#define MAX_LINE 1024
27 27  
28 28 using namespace jthread;
29 29 using namespace std;
30 30 using namespace sndesc;
31 31  
32   -/** Classe que modela ExtratorSRT.
33   -* Instâncias do tipo ExtratorSRT são modelados
34   -* a partir desta classe, esses objetos são
35   -* responsáveis por extrair o conteudo de arquivos
36   -* com a extensão SubRipText(SRT).
  32 +/** \brief Classe que implementa o extrator de legenda.
  33 +*
  34 +* Instâncias desta classe extraem o conteúdo de
  35 +* arquivos SubRipText(SRT).
  36 +*
  37 +* \headerfile extrator/src/include/extratorSRT.h
37 38 */
38 39 class ExtratorSRT: public Extrator, public Thread {
39   -
  40 +
40 41 public:
  42 + /** Construtor */
41 43 ExtratorSRT();
  44 +
  45 + /** Destrutor */
42 46 ~ExtratorSRT();
43   -
44   - void addListener(ListenerSRT* listener);
  47 +
  48 + /** Adiciona ouvintes do extratorSRT.
  49 + *
  50 + * \param listener O ouvinte a ser registrado.
  51 + */
  52 + void addListener(ListenerSub* listener);
  53 +
  54 + /** Notifica os ouvintes sobre novas extrações realizadas.
  55 + *
  56 + * \param subtitle A legenda extraída.
  57 + * \param pts Etiqueta de tempo (Presentation timestamp) da legenda.
  58 + */
45 59 void notifyListeners(unsigned char* subtitle, int64_t pts);
  60 +
  61 + /** Notifica o fim da extração das legendas.
  62 + *
  63 + * \param size Quantidade de legendas extraídas.
  64 + */
46 65 void notifyEndExtraction(int size);
47 66  
  67 + /** Define o path do arquivo de entrada.
  68 + *
  69 + * \param path O path do arquivo.
  70 + */
48 71 void setFilePath(char* path);
  72 +
  73 + /** Inicializa o processo de extração da legendas.
  74 + *
  75 + * \exception ExtratorException caso o arquivo de legenda não seja encontrado.
  76 + */
49 77 void initialize();
  78 +
  79 + /** Indica o fim do processo de extração das legendas.
  80 + *
  81 + * \return O status do do processo.
  82 + */
50 83 bool isFinished();
51   -
  84 +
  85 + /** Retorna o conteúdo da legenda extraída.
  86 + *
  87 + * \return Referência para um objeto Subtitle.
  88 + * \exception ExtratorException se ocorrer algum erro no processo de extração.
  89 + */
52 90 Subtitle* next();
  91 +
  92 + /** Indica se há legendas para serem extraídas do arquivo.
  93 + *
  94 + * \return True se houver legendas, caso contrário, retorna False.
  95 + */
53 96 bool hasNextSubtitle();
  97 +
  98 + /** Este método é chamado quando a Thread for iniciada. */
54 99 void Run();
55   -
  100 +
56 101 private:
57   - list<ListenerSRT*> *listeners;
  102 + list<ListenerSub*> *listeners;
58 103  
59   - Subtitle *subtitle;
  104 + Subtitle *subtitle;
60 105 int64_t seek_pos;
61 106 bool hasNextSub;
62 107  
  108 + void encodingfiletoUTF8();
  109 + string formatText(string line);
63 110 uint64_t calcula_pts(double msec);
64   - int64_t str_to_time(std::string str_time);
  111 + int64_t str_to_time(std::string str_time);
65 112 };
66 113  
67   -#endif /* EXTRATORSRT_H */
68 114 \ No newline at end of file
  115 +#endif /* EXTRATORSRT_H */
... ...
extrator/src/include/extratorTXT.h
1   -/***************************************************************************
2   - * Universidade Federal da Paraíba *
3   - * Copyright (C) 2014 by Laboratório de Aplicações de Vídeo Digital *
4   - * *
5   - * Centro de Informática - UFPB - Campus I *
6   - * João Pessoa - PB - Brasil *
7   - * *
8   - * Author: Erickson Silva (erickson.silva@lavid.ufpb.br) *
9   - * *
10   - **************************************************************************/
  1 +/**
  2 + * \file extratorTXT.h
  3 + *
  4 + * \author Erickson Silva <erickson.silva@lavid.ufpb.br>
  5 + * \date 2014
  6 + */
11 7  
12 8 #ifndef EXTRATORTXT_H
13 9 #define EXTRATORTXT_H
14 10  
15 11 #include <list>
16 12 #include "jthread.h"
17   -#include "dprintf.h"
18   -#include "logger.h"
19 13 #include "extrator.h"
20 14 #include "listenerTXT.h"
21 15 #include "extratorException.h"
22 16  
23   -#define INPUT_TXT "vlibras_user/inputTXT.txt"
24   -
25 17 using namespace jthread;
26 18 using namespace std;
27 19  
28   -/**
29   -* Classe que modela o ExtratorTXT.
30   -* O ExtratorTXT extrai o conteúdo
31   -* de um arquivo txt.
  20 +/** \brief Classe que implementa o extrator de texto.
  21 +*
  22 +* Instâncias desta classe extraem o conteúdo de
  23 +* arquivos txt.
  24 +*
  25 +* \headerfile extrator/src/include/extratorTXT.h
32 26 */
33 27 class ExtratorTXT: public Extrator, public Thread {
34   -
  28 +
35 29 public:
  30 + /** Construtor */
36 31 ExtratorTXT();
  32 +
  33 + /** Destrutor */
37 34 ~ExtratorTXT();
38 35  
  36 + /** Adiciona ouvintes do extratorTXT.
  37 + *
  38 + * \param listener O ouvinte a ser registrado.
  39 + */
39 40 void addListener(ListenerTXT* listener);
  41 +
  42 + /** Notifica os ouvintes sobre novas extrações realizadas.
  43 + *
  44 + * \param line A linha extraída.
  45 + */
40 46 void notifyListeners(unsigned char* line);
  47 +
  48 + /** Notifica o fim da extração do texto.
  49 + *
  50 + * \param size Quantidade de linhas extraídas.
  51 + */
41 52 void notifyEndExtraction(int size);
42 53  
  54 + /** Define o path do arquivo de entrada.
  55 + *
  56 + * \param path O path do arquivo.
  57 + */
43 58 void setFilePath(char* path);
  59 +
  60 + /** Inicializa o processo de extração do texto.
  61 + *
  62 + * \exception ExtratorException caso o arquivo de texto não seja encontrado.
  63 + */
44 64 void initialize();
  65 +
  66 + /** Indica o fim do processo de extração do texto.
  67 + *
  68 + * \return O status do do processo.
  69 + */
45 70 bool isFinished();
46   -
  71 +
  72 + /** Este método é chamado quando a Thread for iniciada. */
47 73 void Run();
48 74  
49 75 private:
50   - list<ListenerTXT*> *listeners;
  76 + list<ListenerTXT*> *listeners;
  77 + void encodingfiletoUTF8();
51 78 };
52 79  
53 80 #endif /* EXTRATORTXT_H */
54   -
... ...
extrator/src/include/extratorVTT.h 0 → 100644
... ... @@ -0,0 +1,90 @@
  1 +/**
  2 + * \file extratorVTT.h
  3 + *
  4 + * \author Wesnydy Ribeiro <wesnydy@lavid.ufpb.br>
  5 + * \date 2015
  6 + */
  7 +
  8 +#ifndef EXTRATORVTT_H
  9 +#define EXTRATORVTT_H
  10 +
  11 +#include <list>
  12 +#include <string.h>
  13 +#include <stdlib.h>
  14 +#include <stdio.h>
  15 +#include "jthread.h"
  16 +#include "extrator.h"
  17 +#include "subtitle.h"
  18 +#include "listenerSub.h"
  19 +#include <iostream>
  20 +
  21 +#define SIGNATURE "WEBVTT"
  22 +#define TARGET_TIME "-->"
  23 +#define LESS_THAN "<"
  24 +#define MORE_THAN ">"
  25 +#define SIZE_SCAPE 1
  26 +
  27 +using namespace std;
  28 +using namespace sndesc;
  29 +using namespace jthread;
  30 +
  31 +/** \brief Classe que implementa o extrator de legenda.
  32 +*
  33 +* Instâncias desta classe extraem o conteúdo de
  34 +* arquivos webVTT.
  35 +*
  36 +* \headerfile extrator/src/include/extratorVTT.h
  37 +*/
  38 +class ExtratorVTT: public Extrator, public Thread {
  39 +
  40 +public:
  41 + /** Construtor */
  42 + ExtratorVTT();
  43 +
  44 + /** Destrutor */
  45 + ~ExtratorVTT();
  46 +
  47 + /** Define o path do arquivo de entrada.
  48 + *
  49 + * \param path O path do arquivo.
  50 + */
  51 + void setFilePath(char* path);
  52 +
  53 + /** Adiciona ouvintes do extratorVTT.
  54 + *
  55 + * \param listener O ouvinte a ser registrado.
  56 + */
  57 + void addListener(ListenerSub* listener);
  58 +
  59 + /** Inicializa o processo de extração da legendas.
  60 + *
  61 + * \exception ExtratorException caso o arquivo de legenda não seja encontrado.
  62 + */
  63 + void initialize();
  64 +
  65 + /** Indica o fim do processo de extração das legendas.
  66 + *
  67 + * \return O status do do processo.
  68 + */
  69 + bool isFinished();
  70 +
  71 + /** Este método é chamado quando a Thread for iniciada. */
  72 + void Run();
  73 +
  74 +private:
  75 + Subtitle* subtitle;
  76 + list<ListenerSub*> *listeners;
  77 +
  78 + int64_t seekPos;
  79 + bool hasNextCue;
  80 +
  81 + void notifyEndExtraction(int size);
  82 + void notifyListeners(unsigned char* subtitle, uint64_t pts);
  83 +
  84 + Subtitle* nextCue();
  85 + void encodingfiletoUTF8();
  86 + string formatText(string line);
  87 + int64_t str_to_time(string str_time);
  88 +};
  89 +
  90 +#endif /* EXTRATORVTT_H */
... ...
extrator/src/include/listenerSRT.h
... ... @@ -1,13 +0,0 @@
1   -#ifndef LISTENERSRT_H
2   -#define LISTENERSRT_H
3   -
4   -#include <stdint.h>
5   -
6   -class ListenerSRT{
7   -
8   -public:
9   - virtual void notifySubtitle(unsigned char* subtitle, int64_t pts) = 0;
10   - virtual void notifyEnd(int sub_size) = 0;
11   -};
12   -
13   -#endif /* LISTENEREXTRATOR_H */
14 0 \ No newline at end of file
extrator/src/include/listenerSub.h 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * \file listenerSRT.h
  3 + */
  4 +
  5 +#ifndef LISTENERSUB_H
  6 +#define LISTENERSUB_H
  7 +
  8 +#include <stdint.h>
  9 +
  10 +class ListenerSub{
  11 +
  12 +public:
  13 + virtual void notifySubtitle(unsigned char* subtitle, uint64_t pts) = 0;
  14 + virtual void notifyEnd(int sub_size) = 0;
  15 +};
  16 +
  17 +#endif /* LISTENERSUB_H */
0 18 \ No newline at end of file
... ...
extrator/src/include/listenerTXT.h
  1 +/**
  2 + * \file listenerTXT.h
  3 + */
  4 +
1 5 #ifndef LISTENERTXT_H
2 6 #define LISTENERTXT_H
3 7  
... ...
extrator/src/include/subtitle.h
1   -/***************************************************************************
2   - * Universidade Federal da Paraíba *
3   - * Copyright (C) 2013 by Laboratório de Aplicações de Vídeo Digital *
4   - * *
5   - * Centro de Informática - UFPB - Campus I *
6   - * João Pessoa - PB - Brasil *
7   - * *
8   - * Author: Leonardo de Araújo Domingues (leonardo.araujo@lavid.ufpb.br) *
9   - * Date: Qui Out 24 22:26:35 BRT 2013 *
10   - * *
11   - **************************************************************************/
  1 +/**
  2 + * \file subtitle.h
  3 + *
  4 + * \author Leonardo de Araújo Domingues <leonardo.araujo@lavid.ufpb.br>
  5 + * \date 24/10/2015
  6 + */
12 7  
13 8 #ifndef SUBTITLE_H
14 9 #define SUBTITLE_H
... ... @@ -23,115 +18,90 @@
23 18  
24 19 namespace sndesc {
25 20  
26   - /**
27   - * Classe que modela legendas.
28   - * Objetos com informações de legendas
29   - * são implementados através desta classe.
30   - */
  21 + /** \brief Representação abstrata de legendas.
  22 + *
  23 + * Objetos com informações de legendas
  24 + * são implementados através desta classe.
  25 + * \headerfile extrator/src/include/subtitle.h
  26 + */
31 27 class Subtitle {
32 28  
33 29 public:
34   - /**
35   - * Construtor da classe.
36   - * Cria uma nova instância da classe para
37   - * representar uma legenda, as variáveis
38   - * iniciam com valores default.
39   - */
  30 + /** Construtor */
40 31 Subtitle();
41 32  
42   - /**
43   - * Construtor da clasee.
44   - * Cria uma nova instância da classe para a representar uma legenda,
45   - * as variáveis iniciam com valores passados por parametros.
46   - * @param _id O numero da legenda.
47   - * @param _sub_text O texto da legenda.
48   - * @param _timein O tempo de inicio da legenda.
49   - * @param _timeout O tempo de termino da legenda.
  33 + /** Construtor.
  34 + *
  35 + * \param _id Número da legenda.
  36 + * \param _sub_text Texto da legenda.
  37 + * \param _timein Tempo de inicio da legenda.
  38 + * \param _timeout Tempo de termino da legenda.
50 39 */
51 40 Subtitle(int _id, string _sub_text, int64_t _timein, int64_t _timeout);
52 41  
53   - /**
54   - * Destrutor da classe.
55   - * Desaloca todo espaço de armazenamento atribuído
56   - * para a instância do Subtitle.
57   - */
  42 + /** Destrutor */
58 43 ~Subtitle();
59 44  
60   - /**
61   - * Seta o id da legenda.
62   - * @param _id O numero da legenda.
  45 + /** Seta o id da legenda.
  46 + *
  47 + * \param _id O numero da legenda.
63 48 */
64 49 void setID(int _id);
65 50  
66   - /**
67   - * Seta o texto da legenda.
68   - * @param _subtext O texto da legenda.
  51 + /** Seta o texto da legenda.
  52 + *
  53 + * \param _subtext O texto da legenda.
69 54 */
70 55 void setSubtitleText(std::string _subtext);
71 56  
72   - /**
73   - * Seta o tempo de inicio da legenda.
74   - * @param _timein O tempo de entrada da legenda.
  57 + /** Seta o tempo de inicio da legenda.
  58 + *
  59 + * \param _timein O tempo de entrada da legenda.
75 60 */
76 61 void setTimeIn(int64_t _timein);
77 62  
78   - /**
79   - * Seta o tempo de termino da legenda.
80   - * @param _timeout O tempo de saida da legenda.
  63 + /** Seta o tempo de termino da legenda.
  64 + *
  65 + * \param _timeout O tempo de saida da legenda.
81 66 */
82 67 void setTimeOut(int64_t _timeout);
83 68  
84   - /**
85   - * Obtém o texto da legenda.
86   - * @return O texto da legenda.
  69 + /** Obtém o texto da legenda.
  70 + *
  71 + * \return O texto da legenda.
87 72 */
88 73 std::string getSubtitleText();
89 74  
90   - /**
91   - * Obtém o tempo de inicio da legenda.
92   - * @return O tempo de inicio.
  75 + /** Obtém o tempo de inicio da legenda.
  76 + *
  77 + * \return O tempo de inicio.
93 78 */
94 79 int64_t getTimeIn();
95 80  
96   - /**
97   - * Obtém o tempo de termino da legenda.
98   - * @return O tempo de saida.
  81 + /** Obtém o tempo de termino da legenda.
  82 + *
  83 + * \return O tempo de termino.
99 84 */
100 85 int64_t getTimeOut();
101 86  
102   - /**
103   - * Obtém o id da legenda.
104   - * @return O numero da legenda.
  87 + /** Obtém o id da legenda.
  88 + *
  89 + * \return O numero da legenda.
105 90 */
106 91 int getID();
107 92  
108   - /**
109   - * Converte os dados de uma legenda em uma string.
110   - * @return Uma string com a representação da legenda.
  93 + /** Converte os dados de uma legenda em uma string.
  94 + *
  95 + * \return Uma string com a representação da legenda.
111 96 */
112 97 string toString();
113 98  
114 99 private:
115   - /**
116   - * O numero da legenda.
117   - */
118   - int id;
119   -
120   - /**
121   - * O texto da legenda.
122   - */
123   - string subtitle_text;
124 100  
125   - /**
126   - * O tempo de entrada da legenda.
127   - */
  101 + int id;
128 102 int64_t time_in;
129   -
130   - /**
131   - * O tempo de saida da legenda.
132   - */
133 103 int64_t time_out;
134   -
  104 + string subtitle_text;
135 105 };
136 106 }
137 107  
... ...
input/src/include/inputException.h
... ... @@ -1,26 +0,0 @@
1   -/***************************************************************************
2   - * Universidade Federal da Paraíba *
3   - * Copyright (C) 2014 by Laboratório de Aplicações de Vídeo Digital *
4   - * *
5   - * Centro de Informática - UFPB - Campus I *
6   - * João Pessoa - PB - Brasil *
7   - * *
8   - * Author: Erickson Silva (erickson.silva@lavid.ufpb.br) *
9   - * *
10   - **************************************************************************/
11   -
12   - #ifndef INPUTEXCEPTION_H
13   - #define INPUTEXCEPTION_H
14   -
15   - #include <lavidlib/base/RuntimeException.h>
16   -
17   - using namespace lavidlib;
18   -
19   - class InputException : public RuntimeException {
20   - public:
21   - InputException(const std::string message);
22   - InputException(const char* message);
23   - };
24   -
25   -
26   - #endif /* INPUTEXCEPTION_H */
27 0 \ No newline at end of file
input/src/include/inputFile.h
... ... @@ -1,46 +0,0 @@
1   -/*
2   - * File: fileInput.h
3   - * Author: leonardo
4   - *
5   - * Created on 6 de Janeiro de 2012, 11:11
6   - */
7   -
8   -#ifndef INPUTFILE_H
9   -#define INPUTFILE_H
10   -
11   -#include <stdio.h>
12   -#include <list>
13   -#include <stdlib.h>
14   -#include <fstream>
15   -#include <string.h>
16   -#include "logger.h"
17   -#include "listenerInput.h"
18   -#include "inputException.h"
19   -#include "dprintf.h"
20   -
21   -#define MAX_SIZE_PACKET 188
22   -
23   -using namespace std;
24   -
25   -class InputFile {
26   -
27   -public:
28   - InputFile(char* path);
29   - ~InputFile();
30   - void initialize();
31   - void addListener(ListenerInput* listener);
32   - void removeListener(ListenerInput* listener);
33   - void notifyListeners(unsigned char* pack);
34   - bool isFinished();
35   -
36   - //void notificaQuantidadeGlosas(int quantidade);
37   -
38   -private:
39   - list<ListenerInput*> *listeners;
40   - char *path;
41   - bool finish;
42   -
43   -};
44   -
45   -#endif /* INPUTFILE_H */
46   -
input/src/include/listenerInput.h
... ... @@ -1,19 +0,0 @@
1   -/*
2   - * File: ouvinteInput.h
3   - * Author: derzu
4   - *
5   - * Created on 8 de Fevereiro de 2010, 18:19
6   - */
7   -
8   -#ifndef _LISTENERINPUT_H
9   -#define _LISTENERINPUT_H
10   -
11   -class ListenerInput {
12   -public:
13   - virtual void notifyInput(unsigned char *pack)=0;
14   - //virtual void finalizouInput()=0;
15   -
16   -};
17   -
18   -#endif /* _LISTENERINPUT_H */
19   -
input/src/inputException.cpp
... ... @@ -1,20 +0,0 @@
1   -/***************************************************************************
2   - * Universidade Federal da Paraíba *
3   - * Copyright (C) 2014 by Laboratório de Aplicações de Vídeo Digital *
4   - * *
5   - * Centro de Informática - UFPB - Campus I *
6   - * João Pessoa - PB - Brasil *
7   - * *
8   - * Author: Erickson Silva (erickson.silva@lavid.ufpb.br) *
9   - * *
10   - **************************************************************************/
11   -
12   - #include "inputException.h"
13   -
14   - InputException::InputException(const std::string message)
15   - : RuntimeException(message)
16   - { /* TODO */ }
17   - InputException::InputException(const char* message)
18   - : RuntimeException(message)
19   - { /* TODO */ }
20   -
21 0 \ No newline at end of file
input/src/inputFile.cpp
... ... @@ -1,59 +0,0 @@
1   -
2   -#include "inputFile.h"
3   -
4   -InputFile::InputFile(char* path) {
5   - this->path = path;
6   - this->listeners = new list<ListenerInput*>();
7   - finish = false;
8   - DPRINTF("Done!\n");
9   -}
10   -
11   -InputFile::~InputFile(){
12   - listeners->clear();
13   - delete listeners;
14   - DDDPRINTF("Input finalized!\n");
15   -}
16   -
17   -void InputFile::initialize(){
18   - ifstream filein(path, ifstream::binary);
19   -
20   - if (strstr(path, ".ts") != NULL) {
21   - if (filein.is_open()) {
22   - char buffer [MAX_SIZE_PACKET];
23   - DPRINTF("[AGUARDE] Lendo arquivo...\n")
24   - while (!filein.eof()) {
25   - filein.read(buffer, MAX_SIZE_PACKET);
26   - unsigned char* packet = (unsigned char*) buffer;
27   - notifyListeners(packet);
28   - }
29   - printf("\n");
30   - filein.close();
31   - //finished = true;
32   - } else {
33   - finish = true;
34   - Util::Logger::Instance()->writeLog((char*) "[ERRO: inputFile.cpp] Arquivo de vídeo não encontrado.");
35   - throw InputException("Falha ao abrir o arquivo de vídeo! Verifique se o mesmo existe.");
36   - }
37   - }
38   - finish = true;
39   -
40   -}
41   -
42   -bool InputFile::isFinished(){
43   - return this->finish;
44   -}
45   -
46   -void InputFile::addListener(ListenerInput* listener){
47   - this->listeners->push_back(listener);
48   -}
49   -
50   -void InputFile::removeListener(ListenerInput* listener) {
51   - this->listeners->remove(listener);
52   -}
53   -
54   -void InputFile::notifyListeners(unsigned char* pack){
55   - for(list<ListenerInput*>::iterator it = this->listeners->begin(); it != this->listeners->end(); it++){
56   - (*it)->notifyInput(pack);
57   - }
58   -}
59   -
main.cpp
... ... @@ -11,95 +11,154 @@
11 11 *
12 12 * Edit on 03 de Fevereiro de 2014
13 13 */
14   -#include "serviceWindowGenerationFromSRT.h"
  14 +#include <stdlib.h>
  15 +#include <string.h>
  16 +#include <sys/time.h>
  17 +#include "logging.h"
  18 +#include "argParser.h"
  19 +#include "serviceTester.h"
  20 +#include "serviceException.h"
  21 +#include "serviceWindowGenerationFromSubtitle.h"
15 22 #include "serviceWindowGenerationFromRec.h"
16 23 #include "serviceWindowGenerationFromText.h"
17   -#include "serviceException.h"
18   -#include <sys/time.h>
19   -#include <stdlib.h>
  24 +#include <lavidlib/base/RuntimeException.h>
  25 +
  26 +#define MAX_SIZE_PATH 256
  27 +#define PATH_VBOX_UPLOADS "vlibras_user/.vlibras-config/uploads"
  28 +#define PATH_DEVEL_CONTENTS "vlibras_user/vlibras-contents/videos"
  29 +#define PATH_DEVEL_UPLOADS "vlibras_user/vlibras-contents/uploads"
20 30  
21 31 using namespace std;
  32 +using namespace util;
22 33  
23   -void serviceSRT(char* service, char* path_video, char* path_srt, char* sublanguage, char* position, char* size, char* transparency, char* id, char* client_type);
24   -void serviceOnlySRT(char* service, char* path_file, char* transparency, char* username, char* client_type);
25   -//void serviceREC(char* path_video, char* sublanguage, char* position, char* size, char* transparency, char* username, char* rate);
26   -void serviceREC(char* service, char* path_video, char* sublanguage, char* position, char* size, char* transparency, char* id, char* client_type);
27   -//void serviceOnlyAudio(char* path_audio, char* transparency, char* username, char* rate);
28   -void serviceOnlyAudio(char* service, char* path_audio, char* transparency, char* id, char* client_type);
29   -void serviceText(char* service, char* path_text, char* transparency, char* id, char* client_type);
  34 +void serviceSRT(int service, string path_video, string path_srt, int language, int position, int size, int background, string id, int mode);
  35 +void serviceREC(int service, string path_video, int position, int size, int background, string id, int mode);
  36 +void serviceOnlySRT(int service, string path_srt, int language, int background, string id, int mode);
  37 +void serviceOnlyAudio(int service, string path_audio, int background, string id, int mode);
  38 +void serviceText(string path_text, int language, int background, string id, int mode);
  39 +void serviceRECWithoutMixing(int service, string path_video, int background, string id, int mode);
  40 +void serviceTest(int position, int size, int background);
30 41  
31 42 void help();
32   -void serviceHelp(int service);
33   -void fail(string msg);
34 43 void hasFailed();
35 44 void hasInvalid();
  45 +void fail(string msg);
  46 +void setPathContents(int mode, string id);
36 47  
37 48 bool isFailed;
38 49 bool isInvalid;
39 50  
40 51 int main(int argc, char* argv[]) {
41 52  
  53 + int service;
  54 + int language;
  55 + int position;
  56 + int size;
  57 + int background;
  58 + int mode;
  59 + int nomixer;
  60 +
  61 + string input;
  62 + string input_srt;
  63 + string id;
  64 +
  65 + ArgParser *parser;
  66 +
42 67 struct timeval tv1, tv2;
43 68 double t1, t2;
44 69  
45 70 gettimeofday(&tv1, NULL);
46 71 t1 = (double)(tv1.tv_sec) + (double)(tv1.tv_usec)/ 1000000.00;
47   -
48   - if(argc > 2) {
49   - printf("\n################## VLIBRAS : LAVID ##################\n\n");
50   - DDPRINTF("Service Type: %s\n", argv[1]);
51   - switch((int) atoi(argv[1])){
52   - case 1:
53   - if(argc <= 9){
54   - serviceHelp(1);
55   - hasInvalid();
56   - }else{
57   - serviceSRT(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]);
58   - }
59   - break;
60   - case 2:
61   - if(argc <= 8){
62   - serviceHelp(2);
63   - hasInvalid();
64   - }else{
65   - serviceREC(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]);
66   - }
67   - break;
68   - case 3:
69   - if(argc <= 5){
70   - serviceHelp(3);
71   - hasInvalid();
72   - }else{
73   - serviceText(argv[1], argv[2], argv[3], argv[4], argv[5]);
74   - }
75   - break;
76   - case 4:
77   - if(argc <= 5){
78   - serviceHelp(4);
79   - hasInvalid();
80   - }else{
81   - serviceOnlySRT(argv[1], argv[2], argv[3], argv[4], argv[5]);
82   - }
83   - break;
84   - case 5:
85   - if(argc <= 5){
86   - serviceHelp(5);
87   - hasInvalid();
88   - }else{
89   - serviceOnlyAudio(argv[1], argv[2], argv[3], argv[4], argv[5]);
90   - }
91   - break;
92   - default:
93   - cout << "\nFAIL VLibras: Serviço inválido! Tente --help" << endl;
94   - hasInvalid();
95   - break;
96   - }
97   - }else if(argc == 2 && (strcmp(argv[1], "--help")) == 0){
98   - help();
99   - exit(0);
100   - }else{
101   - cout << "\nFAIL VLibras: Tente --help para obter informações.\n" << endl;
102   - hasInvalid();
  72 +
  73 + parser = new ArgParser();
  74 + try{
  75 + parser->readArgs(argv, argc);
  76 + }catch(lavidlib::RuntimeException &ex){
  77 + exit(1);
  78 + }
  79 +
  80 + //printf("\n################## LAViD : VLibras ##################\n\n");
  81 +
  82 + service = parser->getService();
  83 + util::Logging::instance()->setLevel(parser->getLog());
  84 +
  85 + switch(service){
  86 + case 1:
  87 + PRINTL(util::_INFO, "Service Type: Video with Subtitles\n");
  88 + input = parser->getInput();
  89 + input_srt = parser->getInputSRT();
  90 + language = parser->getLanguage();
  91 + position = parser->getPosition();
  92 + size = parser->getSize();
  93 + background = parser->getBackground();
  94 + id = parser->getId();
  95 + mode = parser->getMode();
  96 + serviceSRT(service, input, input_srt, language, position, size, background, id, mode);
  97 + break;
  98 +
  99 + case 2:
  100 + PRINTL(util::_INFO, "Service Type: Video Recognize\n");
  101 + input = parser->getInput();
  102 + position = parser->getPosition();
  103 + size = parser->getSize();
  104 + background = parser->getBackground();
  105 + id = parser->getId();
  106 + mode = parser->getMode();
  107 + serviceREC(service, input, position, size, background, id, mode);
  108 + break;
  109 +
  110 + case 3:
  111 + PRINTL(util::_INFO, "Service Type: Text\n");
  112 + input = parser->getInput();
  113 + language = parser->getLanguage();
  114 + background = parser->getBackground();
  115 + id = parser->getId();
  116 + mode = parser->getMode();
  117 + serviceText(input, language, background, id, mode);
  118 + break;
  119 +
  120 + case 4:
  121 + PRINTL(util::_INFO, "Service Type: Subtitles only\n");
  122 + input = parser->getInput();
  123 + language = parser->getLanguage();
  124 + background = parser->getBackground();
  125 + id = parser->getId();
  126 + mode = parser->getMode();
  127 + serviceOnlySRT(service, input, language, background, id, mode);
  128 + break;
  129 +
  130 + case 5: //reconhecimento de audio
  131 + PRINTL(util::_INFO, "Service Type: Audio Recognize\n");
  132 + input = parser->getInput();
  133 + background = parser->getBackground();
  134 + id = parser->getId();
  135 + mode = parser->getMode();
  136 + serviceREC(service, input, 0, 0, background, id, mode);
  137 + break;
  138 +
  139 + case 6: //Reconhecimento de video sem mixagem
  140 + PRINTL(util::_INFO, "Service Type: Video Recognize (Mixer Disabled)\n");
  141 + input = parser->getInput();
  142 + background = parser->getBackground();
  143 + id = parser->getId();
  144 + mode = parser->getMode();
  145 + serviceREC(service, input, 0, 0, background, id, mode);//como service != 2 então não há mixagem
  146 + break;
  147 +
  148 + case 7: // serviço de teste
  149 + position = parser->getPosition();
  150 + size = parser->getSize();
  151 + background = parser->getBackground();
  152 + serviceTest(position, size, background);
  153 + break;
  154 +
  155 + case 8: //ajuda
  156 + help();
  157 + break;
  158 +
  159 + default:
  160 + PRINTL(util::_ERROR, "Opção de serviço não reconhecida!\n");
  161 + hasInvalid();
103 162 }
104 163  
105 164 if(isFailed)
... ... @@ -109,17 +168,24 @@ int main(int argc, char* argv[]) {
109 168  
110 169 gettimeofday(&tv2, NULL);
111 170 t2 = (double)(tv2.tv_sec) + (double)(tv2.tv_usec)/ 1000000.00;
112   - DDPRINTF("Time: %lf\n", (t2-t1));
113   - DDPRINTF("VLibras finalized!\n\n");
  171 + PRINTL(util::_DEBUG, "Time: %lf\n", (t2-t1));
  172 + PRINTL(util::_INFO, "VLibras finalized!\n\n");
114 173 exit(0);
115 174 }
116 175  
117   -void serviceSRT(char* service, char* path_video, char* path_srt, char* sublanguage, char* position,
118   - char* size, char* transparency, char* id, char* client_type){
  176 +void serviceSRT(int service, string path_video, string path_srt, int language, int position, int size, int background, string id, int mode){
  177 + char* video = new char[MAX_SIZE_PATH];
  178 + char* srt = new char[MAX_SIZE_PATH];
  179 + char* name = new char[id.size()];
  180 +
  181 + strcpy(video, path_video.c_str());
  182 + strcpy(srt, path_srt.c_str());
  183 + strcpy(name, id.c_str());
119 184  
120   - ServiceWindowGenerationFromSRT * service_srt;
121   - service_srt = new ServiceWindowGenerationFromSRT(path_video, path_srt, (int) atoi(sublanguage),
122   - (int) atoi(position), (int) atoi(size), (int) atoi(transparency), id, client_type, (int) atoi(service));
  185 + setPathContents(mode, id);
  186 +
  187 + ServiceWindowGenerationFromSubtitle* service_srt;
  188 + service_srt = new ServiceWindowGenerationFromSubtitle(video, srt, language, position, size, background, name, mode, service);
123 189  
124 190 try{
125 191 service_srt->initialize();
... ... @@ -131,16 +197,24 @@ void serviceSRT(char* service, char* path_video, char* path_srt, char* sublangua
131 197 while(!service_srt->isFinished()){
132 198 sleep(5);
133 199 }
134   -
  200 +
  201 + delete [] video;
  202 + delete [] srt;
  203 + delete [] name;
135 204 delete service_srt;
136 205 }
137 206  
138   -void serviceREC(char* service, char* path_video, char* sublanguage, char* position, char* size,
139   - char* transparency, char* id, char* client_type){
  207 +void serviceREC(int service, string path_video, int position, int size, int background, string id, int mode){
  208 + char* video = new char[MAX_SIZE_PATH];
  209 + char* name = new char[id.size()];
  210 +
  211 + strcpy(video, path_video.c_str());
  212 + strcpy(name, id.c_str());
140 213  
141   - ServiceWindowGenerationFromRec * service_rec;
142   - service_rec = new ServiceWindowGenerationFromRec(path_video, (int) atoi(sublanguage),
143   - (int) atoi(position), (int) atoi(size), (int) atoi(transparency), id, client_type, (int) atoi(service));
  214 + setPathContents(mode, id);
  215 +
  216 + ServiceWindowGenerationFromRec* service_rec;
  217 + service_rec = new ServiceWindowGenerationFromRec(video, position, size, background, name, mode, service);
144 218  
145 219 try{
146 220 service_rec->initialize();
... ... @@ -150,15 +224,25 @@ void serviceREC(char* service, char* path_video, char* sublanguage, char* positi
150 224 return;
151 225 }
152 226 while(!service_rec->isFinished()){
153   - sleep(2);
  227 + sleep(5);
154 228 }
  229 +
  230 + delete [] video;
  231 + delete [] name;
155 232 delete service_rec;
156 233 }
157 234  
158   -void serviceText(char* service, char* path_text, char* transparency, char* id, char* client_type){
  235 +void serviceText(string path_text, int language, int background, string id, int mode){
  236 + char* text = new char[MAX_SIZE_PATH];
  237 + char* name = new char[id.size()];
  238 +
  239 + strcpy(text, path_text.c_str());
  240 + strcpy(name, id.c_str());
159 241  
160   - ServiceWindowGenerationFromText *service_text;
161   - service_text = new ServiceWindowGenerationFromText(path_text, (int) atoi(transparency), id, client_type);
  242 + setPathContents(mode, id);
  243 +
  244 + ServiceWindowGenerationFromText* service_text;
  245 + service_text = new ServiceWindowGenerationFromText(text, language, background, name, mode);
162 246  
163 247 try{
164 248 service_text->initialize();
... ... @@ -171,12 +255,23 @@ void serviceText(char* service, char* path_text, char* transparency, char* id, c
171 255 while (!service_text->isFinished()) {
172 256 usleep(100000); //100ms
173 257 }
  258 +
  259 + delete [] text;
  260 + delete [] name;
174 261 delete service_text;
175 262 }
176 263  
177   -void serviceOnlySRT(char* service, char* path_file, char* transparency, char* id, char* client_type){
178   - ServiceWindowGenerationFromSRT * service_srt;
179   - service_srt = new ServiceWindowGenerationFromSRT(path_file, (int) atoi(transparency), id, client_type, (int) atoi(service));
  264 +void serviceOnlySRT(int service, string path_srt, int language, int background, string id, int mode){
  265 + char* srt = new char[MAX_SIZE_PATH];
  266 + char* name = new char[id.size()];
  267 +
  268 + strcpy(srt, path_srt.c_str());
  269 + strcpy(name, id.c_str());
  270 +
  271 + setPathContents(mode, id);
  272 +
  273 + ServiceWindowGenerationFromSubtitle* service_srt;
  274 + service_srt = new ServiceWindowGenerationFromSubtitle(srt, language, background, name, mode, service);
180 275 try{
181 276 service_srt->initialize();
182 277 }catch(ServiceException ex){
... ... @@ -188,81 +283,32 @@ void serviceOnlySRT(char* service, char* path_file, char* transparency, char* id
188 283 while (!service_srt->isFinished()) {
189 284 usleep(100000); //100ms
190 285 }
191   - delete service_srt;
192 286  
  287 + delete [] srt;
  288 + delete [] name;
  289 + delete service_srt;
193 290 }
194 291  
195   -void serviceOnlyAudio(char* service, char* path_audio, char* transparency, char* id, char* client_type){
196   -
197   - ServiceWindowGenerationFromRec * service_rec;
198   - service_rec = new ServiceWindowGenerationFromRec(path_audio, 0, 0, 0, (int) atoi(transparency), id, client_type, (int) atoi(service));
199   -
  292 +void serviceTest(int position, int size, int background) {
  293 + ServiceTester* service_t;
  294 + service_t = new ServiceTester(position, size, background);
200 295 try{
201   - service_rec->initialize();
202   - }catch(ServiceException ex){
  296 + service_t->Start();
  297 + }catch(ServiceException &ex){
203 298 fail(ex.getMessage());
204 299 hasFailed();
205 300 return;
206   - }
207   - while(!service_rec->isFinished()){
208   - sleep(2);
209 301 }
210   - delete service_rec;
211   -}
212 302  
213   -/*void serviceREC(char* path_video, char* sublanguage,
214   - char* position, char* size, char* transparency, char* id, char* rate){
215   -
216   - ServiceWindowGenerationFromREC * service_rec;
217   - service_rec = new ServiceWindowGenerationFromREC(
218   - path_video,
219   - (int) atoi(sublanguage),
220   - (int) atoi(position),
221   - (int) atoi(size),
222   - (int) atoi(transparency),
223   - id, 2, rate);
224   -
225   - try{
226   - service_rec->initialize();
227   - }catch(ServiceException ex){
228   - fail(ex.getMessage());
229   - hasFailed();
230   - return;
231   - }
232   - while(!service_rec->isFinished()){
233   - sleep(2);
  303 + while (!service_t->isFinished()) {
  304 + sleep(5);
234 305 }
235   - delete service_rec;
236   -}*/
237   -
238   -/*void serviceOnlyAudio(char* path_audio, char* transparency, char* id, char* rate){
239   -
240   - ServiceWindowGenerationFromREC * service_rec;
241   - service_rec = new ServiceWindowGenerationFromREC(
242   - path_audio,
243   - 0,
244   - 0,
245   - 0,
246   - (int) atoi(transparency),
247   - id, 5, rate);
248   -
249   - try{
250   - service_rec->initialize();
251   - }catch(ServiceException ex){
252   - fail(ex.getMessage());
253   - hasFailed();
254   - return;
255   - }
256   - while(!service_rec->isFinished()){
257   - sleep(2);
258   - }
259   - delete service_rec;
260   -}*/
  306 + delete service_t;
  307 +}
261 308  
262 309 void fail(string msg){
263   - printf("\n");
264   - DDDDPRINTF("Ops... Tivemos um problema! :(\n");
265   - DDDDPRINTF("Possível causa do erro: %s\n\n", msg.c_str());
  310 + PRINTL(util::_ERROR, "\nOps... Tivemos um problema! :(\n");
  311 + PRINTL(util::_ERROR, "Possível causa do erro: %s\n\n", msg.c_str());
266 312 }
267 313  
268 314 void hasFailed(){
... ... @@ -273,66 +319,53 @@ void hasInvalid(){
273 319 isInvalid = true;
274 320 }
275 321  
276   -void serviceHelp(int service){
277   - cout << "\nParâmetros inválidos! Tente novamente.\n";
278   - switch(service){
279   - case 1:
280   - cout << "\nService Type: Video with Subtitles\n"
281   - << "./vlibras INPUT_VIDEO INPUT_SRT LANGUAGE(1: Portuguese, 2:Glosa) POSITION(1: Top_Left, 2: Top_Right, 3: Bottom_Right, 4: Bottom_Left) "
282   - << "SIZE(1: Small, 2: Medium, 3: Large) TRANSPARENCY(0: Opaque, 1: Transparent) ID CLIENT_TYPE\n";
283   - break;
284   - case 2:
285   - cout << "\nService Type: Video Recognize\n"
286   - << "./vlibras INPUT_VIDEO LANGUAGE(1: Portuguese, 2:Glosa) POSITION(1: Top_Left, 2: Top_Right, 3: Bottom_Right, 4: Bottom_Left) "
287   - << "SIZE(1: Small, 2: Medium, 3: Large) TRANSPARENCY(0: Opaque, 1: Transparent) ID CLIENT_TYPE\n";
288   - break;
289   - case 3:
290   - cout << "\nService Type: Text\n"
291   - << "./vlibras INPUT_TEXT_FILE TRANSPARENCY(0: Opaque, 1: Transparent) ID CLIENT_TYPE\n";
292   - break;
293   - case 4:
294   - cout << "\nService Type: Subtitles only\n"
295   - << "./vlibras INPUT_SRT TRANSPARENCY(0: Opaque, 1: Transparent) ID CLIENT_TYPE\n";
296   - break;
297   - case 5:
298   - cout << "\nService Type: Audio Recognize\n"
299   - << "./vlibras INPUT_AUDIO TRANSPARENCY(0: Opaque, 1: Transparent) ID CLIENT_TYPE\n";
300   - break;
  322 +void setPathContents(int mode, string id){
  323 + string command = "mkdir -p ";
  324 + switch(mode){
  325 + case 1://devel
  326 + char* vlStorage;
  327 + char* vlUploads;
  328 + vlStorage = getenv("VLSTORAGE");
  329 + vlUploads = getenv("VLUPLOADS");
  330 +
  331 + if(vlStorage == NULL || vlUploads == NULL){
  332 + command.append(PATH_DEVEL_CONTENTS).append(" && mkdir -p ")
  333 + .append(PATH_DEVEL_UPLOADS).append("/").append(id);
  334 + system(command.c_str());
  335 + }
  336 + break;
  337 +
  338 + case 2://produção
  339 + command.append(PATH_VBOX_UPLOADS).append("/").append(id);
  340 + system(command.c_str());
  341 + break;
  342 +
  343 + default:
  344 + fail("Modo de execução não reconhecido!");
  345 + exit(127);
301 346 }
302 347 }
303 348  
304   -//Help do programa, explicando todos os parâmetros existentes...
305   -void help() {
306   -
307   - cout << endl
308   - << "Usage Summary: vlibras [SERVICE] [INPUT] ... [TRANSPARENCY] [ID] [CLIENT_TYPE]\n"
309   - << "\nSERVICE:\n"
310   - << "1 Video with Subtitles (SRT) - requires INPUT_VIDEO and INPUT_SRT\n"
311   - << "2 Video Recognize - requires INPUT_VIDEO\n"
312   - << "3 Text - requires INPUT_TEXT_FILE\n"
313   - << "4 Subtitles only (SRT) - requires INPUT_SRT\n"
314   - << "5 Audio Recognize - requires INPUT_AUDIO\n"
315   - << "\nSERVICES PARAMETERS:\n"
316   - << "Video with subtitles:\n"
317   - << " [INPUT_VIDEO] [INPUT_SRT] [LANGUAGE] [POSITION] [SIZE] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n"
318   - << "\nVideo Recognize:\n"
319   - << " [INPUT_VIDEO] [LANGUAGE] [POSITION] [SIZE] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n"
320   - << "\nText:\n"
321   - << " [INPUT_TEXT_FILE] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n"
322   - << "\nSubtitles only:\n"
323   - << " [INPUT_SRT] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n"
324   - << "\nAudio Recognize\n"
325   - << " [INPUT_AUDIO] [TRANSPARENCY] [ID] [CLIENT_TYPE]\n"
326   - << "\nPARAMETERS:\n"
327   - << "INPUT_VIDEO Path of the video file\n"
328   - << "INPUT_SRT Path of the subtitle file\n"
329   - << "INPUT_TEXT_FILE Path of the text file\n"
330   - << "INPUT_AUDIO Path of the audio file\n"
331   - << "LANGUAGE 1 - means Portuguese, 2 - means Glosa\n"
332   - << "POSITION 1 - means Top_Left, 2 - means Top_Right, 3 - means Bottom_Right, 4 - means Bottom_Left\n"
333   - << "SIZE 1 - means Small, 2 - means Medium, 3 - means Large\n"
334   - << "TRANSPARENCY 0 - means that the background is opaque , 1 - means that the background is transparent\n"
335   - << "ID Relative to the unique ID on the Database\n"
336   - << "CLIENT_TYPE prod - means that the client is web/cloud, devel - means that the client is developer\n"
337   - << endl;
338   -}
339 349 \ No newline at end of file
  350 +void help()
  351 +{
  352 + std::cout << std::endl
  353 + << "Usage Summary: vlibras [Service_option] filepath [Options] --id [name] --mode [devel,prod]"
  354 + << "\n\nService_option:"
  355 + << "\n\tVideo with Subtitles -V, --video [filePath] -S, --subtitle [filePath]"
  356 + << "\n\tVideo Recognize -V, --video [filePath]"
  357 + << "\n\tAudio Recognize -A, --audio [filepath]"
  358 + << "\n\tText -T, --text [filePath]"
  359 + << "\n\tSubtitles only -S, --subtitle [filePath]"
  360 + << "\n\nOptions:"
  361 + << "\n\t-l, --language [portugues,glosa]"
  362 + << "\n\t-b, --background [opaque,transp]"
  363 + << "\n\t-r, --resolution [small,medium,large]"
  364 + << "\n\t-p, --position [top_left,top_right,bottom_left,bottom_right]"
  365 + << "\n\t-m, --mode [devel,prod]"
  366 + << "\n\t-v, --loglevel [quiet,error,warning,info,debug]"
  367 + << "\n\t--id [name] Relative to the unique ID on the Database."
  368 + << "\n\t--no-mixer Disables mixing with the original video."
  369 + << "\n\nSee man vlibras for detailed descriptions."
  370 + << std::endl;
  371 + exit(0);
  372 +}
... ...
mixer/src/Mixer.cpp
... ... @@ -1,353 +0,0 @@
1   -/*
2   - * File: Mixer.cpp
3   - * Author: eduardo
4   - *
5   - * Created on 17 de Janeiro de 2012, 15:28
6   - */
7   -#include "Mixer.h"
8   -
9   -/* Construtores e destrutores...*/
10   -Mixer::Mixer() {
11   - this->setNumThreads("1");
12   - DPRINTF("Done!\n");
13   -}
14   -Mixer::Mixer(string mainVideo, string secondaryVideo) {
15   - this->setMainVideo(mainVideo);
16   - this->setSecondaryVideo(secondaryVideo);
17   - this->setNumThreads("1");
18   - DPRINTF("Done!\n");
19   -}
20   -Mixer::~Mixer() {
21   - DDDPRINTF("Mixer finalized!\n");
22   -}
23   -/* FIM de Construtores e destrutores...*/
24   -
25   -/*Faz a chamada ffmpeg no terminal.*/
26   -
27   -void Mixer::initialize(string mainVideo, string slVideo, int positionSecondaryVideo, int sizeSecondaryVideo,
28   - int transparency, char* _id, char* path_uploads, char* path_contents){
29   -
30   - DPRINTF("[AGUARDE] Mixando...\n")
31   - uploads = path_uploads;
32   - contents = path_contents;
33   - stringstream ss;
34   - ss << _id;
35   - ss >> user_id;
36   -
37   - this->setMainVideo(mainVideo);
38   - this->setSecondaryVideo(slVideo);
39   - this->setNumThreads("8"); //tem que aparecer antes do metodo adjustVideosFps()
40   - //this->adjustVideosFps();
41   -
42   - this->setSize(sizeSecondaryVideo);
43   - this->setPositionSecondaryVideo(positionSecondaryVideo);
44   - this->setTransparency(transparency);
45   - this->setPathFinal();
46   - this->mixVideos();
47   -}
48   -
49   -void Mixer::mixVideos () {
50   - //convertendo os numeros em string para concatenar à frase
51   - std::stringstream num1;
52   - num1 << this->widthSecondaryVideo;
53   - string num1String;
54   - num1 >> num1String;
55   -
56   - std::stringstream num2;
57   - num2 << this->heightSecondaryVideo;
58   - string num2String;
59   - num2 >> num2String;
60   -
61   - /*std::stringstream num2;
62   - num2 << this->heightSecondaryVideo;
63   - string num2String, aux;
64   - num2 >> aux;
65   - num2String = "in_h*"+aux;*/
66   -
67   - string strPosition;
68   - if(this->getPositionSecondaryVideo() == TOP_LEFT)
69   - strPosition = "10:10";
70   - else if((this->getPositionSecondaryVideo() == TOP_RIGHT))
71   - strPosition = "main_w-overlay_w-10:10";
72   - else if((this->getPositionSecondaryVideo() == BOTTOM_RIGHT))
73   - strPosition = "main_w-overlay_w-10:main_h-overlay_h-10";
74   - else if((this->getPositionSecondaryVideo() == BOTTOM_LEFT))
75   - strPosition = "10:main_h-overlay_h-10";
76   - else{ //se não escolheu nenhum inteiro válido, consideramos BOTTOM_RIGHT o local padrão, mostra msg de erro
77   - strPosition = "main_w-overlay_w-10:main_h-overlay_h-10";
78   - cout << "####################################################################\n";
79   - cout << "# Posicao do vídeo de libras é inválido! #\n";
80   - cout << "# Assumiremos a posicao padrao (Bottom_Right)! #\n";
81   - cout << "# OPCOES: 1-Top_Left; 2-Top_Right; 3-Bottom_Right; 4-Bottom_Left; #\n";
82   - cout << "####################################################################";
83   - }
84   -
85   - //retira a string .ts da primeira string
86   - //string nameOfMainVideo = mainVideo.substr(0,mainVideo.length()-3);
87   - int dotPosition = 0;
88   - for(int k = mainVideo.length(); k >= 0; k--) {
89   - if (mainVideo[k] == '.') {
90   - dotPosition = k;
91   - break;
92   - }
93   - }
94   - string nameOfMainVideo = mainVideo.substr(0, dotPosition);
95   -
96   - string transparency;
97   - if(this->getTransparency()==0){
98   - transparency = "";
99   - }
100   - else
101   - transparency = "transp";
102   -
103   - /*string ffmpegSentence = "ffmpeg -i "+this->mainVideo+" -y -vf \"movie="+this->secondaryVideo+", "+
104   - "scale="+ num1String +":"+num2String+", setpts=PTS-STARTPTS [movie]; "+
105   - "[in] setpts=PTS-STARTPTS, [movie] overlay"+transparency+"="+strPosition+
106   - " [out]\" -sameq -threads "+this->numThreads+" "+nameOfMainVideo+"_Libras.ts";*/
107   -
108   - /*string ffmpegSentence = "ffmpeg -i "+this->mainVideo+" -y -vf \"movie="+this->secondaryVideo+", "+
109   - "scale="+ num1String +":"+num2String+", setpts=PTS-STARTPTS [movie]; "+
110   - "[in] setpts=PTS-STARTPTS, [movie] overlay"+transparency+"="+strPosition+
111   - " [out]\" -sameq -ar 22050 -ab 32 -f flv -acodec pcm_s16le -vcodec flv -threads "+this->numThreads+" "+nameOfMainVideo+"_Libras.flv";*/
112   -
113   - //LEONARDO
114   - /*string ffmpegSentence = "ffmpeg -i "+this->mainVideo+" -y -vf \"movie="+this->secondaryVideo+", "+
115   - "scale="+ num1String +":"+num2String+", [movie] overlay"+transparency+"="+strPosition+
116   - " [out]\" -sameq -ar 22050 -ab 32 -f flv -acodec pcm_s16le -vcodec flv -threads "+this->numThreads+" "+nameOfMainVideo+"_Libras.flv";*/
117   -
118   - //TRANSCODIFICAR PARA FLV
119   - /*
120   - string ffmpegSentence = "ffmpeg -i "+this->mainVideo+" -y -vf \"movie="+this->secondaryVideo+", "+
121   - "scale="+ num1String +":"+num2String+", setpts=PTS-STARTPTS, [movie] overlay"+transparency+"="+strPosition+
122   - " [out]\" -sameq -strict experimental -vcodec mpeg2video -r 30 -threads "+this->numThreads+" "+pathFinal;
123   - */
124   -
125   - string ffmpegSentence = "ffmpeg -i "+this->mainVideo+" -v quiet -y -vf \"movie="+this->secondaryVideo+", "+
126   - "scale="+ num1String +":"+num2String+", setpts=PTS-STARTPTS, [movie] overlay"+transparency+"="+strPosition+
127   - " [out]\" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 -threads "+this->numThreads+" "+pathFinal;
128   -
129   -
130   -
131   - /*
132   - string ffmpegSentence = "ffmpeg -i "+this->mainVideo+" -y -vf \"movie="+this->secondaryVideo+", "+
133   - "scale="+ num1String +":"+num2String+", setpts=PTS-STARTPTS, [movie] overlay"+transparency+"="+strPosition+
134   - " [out]\" -sameq -threads "+this->numThreads+" "+pathFinal;
135   - */
136   -
137   - /*
138   - convertendo e obtendo ótimos resultados de tamanho do vídeo
139   - ffmpeg -i videoDemoLibras.ts -vcodec libx264 -f flv -ar 22050 -ab 32 -sameq -threads 8 -y teste.flv
140   - */
141   -
142   - //printf("\n\n%s\n\n", ffmpegSentence.c_str());
143   - system(ffmpegSentence.c_str());
144   -
145   - //string removeVideoCMD = "rm -rf "+nameOfMainVideo+".ts"; //removo o vídeo exemplo-45fps.ts
146   - //system(removeVideoCMD.c_str());
147   -}
148   -
149   -void Mixer::setPathFinal(){
150   - stringstream ss;
151   - ss << contents;
152   - ss >> pathFinal;
153   - pathFinal.append(user_id).append(".mp4");
154   -}
155   -
156   -/*Ajusta o FPS do vídeo principal para 45 se preciso...*/
157   -void Mixer::adjustVideosFps(){
158   - //primeiro executo a linha de comando que me dá todas as informações do vídeo
159   - string ffmpegSentence = "ffmpeg -i "+this->mainVideo+" 2> "+temporaryTextFile;
160   - system(ffmpegSentence.c_str()); //executo o comando ffmpeg que escreve no arquivo temporário
161   -
162   - fpsAndLine arrayDeFps[10]; //array onde será guardado os fps encontrados
163   - int qtdadeDeFPSEncontrados = 0;
164   - this->readFileFPS(arrayDeFps, &qtdadeDeFPSEncontrados); //leio o arquivo procurando os FPS disponíveis
165   -
166   - this->convertMainVideoFPS(arrayDeFps, &qtdadeDeFPSEncontrados); //converte o fps do vídeo principal
167   -}
168   -
169   -/*Lê do arquivo procurando o fps...*/
170   -void Mixer::readFileFPS(fpsAndLine arrayDeFps [], int * qtdadeDeFPSEncontrados){
171   - ifstream arq(temporaryTextFile.c_str());//abrindo arquivo com info. dos vídeos
172   - if (arq.is_open()){
173   - int indiceDoFPSEncontrados = 0; //indice a ser utilizado no array
174   - string line;
175   - while (!arq.eof()){
176   - getline(arq,line); //linha lida no arquivo
177   -
178   - int auxProgram = line.find("Program "); //procura pela string "fps,"
179   - if(auxProgram >= 0){
180   - string id = line.substr(auxProgram+10);
181   - if(atoi(id.c_str()) != 0){ //diferente de 0, a conversão deu blz...
182   - arrayDeFps[indiceDoFPSEncontrados].possibleProgramID = id;
183   - printf("\n\n\n\n\nID: %s\n\n\n\n\n",id.c_str());
184   - }
185   - }
186   -
187   - int aux = line.find("fps,"); //procura pela string "fps,"
188   - if(aux >= 0){
189   - int i;
190   - int espacos = 0; //quantidade de espacos encontrados
191   - for(i = aux;espacos != 2;i--){
192   - if(line.at(i) == ' '){ //se for espaço incremente
193   - espacos++;
194   - }
195   - }
196   - string fps = line.substr(i+espacos,aux-i-espacos-1);//extrai o fps da linha
197   - double fpsDouble = atof(fps.c_str()); //transformo de string pra double
198   -
199   - arrayDeFps[indiceDoFPSEncontrados].fps = fpsDouble; //armazeno o fps em um array de struct
200   - arrayDeFps[indiceDoFPSEncontrados].line = line; //armazeno a linha em um array de struct
201   -
202   - indiceDoFPSEncontrados++; //achei um fps, preenchi um struct, vou pro prox.
203   - }
204   - }
205   - arq.close();
206   - //*qtdadeDeFPSEncontrados = indiceDoFPSEncontrados + 1;
207   - *qtdadeDeFPSEncontrados = indiceDoFPSEncontrados;
208   - }
209   -
210   -}
211   -
212   -void Mixer::convertMainVideoFPS(fpsAndLine arrayDeFps [], int * qtdadeDeFPSEncontrados){
213   - //retira a string .ts da primeira string
214   - string nameOfMainVideo = mainVideo.substr(0,mainVideo.length()-3);
215   -
216   - int i;
217   - if(*qtdadeDeFPSEncontrados > 1){
218   - //cout << "\n############################\nConverter fps do vídeo principal com vários canais!\n############################\n");
219   - for(i = 0; i < *qtdadeDeFPSEncontrados;i++){
220   - //procura pela string "Video: h264 (High), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9],"
221   - int indexMainVideo1 = arrayDeFps[i].line.find("Video: h264 (High)");
222   - int indexMainVideo2 = arrayDeFps[i].line.find("yuv420p");
223   - int indexMainVideo3 = arrayDeFps[i].line.find("1920x1080");
224   - //int indexMainVideo = arrayDeFps[i].line.find("DAR 16:9");
225   -
226   - //printf("\n\n\n\n\n\n\nPID do canal: %s \n\n\n\n\n\n\n",arrayDeFps[i].possibleProgramID.c_str());
227   - if(indexMainVideo1 > 0 && indexMainVideo2 > 0 && indexMainVideo3 > 0){ //eis aqui o vídeo principal
228   - //printf("\n\n\n\n\n\n\nPID do canal a ser alterado: %s \n\n\n\n\n\n\n",arrayDeFps[i].possibleProgramID.c_str());
229   - string ffmpegSentence45 = "ffmpeg -i "+this->mainVideo+" -v quiet -y -r 45 -vcodec libx264 -streamid 0:"+arrayDeFps[i].possibleProgramID+
230   - "-sameq -threads "+this->numThreads+" "+nameOfMainVideo+"-45fps.ts";
231   - system(ffmpegSentence45.c_str());
232   - //string removeVideoCMD = "rm -rf "+nameOfMainVideo+".ts"; //removo o vídeo exemplo.ts
233   - //system(removeVideoCMD.c_str());
234   - this->setMainVideo(nameOfMainVideo+"-45fps.ts");
235   - break;
236   - }
237   - }
238   - }
239   - else{
240   - //cout << "\n############################\nConverter fps do vídeo principal com apenas um canal!\n############################\n");
241   - string ffmpegSentence45 = "ffmpeg -i "+this->mainVideo+" -v quiet -y -r 45 -vcodec libx264 "
242   - "-sameq -threads "+this->numThreads+" "+nameOfMainVideo+"-45fps.ts";
243   - system(ffmpegSentence45.c_str());
244   - //string removeVideoCMD = "rm -rf "+nameOfMainVideo+".ts"; //removo o vídeo exemplo.ts
245   - //system(removeVideoCMD.c_str());
246   - this->setMainVideo(nameOfMainVideo+"-45fps.ts");
247   - }
248   -}
249   -
250   -
251   -
252   -
253   -/* O valor da largura e altura está na unidade de Pixels.
254   - * Se o valor da variável for -1, deverá manter a proporção da mesma em relação
255   - * à outra.
256   - * Ex.: 600:-1 ==> largura é 600 e a altura será calculada em relação à mesma para
257   - * manter proporção.
258   - * Ex.: -1:600 ==> altura é 600 e a largura será calculada em relação à mesma para
259   - * manter proporção.
260   - */
261   -void Mixer::setSize(int size){
262   -
263   - string ffprobeSentence = "ffprobe -show_streams "+this->mainVideo+" 2> /dev/null | grep \"height=\" | cut -d'=' -f2 > "+temporaryTextFile;
264   - system(ffprobeSentence.c_str());
265   -
266   - //printf("\n\n%s\n\n",ffprobeSentence.c_str());
267   -
268   -
269   - string heightStr = "324"; //se não conseguir ler do arquivo a altura será essa.. :(
270   -
271   - ifstream arq(temporaryTextFile.c_str());//abrindo arquivo com info. dos vídeos
272   - if (arq.is_open()){
273   - getline(arq,heightStr); //lendo o tamanho(altura) do vídeo
274   - arq.close();
275   - }
276   -
277   - string removeFileSentence = "rm -rf "+temporaryTextFile;
278   - //system(removeFileSentence.c_str());
279   -
280   - int height = atoi(heightStr.c_str());
281   -
282   -
283   - if(size == SMALL){
284   - this->widthSecondaryVideo = -1;
285   - this->heightSecondaryVideo = (0.3*height);
286   - }
287   - else if(size == MEDIUM){
288   - this->widthSecondaryVideo = -1;
289   - this->heightSecondaryVideo = (0.4*height);
290   - }
291   - else if(size == LARGE){
292   - this->widthSecondaryVideo = -1;
293   - this->heightSecondaryVideo = (0.5*height);
294   - }
295   - else{ //se não escolheu nenhum inteiro válido, consideramos MEDIUM_WIDTH a largura padrão, mostra msg de erro
296   - this->widthSecondaryVideo = -1;
297   - this->heightSecondaryVideo = (0.4*height);
298   - cout << "################################################\n";
299   - cout << "# Tamanho do vídeo de libras é inválido! #\n";
300   - cout << "# Assumiremos a largura padrao (Medium_Width)! #\n";
301   - cout << "# OPCOES: 1-Small; 2-Medium; 3-Large; #\n";
302   - cout << "################################################";
303   - }
304   -}
305   -
306   -/*Setters e getters...*/
307   -void Mixer::setMainVideo(string mainVideo){
308   - this->mainVideo = mainVideo;
309   - //retira a string .ts da primeira string, adiciona o "temp" antes e o ".txt" depois
310   - //string nameOfMainVideo = mainVideo.substr(0,mainVideo.length()-3);
311   - int dotPosition = 0;
312   - for(int k = mainVideo.length(); k >= 0; k--) {
313   - if (mainVideo[k] == '.') {
314   - dotPosition = k;
315   - break;
316   - }
317   - }
318   -//ajeitar isso depois
319   - string nameOfMainVideo = mainVideo.substr(0, dotPosition);
320   -
321   - stringstream ss;
322   - ss << uploads;
323   - ss >> temporaryTextFile;
324   - temporaryTextFile.append(this->user_id).append("/tamanho.txt");
325   - //printf("##########temporaryTextFile: %s\n", temporaryTextFile.c_str());
326   -}
327   -string Mixer::getMainVideo(){
328   - return this->mainVideo;
329   -}
330   -void Mixer::setSecondaryVideo(string secondaryVideo){
331   - this->secondaryVideo = secondaryVideo;
332   -}
333   -string Mixer::getSecondaryVideo(){
334   - return this->secondaryVideo;
335   -}
336   -void Mixer::setPositionSecondaryVideo(int positionSecondaryVideo){
337   - this->positionSecondaryVideo = positionSecondaryVideo;
338   -}
339   -int Mixer::getPositionSecondaryVideo(){
340   - return this->positionSecondaryVideo;
341   -}
342   -void Mixer::setTransparency(int transparency){
343   - this->transparency = transparency;
344   -}
345   -int Mixer::getTransparency(){
346   - return this->transparency;
347   -}
348   -void Mixer::setNumThreads(string numThreads){
349   - this->numThreads = numThreads;
350   -}
351   -string Mixer::getNumThreads(){
352   - return this->numThreads;
353   -}
mixer/src/include/Mixer.h
... ... @@ -1,86 +0,0 @@
1   -/*
2   - * File: Mixer.h
3   - * Author: eduardo
4   - *
5   - * Created on 17 de Janeiro de 2012, 15:28
6   - */
7   -
8   -#ifndef MIXER_H
9   -#define MIXER_H
10   -
11   -#include "string.h"
12   -#include <cstdlib>
13   -#include <iostream>
14   -#include <stdio.h>
15   -#include <stdlib.h>
16   -#include <sstream>
17   -#include <string>
18   -#include <fstream>
19   -#include "dprintf.h"
20   -
21   -//SL Video Position
22   -#define TOP_LEFT 1
23   -#define TOP_RIGHT 2
24   -#define BOTTOM_RIGHT 3
25   -#define BOTTOM_LEFT 4
26   -//SL Video Size
27   -#define SMALL 1
28   -#define MEDIUM 2
29   -#define LARGE 3
30   -//SL Video Width
31   -#define SMALL_HEIGHT 324 //0,3*1080 se fosse full hd
32   -#define MEDIUM_HEIGHT 432 //0,4*1080
33   -#define LARGE_HEIGHT 540 //0.5*1080
34   -
35   -#define MAX_SIZE_PATH 256
36   -
37   -using namespace std;
38   -
39   -class Mixer {
40   -public:
41   -
42   - Mixer(string,string);
43   - Mixer();
44   - virtual ~Mixer();
45   -
46   - void adjustVideosFps();
47   -
48   - void mixVideos();
49   - void setSize(int);
50   -
51   - /* Setters e getters...*/
52   - void setMainVideo(string);
53   - string getMainVideo();
54   - void setSecondaryVideo(string);
55   - string getSecondaryVideo();
56   - void setPositionSecondaryVideo(int);
57   - int getPositionSecondaryVideo();
58   - void setTransparency(int);
59   - int getTransparency();
60   - void setNumThreads(string);
61   - string getNumThreads();
62   - void initialize(string mainVideo, string slVideo, int, int, int, char*, char*, char*);
63   - void setPathFinal();
64   -
65   -private:
66   -
67   - struct fpsAndLine {
68   - string line;
69   - double fps;
70   - string possibleProgramID;
71   - };
72   -
73   - void readFileFPS(fpsAndLine [], int *);
74   - void convertMainVideoFPS(fpsAndLine [], int *);
75   - void convertSecondaryVideoFPS(double);
76   -
77   - string mainVideo, secondaryVideo, temporaryTextFile, numThreads, pathFinal, user_id;
78   - char* contents;
79   - char* uploads;
80   - int positionSecondaryVideo;
81   - double widthSecondaryVideo, heightSecondaryVideo;
82   - int transparency;
83   -};
84   -
85   -#endif /* MIXER_H */
86   -
mixer/src/include/mixer.h 0 → 100644
... ... @@ -0,0 +1,118 @@
  1 +/**
  2 + * \file Mixer.h
  3 + *
  4 + * \author Eduardo
  5 + * \date 17/01/2012
  6 + */
  7 +
  8 +/**
  9 +* edit: Wesnydy Ribeiro
  10 +* date: 16/10/2015
  11 +*/
  12 +
  13 +#ifndef MIXER_H
  14 +#define MIXER_H
  15 +
  16 +#include <string>
  17 +#include <iostream>
  18 +#include <sstream>
  19 +#include <fstream>
  20 +#include "logging.h"
  21 +
  22 +//Secondary Video Position
  23 +#define TOP_LEFT 1
  24 +#define TOP_RIGHT 2
  25 +#define BOTTOM_RIGHT 3
  26 +#define BOTTOM_LEFT 4
  27 +
  28 +//Secondary Video Size
  29 +#define SMALL 1
  30 +#define MEDIUM 2
  31 +#define LARGE 3
  32 +
  33 +#define NUMTHREADS "8"
  34 +
  35 +using namespace std;
  36 +using namespace util;
  37 +
  38 +/** \brief Classe que implementa o mixador de vídeos.
  39 + *
  40 + * \headerfile mixer/src/include/mixer.h
  41 + */
  42 +class Mixer {
  43 +
  44 +public:
  45 + /** Construtor.
  46 + *
  47 + * \param mVideo Path do vídeo principal.
  48 + * \param sVideo Path do vídeo secundário.
  49 + * \param ssVideo Tamanho do vídeo secundario.
  50 + * \param psVideo Posição do vídeo secundário em relação ao vídeo principal.
  51 + * \param tsVideo Transparência do vídeo sencundário.
  52 + * \param id Identificação do cliente na base de dados.
  53 + * \param pathTemp Path onde serão armazenados os arquivos temporários.
  54 + * \param pathContents Path onde será armazenado o vídeo mixado.
  55 + */
  56 + Mixer(string mVideo, string sVideo, int ssVideo, int psVideo, int tsVideo,
  57 + string id, string pathTemp, string pathContents);
  58 +
  59 + /** Destrutor. */
  60 + ~Mixer();
  61 +
  62 + /** Inicializa o processo de mixagem.
  63 + *
  64 + * A mixagem é feita através de uma chamada do FFMPEG.
  65 + */
  66 + void initialize();
  67 +
  68 +private:
  69 + string pathMixedVideo;
  70 + string pathTempFiles;
  71 +
  72 + string mainVideo;
  73 + string secondaryVideo;
  74 + string temporaryTextFile;
  75 + string transparency;
  76 + string userID;
  77 +
  78 + string heigthStr;
  79 + string widthStr;
  80 + string positionStr;
  81 +
  82 + double widthSVideo;
  83 + double heigthSVideo;
  84 +
  85 + int positionSVideo;
  86 + int sizeSVideo;
  87 + int transpSVideo;
  88 +
  89 + /** Realiza a mixagem dos vídeos.
  90 + *
  91 + * Chama o FFMPEG passando os parâmetros necessários
  92 + * para a mixagem dos vídeos.
  93 + */
  94 + void mixVideos();
  95 +
  96 + /** Define o tamanho do vídeo secundário.
  97 + *
  98 + * O tamanho do vídeo secundário depende do tamanho
  99 + * do vídeo principal e da opção de resolução selecionada.
  100 + */
  101 + void setSVSize();
  102 +
  103 + /** Define a posição do vídeo secundário.
  104 + *
  105 + * A posição do vídeo secundário depende da posição
  106 + * selecionada pelo usuário.
  107 + */
  108 + void setSVPosition();
  109 +
  110 + /** Seta o path dos arquivos.
  111 + *
  112 + * O path dos arquivos temporários e do vídeo mixado
  113 + * são setados através desse método.
  114 + */
  115 + void setPathOfFiles();
  116 +};
  117 +
  118 +#endif /* MIXER_H */
0 119 \ No newline at end of file
... ...
mixer/src/mixer.cpp 0 → 100644
... ... @@ -0,0 +1,139 @@
  1 +#include "mixer.h"
  2 +
  3 +Mixer::Mixer(string mVideo, string sVideo, int ssVideo, int psVideo, int tsVideo,
  4 + string id, string pathTemp, string pathContents) {
  5 + this->mainVideo = mVideo;
  6 + this->secondaryVideo = sVideo;
  7 + this->sizeSVideo = ssVideo;
  8 + this->positionSVideo = psVideo;
  9 + this->transpSVideo = tsVideo;
  10 + this->transparency = ""; //Por enquanto, a transparência esta desativada.
  11 + this->pathTempFiles = pathTemp;
  12 + this->pathMixedVideo = pathContents;
  13 + this->userID = id;
  14 + PRINTL(util::_DEBUG, "Mixer Done!\n");
  15 +}
  16 +
  17 +Mixer::~Mixer() {
  18 + PRINTL(util::_DEBUG, "Mixer finalized!\n");
  19 +}
  20 +
  21 +void Mixer::setPathOfFiles() {
  22 + this->pathTempFiles.append("/").append(this->userID);
  23 + this->pathMixedVideo.append("/").append(this->userID).append(".mp4");
  24 +}
  25 +
  26 +/* O valor da largura e altura está na unidade de Pixels.
  27 + * Se o valor da variável for -1, deverá manter a proporção da mesma em relação
  28 + * à outra.
  29 + * Ex.: 600:-1 ==> largura é 600 e a altura será calculada em relação à mesma para
  30 + * manter proporção.
  31 + * Ex.: -1:600 ==> altura é 600 e a largura será calculada em relação à mesma para
  32 + * manter proporção.
  33 + */
  34 +void Mixer::setSVSize() {
  35 + string tempTextFile = this->pathTempFiles;
  36 + tempTextFile.append("/").append("tamanho.txt");
  37 +
  38 + string ffprobeSentence = "ffprobe -show_streams "+this->mainVideo+" 2> /dev/null | grep \"height=\" | cut -d'=' -f2 > "+tempTextFile;
  39 + system(ffprobeSentence.c_str());
  40 +
  41 + string strHeight = "324"; //Se não conseguir ler do arquivo a altura será essa...
  42 + ifstream arq(tempTextFile.c_str()); //Abrindo arquivo com info. dos vídeos
  43 + if (arq.is_open()) {
  44 + getline(arq,strHeight); //Lendo o tamanho(altura) do vídeo
  45 + arq.close();
  46 + }
  47 + int height = atoi(strHeight.c_str());
  48 +
  49 + stringstream alt;
  50 + stringstream larg;
  51 +
  52 + switch(this->sizeSVideo){
  53 + case SMALL:
  54 + this->widthSVideo = -1;
  55 + this->heigthSVideo = (0.3*height);
  56 +
  57 + larg << this->widthSVideo;
  58 + larg >> this->widthStr;
  59 +
  60 + alt << this->heigthSVideo;
  61 + alt >> this->heigthStr;
  62 + break;
  63 +
  64 + case MEDIUM:
  65 + this->widthSVideo = -1;
  66 + this->heigthSVideo = (0.4*height);
  67 +
  68 + larg << this->widthSVideo;
  69 + larg >> this->widthStr;
  70 +
  71 + alt << this->heigthSVideo;
  72 + alt >> this->heigthStr;
  73 + break;
  74 +
  75 + case LARGE:
  76 + this->widthSVideo = -1;
  77 + this->heigthSVideo = (0.5*height);
  78 +
  79 + larg << this->widthSVideo;
  80 + larg >> this->widthStr;
  81 +
  82 + alt << this->heigthSVideo;
  83 + alt >> this->heigthStr;
  84 + break;
  85 +
  86 + default: //Se não escolheu nenhum inteiro válido, consideramos MEDIUM como o tamanho padrão.
  87 + this->widthSVideo = -1;
  88 + this->heigthSVideo = (0.4*height);
  89 +
  90 + larg << this->widthSVideo;
  91 + larg >> this->widthStr;
  92 +
  93 + alt << this->heigthSVideo;
  94 + alt >> this->heigthStr;
  95 +
  96 + PRINTL(util::_WARNING, "Tamanho do vídeo de libras é inválido! Tamanho padrão selecionado.\n");
  97 + }
  98 +}
  99 +
  100 +void Mixer::setSVPosition() {
  101 + switch(this->positionSVideo){
  102 + case TOP_LEFT:
  103 + this->positionStr = "10:10";
  104 + break;
  105 +
  106 + case TOP_RIGHT:
  107 + this->positionStr = "main_w-overlay_w-10:10";
  108 + break;
  109 +
  110 + case BOTTOM_RIGHT:
  111 + this->positionStr = "main_w-overlay_w-10:main_h-overlay_h-10";
  112 + break;
  113 +
  114 + case BOTTOM_LEFT:
  115 + this->positionStr = "10:main_h-overlay_h-10";
  116 + break;
  117 +
  118 + default: //Se não escolheu nenhum inteiro válido, consideramos BOTTOM_RIGHT como a posição padrão.
  119 + this->positionStr = "main_w-overlay_w-10:main_h-overlay_h-10";
  120 + PRINTL(util::_WARNING, "Posição do vídeo de libras é inválido! Posição padrão selecionada.\n");
  121 + }
  122 +}
  123 +
  124 +void Mixer::initialize() {
  125 + setPathOfFiles(); //Tem que aparecer antes de setSVSize();
  126 + setSVSize();
  127 + setSVPosition();
  128 + mixVideos();
  129 +}
  130 +
  131 +void Mixer::mixVideos() {
  132 + PRINTL(util::_INFO, "Mixando...\n");
  133 +
  134 + string ffmpegSentence = "ffmpeg -i "+this->mainVideo+" -v quiet -y -vf \"movie="+this->secondaryVideo+", "+
  135 + "scale="+ this->widthStr +":"+this->heigthStr+", setpts=PTS-STARTPTS, [movie] overlay"+this->transparency+"="+this->positionStr+
  136 + " [out]\" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 -threads "+NUMTHREADS+" "+this->pathMixedVideo;
  137 +
  138 + system(ffmpegSentence.c_str());
  139 +}
0 140 \ No newline at end of file
... ...
recognize/src/audiofile.cpp 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +#include "audiofile.h"
  2 +
  3 +Audiofile::Audiofile(char *_file_path,float _start_seg,float _end_seg){
  4 +
  5 + file_path = _file_path;
  6 + start_seg = _start_seg;
  7 + end_seg = _end_seg;
  8 +}
  9 +
  10 +Audiofile::~Audiofile(){
  11 +
  12 +
  13 +}
0 14 \ No newline at end of file
... ...
recognize/src/include/audiofile.h 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +#ifndef AUDIOFILE_H
  2 +#define AUDIOFILE_H
  3 +
  4 +class Audiofile
  5 +{
  6 +
  7 +public:
  8 +
  9 + Audiofile(char *_file_path,float _start_seg,float _end_seg);
  10 + ~Audiofile();
  11 +
  12 + char* file_path;
  13 + float start_seg;
  14 + float end_seg;
  15 +
  16 +
  17 +
  18 +
  19 +};
  20 +
  21 +#endif // AUDIOFILE_H
0 22 \ No newline at end of file
... ...
recognize/src/include/recognize.h
  1 +#ifndef RECOGNIZE_H
  2 +#define RECOGNIZE_H
  3 +
  4 +
1 5 #include "jthread.h"
2 6 #include <iostream>
3 7 #include <stdlib.h>
... ... @@ -12,18 +16,22 @@
12 16 #include <iterator>
13 17 #include <sys/stat.h>
14 18 #include <lavidlib/io/FileIO.h>
15   -#include "dprintf.h"
16   -#include "logger.h"
  19 +#include "logging.h"
17 20 #include "recognizeListener.h"
18 21 #include "recognizeException.h"
19 22  
  23 +#include "wavcut.h"
  24 +#include "recognizer.h"
  25 +
20 26 #define FREQUENCY_PATTERN 22050
21 27 #define INPUT_PATTERN 1 /* 1 = Raw file, 2 = Mic */
22 28 #define BLOCS_PATTERN 10
23 29 #define SIZE_BUFFER 256
24 30 #define CONFIDENCE_RATE 0.10
25 31  
  32 +#define RECOGNIZER_MODE 1 // 0 = Julius, 1 = Google
26 33 #define PATH_JCONFIG "vlibras_user/vlibras-core/recognize/src/julius.jconf"
  34 +#define PATH_WCONFIG "vlibras_user/vlibras-core/recognize/src/wavcut.jconf"
27 35 #define PATH_AUDIO_ORIGIN "/audio/origin/audio_origin.wav"
28 36 #define PATH_AUDIO_PARTS "/audio/parts/"
29 37 #define FILENAME_RECOGNIZED_OUT "/audio/recognized.out"
... ... @@ -42,6 +50,7 @@
42 50  
43 51 using namespace jthread;
44 52 using namespace std;
  53 +using namespace util;
45 54  
46 55 class Recognize: public Thread {
47 56  
... ... @@ -110,4 +119,9 @@ private:
110 119 int64_t calcula_pts(double msec);
111 120 int64_t convert_pts(string pts);
112 121  
  122 + void executeGoogleEngine();
  123 + Jconf* load_config();
  124 +
113 125 };
  126 +
  127 +#endif // RECOGNIZE_H
114 128 \ No newline at end of file
... ...
recognize/src/include/recognizer.h 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +#ifndef RECOGNIZER_H
  2 +#define RECOGNIZER_H
  3 +
  4 +#include <julius/juliuslib.h>
  5 +#include <iostream>
  6 +#include <sstream>
  7 +#include <sys/stat.h>
  8 +#include <fstream>
  9 +#include <iostream>
  10 +#include <string.h>
  11 +#include <stdio.h>
  12 +#include <stdlib.h>
  13 +#include <string>
  14 +#include <list>
  15 +#include <stdint.h>
  16 +
  17 +using namespace std;
  18 +
  19 +class Recognizer
  20 +{
  21 +
  22 +public:
  23 + Recognizer();
  24 + ~Recognizer();
  25 + int recognize(string file_in);
  26 + string getsentence();
  27 + float getconfidence();
  28 +
  29 +
  30 +private:
  31 +
  32 + Jconf *jconf;
  33 + Recog *recog;
  34 +
  35 +};
  36 +
  37 +#endif // RECOGNIZER_H
... ...
recognize/src/include/wavcut.h 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +#ifndef WAVCUT_H
  2 +#define WAVCUT_H
  3 +
  4 +#include <julius/juliuslib.h>
  5 +#include <string>
  6 +#include <algorithm>
  7 +#undef min
  8 +#undef max
  9 +#include <vector>
  10 +#include "audiofile.h"
  11 +
  12 +
  13 +
  14 +using namespace std;
  15 +class Wavcut{
  16 +
  17 +public:
  18 +
  19 + Wavcut(char* _pathAudio, char* _outputPath, char* _id);
  20 + ~Wavcut();
  21 +
  22 + int initialize(Jconf *jconf);
  23 + vector<Audiofile> list_audio_files();
  24 + int count_lines;
  25 +
  26 +private:
  27 + static int adin_callback_file(SP16 *now, int len, Recog *recog);
  28 +};
  29 +
  30 +#endif // WAVCUT_H
0 31 \ No newline at end of file
... ...
recognize/src/recognize.cpp
... ... @@ -11,7 +11,7 @@ Recognize::Recognize(char* _pathVideo, char* _id) {
11 11 ss << _id;
12 12 ss >> id;
13 13 confidenceRate=CONFIDENCE_RATE;
14   - DPRINTF("Done!\n");
  14 + PRINTL(util::_DEBUG, "Recognize Done!\n");
15 15 }
16 16  
17 17 Recognize::Recognize(char* _pathVideo, char* _id, char* rate) {
... ... @@ -27,7 +27,7 @@ Recognize::Recognize(char* _pathVideo, char* _id, char* rate) {
27 27 istringstream(rate) >> confidenceRate;
28 28 if (confidenceRate == 0)
29 29 confidenceRate=CONFIDENCE_RATE;
30   - DPRINTF("Done!\n");
  30 + PRINTL(util::_DEBUG, "Recognize Done!\n");
31 31 }
32 32  
33 33 Recognize::Recognize(char* _pathVideo, int _inputType, char* _id) {
... ... @@ -38,26 +38,26 @@ Recognize::Recognize(char* _pathVideo, int _inputType, char* _id) {
38 38 frequency = FREQUENCY_PATTERN;
39 39 sizeBlocs = BLOCS_PATTERN;
40 40 id = _id;
41   - DPRINTF("Done!\n");
  41 + PRINTL(util::_DEBUG, "Recognize Done!\n");
42 42 }
43 43  
44 44 Recognize::~Recognize() {
45 45 listeners->clear();
46 46 delete listeners;
47   - DDDPRINTF("Recognize finalized!\n");
  47 + PRINTL(util::_DEBUG, "Recognize finalized!\n");
48 48 }
49 49  
50 50  
51 51 void Recognize::initialize() {
52 52  
53   - DPRINTF("Recognizing...\n");
  53 + PRINTL(util::_INFO, "Reconhecendo áudio...\n");
54 54 /**printf("*** Initialized Recognition ***\n\nVideo: %s\nType [1-File; 2-Mic]: %d\nFrequency: %d\n\n",
55 55 this->pathVideo, this->inputType, this->frequency);**/
56 56  
57 57 ifstream file(pathVideo, ifstream::binary);
58 58 if(!file.is_open()){
59 59 finish = true;
60   - Util::Logger::Instance()->writeLog((char*) "[ERRO: recognize.cpp] Arquivo não encontrado.");
  60 + Logging::instance()->writeLog("recognize.cpp <Error> Arquivo não encontrado.");
61 61 throw RecognizeException("Falha ao abrir o arquivo! Verifique se o mesmo existe.");
62 62 }
63 63 this->Start();
... ... @@ -68,14 +68,17 @@ void Recognize::Run(){
68 68 finish = false;
69 69 createDir();
70 70 extractAudioFromVideo();
71   - breakVideoParts(getTimeMediaSec());
72   - executeJuliusEngine();
73   - generateConfidence();
74   - //filterOutputJulius();
75   - //cleanFiles();
76   -
  71 + if (RECOGNIZER_MODE == 0){
  72 + breakVideoParts(getTimeMediaSec());
  73 + executeJuliusEngine();
  74 + generateConfidence();
  75 + } else {
  76 + executeGoogleEngine();
  77 + }
  78 +
77 79 finish = true;
78   - //notifyEndExtraction(count_lines);
  80 + notifyEndExtraction(count_lines);
  81 + cleanFiles();
79 82 }
80 83  
81 84 void Recognize::setFrequency(int freq) {
... ... @@ -107,7 +110,7 @@ char* Recognize::extractAudioFromVideo() {
107 110 //command.append(strFreq).append(" -ac 1 -f wav ").append(PATH_AUDIO_ORIGIN).append(" &");
108 111 command.append(strFreq).
109 112 append(" -ac 1 -f wav ").
110   - append(path_contents).append(id).
  113 + append(path_contents).append("/").append(id).
111 114 append(PATH_AUDIO_ORIGIN).append(" -v quiet");
112 115  
113 116 /*string tmp = "echo ";
... ... @@ -121,7 +124,7 @@ int Recognize::getTimeMediaSec() {
121 124  
122 125 string command = PROGRAM;
123 126  
124   - command.append(" -i ").append(path_contents).append(id).append(PATH_AUDIO_ORIGIN)
  127 + command.append(" -i ").append(path_contents).append("/").append(id).append(PATH_AUDIO_ORIGIN)
125 128 .append(" 2>&1 | grep Duration >> outfile");
126 129 system(command.c_str());
127 130  
... ... @@ -183,8 +186,8 @@ void Recognize::breakVideoParts(int timeTotal) {
183 186 pts.push_back(convert_pts(ss_str));
184 187  
185 188 command = "sox ";
186   - command.append(path_contents).append(id).append(PATH_AUDIO_ORIGIN).append(" ")
187   - .append(path_contents).append(id).append(PATH_AUDIO_PARTS);
  189 + command.append(path_contents).append("/").append(id).append(PATH_AUDIO_ORIGIN).append(" ")
  190 + .append(path_contents).append("/").append(id).append(PATH_AUDIO_PARTS);
188 191  
189 192 sprintf(tmp, "%i", count++);
190 193 filename.append(tmp).append(".wav");
... ... @@ -194,8 +197,8 @@ void Recognize::breakVideoParts(int timeTotal) {
194 197  
195 198 string apcomm = "echo ";
196 199  
197   - apcomm.append(path_contents).append(id).append(PATH_AUDIO_PARTS).append(filename).append(" >> ")
198   - .append(path_contents).append(id).append(FILENAME_AUDIOLIST);
  200 + apcomm.append(path_contents).append("/").append(id).append(PATH_AUDIO_PARTS).append(filename).append(" >> ")
  201 + .append(path_contents).append("/").append(id).append(FILENAME_AUDIOLIST);
199 202  
200 203 system(apcomm.c_str());
201 204  
... ... @@ -209,7 +212,7 @@ void Recognize::breakVideoParts(int timeTotal) {
209 212 void Recognize::executeJuliusEngine() {
210 213  
211 214 string type, freqStr;
212   - string command = "julius -C ";
  215 + string command = "julius -quiet -C ";
213 216 char cfreq[10];
214 217  
215 218 char* jPath;
... ... @@ -227,12 +230,12 @@ void Recognize::executeJuliusEngine() {
227 230 else
228 231 type = "mic";
229 232  
230   - command.append(type).append(" -filelist ").append(path_contents).append(id).append(FILENAME_AUDIOLIST);
  233 + command.append(type).append(" -filelist ").append(path_contents).append("/").append(id).append(FILENAME_AUDIOLIST);
231 234 sprintf(cfreq, "%i", frequency);
232 235 command.append(" -smpFreq ").
233 236 append(cfreq).
234 237 append(" >> ");
235   - command.append(path_contents).append(id).append(FILENAME_RECOGNIZED_OUT);
  238 + command.append(path_contents).append("/").append(id).append(FILENAME_RECOGNIZED_OUT);
236 239 //Command of execute Julius
237 240 //printf("\n\nCommand for executeJuliusEngine: %s\n", command.c_str());
238 241 system(command.c_str());
... ... @@ -242,13 +245,13 @@ void Recognize::executeJuliusEngine() {
242 245 void Recognize::generateConfidence() {
243 246  
244 247 string command = "cat ";
245   - command.append(path_contents).append(id).append(FILENAME_RECOGNIZED_OUT).append(" | grep ").
246   - append(FIND_CONFIDENCE).append(" >> ").append(path_contents).append(id).append(FILENAME_CONFIDENCEOUT);
  248 + command.append(path_contents).append("/").append(id).append(FILENAME_RECOGNIZED_OUT).append(" | grep ").
  249 + append(FIND_CONFIDENCE).append(" >> ").append(path_contents).append("/").append(id).append(FILENAME_CONFIDENCEOUT);
247 250 system(command.c_str());
248 251 //printf("\n\n---> command: %s\n\n", command.c_str());
249 252  
250 253 string path;
251   - path.append(path_contents).append(id).append(FILENAME_CONFIDENCEOUT);
  254 + path.append(path_contents).append("/").append(id).append(FILENAME_CONFIDENCEOUT);
252 255 ifstream in(path.c_str());
253 256  
254 257 if (!in) {
... ... @@ -293,13 +296,11 @@ void Recognize::generateConfidence() {
293 296  
294 297 }else if(pass==0){
295 298 notifyListeners((char*) "SENTENCA_COM_BAIXA_QUALIDADE", 0);
296   - notifyEndExtraction(count_lines);
297 299 return;
298 300 }
299 301 } while (!in.eof());
300 302 in.close();
301 303 filterOutputJulius();
302   - notifyEndExtraction(count_lines);
303 304 }
304 305 }
305 306  
... ... @@ -317,15 +318,15 @@ void Recognize::filterOutputJulius() {
317 318 sentences = new std::list<char*>();
318 319  
319 320 string command = "cat ";
320   - command.append(path_contents).append(id).append(FILENAME_RECOGNIZED_OUT).append(" | grep -e ").
321   - append(FIND_SENTENCE).append(" -e \"").append(AUDIO_SILENT).append("\"").append(" >> ").append(path_contents).append(id).append(FILENAME_FILTEROUT);
  321 + command.append(path_contents).append("/").append(id).append(FILENAME_RECOGNIZED_OUT).append(" | grep -e ").
  322 + append(FIND_SENTENCE).append(" -e \"").append(AUDIO_SILENT).append("\"").append(" >> ").append(path_contents).append("/").append(id).append(FILENAME_FILTEROUT);
322 323 system(command.c_str());
323 324 //printf("\n\n---> command: %s\n\n", command.c_str());
324 325  
325 326 count_lines = 0;
326 327  
327 328 string path;
328   - path.append(path_contents).append(id).append(FILENAME_FILTEROUT);
  329 + path.append(path_contents).append("/").append(id).append(FILENAME_FILTEROUT);
329 330 ifstream in(path.c_str());
330 331 string strFilter;
331 332  
... ... @@ -369,13 +370,15 @@ void Recognize::notifyListeners(char* text, int64_t pts) {
369 370 //cout << "NOTIFY: " << text << endl;
370 371  
371 372 for(list<RecognizeListener*>::iterator it = listeners->begin(); it != listeners->end(); it++){
372   - (*it)->notifyTextRecognized((unsigned char*) text, calcula_pts(pts));
  373 + //(*it)->notifyTextRecognized((unsigned char*) text, calcula_pts(pts));
  374 + (*it)->notifyTextRecognized((unsigned char*) text, pts);
  375 +
373 376 }
374 377  
375 378 }
376 379  
377 380 void Recognize::notifyEndExtraction(int sentences_size) {
378   - DPRINTF("Recognizer concluiu o reconhecimento: %d sentenças.\n", sentences_size);
  381 + PRINTL(util::_DEBUG, "Recognizer concluiu o reconhecimento: %d sentenças.\n", sentences_size);
379 382 for(list<RecognizeListener*>::iterator it = listeners->begin(); it != listeners->end(); it++){
380 383 (*it)->notifyEnd(sentences_size);
381 384 }
... ... @@ -406,15 +409,119 @@ bool Recognize::isFinished() {
406 409 void Recognize::cleanFiles() {
407 410  
408 411 string command = "rm -r ";
409   - command.append(path_contents).append(id).append("/audio");
  412 + command.append(path_contents).append("/").append(id).append("/audio");
410 413 system(command.c_str());
411 414 }
412 415  
413 416 void Recognize::createDir(){
414 417  
415   - string command = "mkdir ";
416   - command.append(path_contents).append(id).append("/audio")
417   - .append(" && mkdir ").append(path_contents).append(id).append("/audio/parts")
418   - .append(" && mkdir ").append(path_contents).append(id).append("/audio/origin");
  418 + string command = "mkdir -p ";
  419 + command.append(path_contents).append("/").append(id).append("/audio")
  420 + .append(" && mkdir -p ").append(path_contents).append("/").append(id).append("/audio/parts")
  421 + .append(" && mkdir -p ").append(path_contents).append("/").append(id).append("/audio/origin");
419 422 system(command.c_str());
420 423 }
  424 +
  425 +void Recognize::executeGoogleEngine() {
  426 + jlog_set_output(NULL);
  427 +
  428 + Wavcut* wavcut;
  429 + Recognizer* recog;
  430 +
  431 + vector<Audiofile> audioList;
  432 + string file_in = "";
  433 + file_in.append(path_contents).append("/").append(id).append(PATH_AUDIO_ORIGIN);
  434 + string path_out= "";
  435 + path_out.append(path_contents).append("/").append(id).append("/");
  436 + char* pathAudio = new char[file_in.size()+1];
  437 + char* outputPath = new char[path_out.size()+1];
  438 + char* _id = new char[id.size()+1];
  439 + strcpy(pathAudio, file_in.c_str());
  440 + strcpy(outputPath, path_out.c_str());
  441 + strcpy(_id, id.c_str());
  442 +
  443 +
  444 + wavcut = new Wavcut(pathAudio,outputPath,_id);
  445 + Jconf *jconf;
  446 +
  447 + char* wPath;
  448 + wPath = getenv("WCONFIG");
  449 +
  450 + if(wPath != NULL)
  451 + jconf = j_config_load_file_new(wPath);
  452 + else
  453 + jconf = j_config_load_file_new(PATH_WCONFIG);
  454 +
  455 + if(wavcut->initialize(jconf)<2){
  456 +
  457 + wavcut->initialize(load_config());
  458 + }
  459 +
  460 + audioList = wavcut->list_audio_files();
  461 +
  462 +
  463 + delete wavcut;
  464 + recog = new Recognizer();
  465 +
  466 + int ii;
  467 + count_lines = 0;
  468 + for(ii=0; ii < audioList.size(); ii++)
  469 + {
  470 +
  471 + /*chama o reconhecedor passando cada arquivo de audio*/
  472 + recog->recognize(audioList[ii].file_path);
  473 +
  474 + /*remove o audio ja reconhecido*/
  475 + remove(audioList[ii].file_path);
  476 +
  477 + /*segundos do inicio do audio reconhecido*/
  478 + //cout<< calcula_pts(audioList[ii].start_seg) << endl;
  479 +
  480 + /* texto do audio reconhecido*/
  481 + //cout<< recog->getsentence() << endl;
  482 +
  483 + /* porcentagem de confiança do reconhecimento (de 0 a 1) */
  484 + //cout<< recog->getconfidence() << endl;
  485 +
  486 + if(recog->getconfidence() >= confidenceRate)
  487 + notifyListeners((char*)recog->getsentence().c_str(), (int64_t)(audioList[ii].start_seg*1000));
  488 + else
  489 + notifyListeners((char*) "SENTENCA_COM_BAIXA_QUALIDADE", (int64_t)(audioList[ii].start_seg*1000));
  490 + if(recog->getconfidence()> 0)
  491 + count_lines++;
  492 + }
  493 + delete recog;
  494 +
  495 +}
  496 +
  497 +Jconf* Recognize::load_config(){
  498 +
  499 + Jconf* jconf;
  500 + jconf = j_jconf_new();
  501 +
  502 + char *parametros[12];
  503 +
  504 + parametros[1]="-lv";
  505 + parametros[2]="3000";
  506 + parametros[3]="-zc";
  507 + parametros[4]="150";
  508 + parametros[5]="-headmargin";
  509 + parametros[6]="200";
  510 + parametros[7]="-tailmargin";
  511 + parametros[8]="150";
  512 + parametros[9]="-rejectshort";
  513 + parametros[10]="1500";
  514 + //cout << "load_config" << endl;
  515 + /* read arguments and set parameters */
  516 + if (j_config_load_args(jconf, 11, parametros) == -1) {
  517 + fprintf(stderr, "Error reading arguments\n");
  518 +
  519 + }
  520 +
  521 + jconf->input.type = INPUT_WAVEFORM;
  522 + jconf->input.speech_input = SP_RAWFILE;
  523 + jconf->detect.silence_cut = 1;
  524 +
  525 +
  526 +return jconf;
  527 +}
... ...
recognize/src/recognizer.cpp 0 → 100644
... ... @@ -0,0 +1,101 @@
  1 +
  2 +
  3 +
  4 +#include "recognizer.h"
  5 +#include <json/json.h>
  6 +
  7 +
  8 +static boolean reconhecendo ;
  9 +static string sentence;
  10 +static float confidence;
  11 +string lenguage = "pt-BR";
  12 +
  13 +using namespace std;
  14 +
  15 +
  16 +void resultado(Recog *recog, void *dummy);
  17 +
  18 +
  19 +
  20 +Recognizer::Recognizer(){
  21 +
  22 +}
  23 +
  24 +
  25 +Recognizer::~Recognizer(){
  26 +
  27 +}
  28 +
  29 +
  30 +
  31 +int Recognizer::recognize(string file_in)
  32 +{
  33 + FILE *file;
  34 + string cmFinal;
  35 + char message[100];
  36 + message[0] = '\0';
  37 + string jsonResult ="";
  38 + string vozReconhecida = "";
  39 + int indexLineSrt =0;
  40 + stringstream comand;
  41 + stringstream index;
  42 +
  43 +
  44 + string fileName = file_in;
  45 +
  46 + // inicio preparação requisição
  47 +
  48 + comand << " curl -ss -X POST --data-binary @";
  49 + comand << fileName;
  50 +
  51 + //requisição para o google speech
  52 + comand<< " --user-agent 'Mozilla/5.0' --header 'Content-Type: audio/l16; rate=22050;' 'https://www.google.com/speech-api/v2/recognize?client=chromium&lang="<<lenguage<<"&maxresults=1&key=AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw'";
  53 + //AIzaSyBeeYW4l2OuCwiUfzBaUXXeWAO6Uy-u0F8'";
  54 + //public key Ezequiel project 1
  55 + //AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw'";
  56 + //fim
  57 + cmFinal = comand.str();
  58 + file = popen(cmFinal.c_str(),"r");
  59 + if(file == NULL)
  60 + printf("ERROR\n");
  61 + int vez =0;
  62 + while (fgets(message, sizeof (message), file))
  63 + {
  64 + vez++;
  65 +
  66 + if(vez>1){
  67 + jsonResult+= message;
  68 +
  69 + }
  70 + }
  71 + //cout<< jsonResult <<endl<<endl;
  72 + Json::Value root;
  73 + Json::Reader reader;
  74 + bool parsingSuccessful = reader.parse(jsonResult, root);
  75 + // cout << root["result"]<<endl;
  76 + confidence = 0.0;
  77 + sentence = "";
  78 + if (parsingSuccessful)
  79 + {
  80 + sentence = root["result"][0]["alternative"][0]["transcript"].asString();
  81 + confidence = root["result"][0]["alternative"][0]["confidence"].asFloat();
  82 + }
  83 +
  84 +
  85 + fclose(file);
  86 +
  87 + jsonResult = "";
  88 + comand.str("");
  89 +
  90 + return 1;
  91 +}
  92 +
  93 +
  94 +float Recognizer::getconfidence(){
  95 + return confidence;
  96 +}
  97 +string Recognizer::getsentence(){
  98 + // printf("palavra %s\n",sentence.c_str() );
  99 + return sentence;
  100 +}
  101 +
... ...
recognize/src/wavcut.cpp 0 → 100644
... ... @@ -0,0 +1,187 @@
  1 +#include "wavcut.h"
  2 +
  3 +#include <vector>
  4 +// #include <iostream>
  5 +
  6 +
  7 +int sfreq = 22050; ///< Temporal storage of sample rate
  8 +int speechlen; ///< samples of one recorded segments
  9 +FILE *fp = NULL; ///< File pointer for WAV output
  10 +int sid = 0; ///< current file ID (for SPOUT_FILE)
  11 +char *outpath = NULL; ///< work space for output file name formatting
  12 +boolean writing_file = FALSE; ///< TRUE if writing to a file
  13 +int trigger_sample;
  14 +char *pathAudio;
  15 +char* outputPath;
  16 +char* id_file;
  17 +static vector<Audiofile> audioList;
  18 +
  19 +
  20 +Wavcut::Wavcut(char* _pathAudio, char* _outputPath, char* _id){
  21 +
  22 + pathAudio = _pathAudio;
  23 + outputPath = _outputPath;
  24 + id_file = _id;
  25 + //printf("%s\n","Entrou aquiiiii" )
  26 +}
  27 +
  28 +Wavcut::~Wavcut(){
  29 + //printf("%s\n","Wavcut finalizado" );
  30 +}
  31 +
  32 +
  33 +int Wavcut::adin_callback_file(SP16 *now, int len, Recog *recog)
  34 + {
  35 + /* cria novo arquivo wav para salvar o audio sem silencio*/
  36 + if (speechlen == 0) {
  37 +
  38 + sprintf(outpath, "%s%d.wav",outputPath, sid);
  39 +
  40 + if (access(outpath, F_OK) == 0) {
  41 + if (access(outpath, W_OK) != 0) {
  42 + return(-1);
  43 + }
  44 +
  45 + }
  46 +
  47 + if ((fp = wrwav_open(outpath, sfreq)) != NULL) {
  48 + //fprintf(stderr, "novo arquivo\n");
  49 + }else{
  50 + return -1;
  51 + }
  52 + writing_file = TRUE;
  53 + }
  54 +
  55 + /* write recorded sample to file */
  56 + if (wrwav_data(fp, &(now[0]), len) == FALSE) {
  57 + return -1;
  58 + }
  59 +
  60 + /* accumulate sample num of this segment */
  61 +speechlen += len;
  62 +
  63 +return(0);
  64 +}
  65 +
  66 +//acumula o tempo de cada segmento
  67 +void registra_tempo(Recog *recog, void *data)
  68 +{
  69 + trigger_sample = recog->adin->last_trigger_sample;
  70 +}
  71 +
  72 +boolean close_files()
  73 +{
  74 + if (writing_file) {
  75 +
  76 + if (wrwav_close(fp) == FALSE) {
  77 + fprintf(stderr, "adinrec: failed to close file\n");
  78 + return FALSE;
  79 + }
  80 + char* fileout=(char *)mymalloc(100);;
  81 + // sprintf(fileout,*outpath);
  82 + sprintf(fileout, outpath);
  83 + audioList.push_back(Audiofile(fileout,(float)trigger_sample / (float)sfreq,
  84 + (float)(trigger_sample + speechlen) / (float)sfreq));
  85 +
  86 + writing_file = FALSE;
  87 +}
  88 +
  89 +return TRUE;
  90 +}
  91 +
  92 +
  93 + int Wavcut::initialize(Jconf *jconf) {
  94 +
  95 + sid = 0;
  96 + audioList.clear();
  97 + //Jconf *jconf;
  98 + Recog *recog;
  99 +
  100 + int ret;
  101 + boolean is_continues;
  102 +
  103 + /* cria instancia do reconhecedor */
  104 + recog = j_recog_new();
  105 + /* carrega as configurações contidas no jconfig */
  106 + // jconf = j_config_load_file_new("/home/ezequiel/speech-recognizer/wavcut.jconf");
  107 +
  108 + jconf->input.sfreq = sfreq;
  109 + /*adciona a configuração ao reconhecedor*/
  110 + recog->jconf = jconf;
  111 +
  112 + outpath = (char *)mymalloc(256);
  113 +
  114 +/*registra calback do contador de tempo*/
  115 + callback_add(recog, CALLBACK_EVENT_SPEECH_START, registra_tempo, NULL);
  116 +
  117 + /*Inicializa o reconhecedor*/
  118 + if (j_adin_init(recog) == FALSE) {
  119 + fprintf(stderr, "Error in initializing adin device\n");
  120 + return 0;
  121 + }
  122 +
  123 + /*Abre o quivo de áudio para ser cortado*/
  124 + if(j_open_stream(recog,pathAudio) == -2)
  125 + return sid;
  126 +
  127 + /* loop de detecção de voz*/
  128 +
  129 + do {
  130 +
  131 + speechlen = 0;
  132 +
  133 + ret = adin_go(adin_callback_file, NULL, recog);
  134 +
  135 +
  136 + switch(ret) {
  137 + case -1: /* device read error or callback error */
  138 + //fprintf(stderr, "[error]\n");
  139 + break;
  140 + case 0: /* reached to end of input */
  141 + //fprintf(stderr, "[eof]\n");
  142 + return sid;
  143 + break;
  144 + default:
  145 + break;
  146 + }
  147 +
  148 + if (ret == -1) {
  149 + /* error in input device or callback function, so terminate program here */
  150 + return sid;
  151 + }
  152 + /* um intervalo de silencio detectado */
  153 +
  154 + if (close_files() == FALSE)
  155 + return sid;
  156 +
  157 + /* incremento do contador de partes cortadas */
  158 +
  159 +
  160 + sid++;
  161 +
  162 + is_continues = FALSE;
  163 + if (ret > 0 || ret == -2) {
  164 + is_continues = TRUE;
  165 + }
  166 +
  167 + } while (is_continues);
  168 +
  169 + /*Quando termina de ler todo áudio finaliza*/
  170 + adin_end(recog->adin);
  171 +
  172 + return sid;
  173 +
  174 +}
  175 +
  176 +vector<Audiofile> Wavcut::list_audio_files(){
  177 +
  178 +
  179 + return audioList;
  180 +}
  181 +
  182 +
  183 +
  184 +
  185 +
  186 +
  187 +
... ...
recognize/src/wavcut.jconf 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +-smpFreq 22050
  2 +-lv 1000
  3 +-zc 60
  4 +-headmargin 200
  5 +-tailmargin 150
  6 +-rejectshort 1500
  7 +-input rawfile
  8 +-cutsilence
  9 +
  10 +
  11 +
  12 +#-smpFreq 22050
  13 +#-lv 3000
  14 +#-zc 150
  15 +#-headmargin 200
  16 +#-tailmargin 150
  17 +#-rejectshort 1500
  18 +#-input rawfile
  19 +#-cutsilence
  20 +
  21 +
  22 +
  23 +
  24 +
... ...
renderer/src/include/listenerRenderer.h 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * \file listenerRenderer.h
  3 + */
  4 +
  5 +#ifndef LISTENER_RENDERER_H
  6 +#define LISTENER_RENDERER_H
  7 +
  8 +#include <string>
  9 +#include <stdint.h>
  10 +
  11 +using namespace std;
  12 +
  13 +class ListenerRenderer {
  14 +public:
  15 + virtual void notifyEndOfRenderization() = 0;
  16 +};
  17 +
  18 +#endif /* LISTENER_RENDERER_H */
0 19 \ No newline at end of file
... ...
renderer/src/include/renderer.h 0 → 100644
... ... @@ -0,0 +1,114 @@
  1 +/**
  2 + * \file renderer.h
  3 + *
  4 + * \author Wesnydy Lima Ribeiro <wesnydy@lavid.ufpb.br>
  5 + * \date 2015
  6 + */
  7 +
  8 +#ifndef RENDERER_H
  9 +#define RENDERER_H
  10 +
  11 +#include <list>
  12 +#include <queue>
  13 +#include <sstream>
  14 +#include <stdint.h>
  15 +#include <unistd.h>
  16 +#include "string.h"
  17 +#include "jthread.h"
  18 +#include "logging.h"
  19 +#include "listenerRenderer.h"
  20 +#include <lavidlib/net/InetAddress.h>
  21 +#include <lavidlib/net/StreamSocket.h>
  22 +#include <lavidlib/net/SocketException.h>
  23 +#include <lavidlib/base/RuntimeException.h>
  24 +#include <lavidlib/net/UnknownHostException.h>
  25 +
  26 +#define HOST "0.0.0.0"
  27 +#define PORT 5555
  28 +
  29 +#define OK_FLAG "OK"
  30 +#define END_FLAG "FINALIZE"
  31 +#define BADSENTENCE "SENTENCACOMBAIXAQUALIDADE"
  32 +#define BADTEXT "ESCOLHER TEXTO CERTO"
  33 +
  34 +#define PATH_RENDERER "vlibras_user/unityVideo/"
  35 +#define PATH_SCREENS "vlibras_user/.config/unity3d/LAViD/VLibrasVideoMaker/"
  36 +
  37 +using namespace jthread;
  38 +using namespace lavidlib;
  39 +using namespace std;
  40 +using namespace util;
  41 +
  42 +/** \brief Classe que implementa o Renderizador.
  43 + *
  44 + * \headerfile renderer/src/include/renderer.h
  45 + */
  46 +class Renderer : public Thread {
  47 +
  48 +public:
  49 + /** Construtor.
  50 + *
  51 + * \param path_contents Abstração do path do vídeo de saída.
  52 + * \param id Identificação do usuário.
  53 + */
  54 + Renderer(char* path_Contents, char* id);
  55 +
  56 + /** Destrutor. */
  57 + ~Renderer();
  58 +
  59 + /** Inicia os processos do renderizador.
  60 + *
  61 + * Inicia o servidor do Unity Player,
  62 + * faz a conexão do Core com o Player
  63 + * e da inicio ao envio das glosas para
  64 + * a geração do vídeo de LIBRAS.
  65 + */
  66 + void initialize();
  67 +
  68 + /** Adiciona ouvintes do renderer.
  69 + *
  70 + * \param listener O ouvinte a ser registrado.
  71 + */
  72 + void addListener(ListenerRenderer* listener);
  73 +
  74 + /** Recebe a glosa q será enviada para o player.
  75 + *
  76 + * \param glosa A glosa que será enviada.
  77 + * \param pts A etiqueta de tempo da glosa.
  78 + */
  79 + void receiveGlosa(string glosa, int64_t pts);
  80 +
  81 +private:
  82 + char* userID;
  83 + char* pathOutVideo;
  84 +
  85 + StreamSocket* cSocket;
  86 + queue <string> glosaQueue;
  87 + list<ListenerRenderer*>* listeners;
  88 +
  89 + /** Executa o script que inicia o servidor do Player. */
  90 + void executeServerScript();
  91 +
  92 + /** Faz a conexão do Core com o Player. */
  93 + void connectToUnityPlayer();
  94 +
  95 + /** Envia as glosas para o Player. */
  96 + void exportGlosa();
  97 +
  98 + /** Renderiza o vídeo de LIBRAS. */
  99 + void renderVideo();
  100 +
  101 + /** Aguarda o Player capturar as screenshots. */
  102 + void waitScreenShots();
  103 +
  104 + /** Notifica o fim da renderização. */
  105 + void notifyListeners();
  106 +
  107 + /** Deleta os arquivos temporários */
  108 + void cleanFiles();
  109 +
  110 + /** Chamado quando a Thread é iniciada. */
  111 + void Run();
  112 +};
  113 +
  114 +#endif /* RENDERER_H */
0 115 \ No newline at end of file
... ...
renderer/src/renderer.cpp 0 → 100644
... ... @@ -0,0 +1,190 @@
  1 +#include "renderer.h"
  2 +
  3 +Renderer::Renderer(char* path_Contents, char* id) {
  4 + this->pathOutVideo = path_Contents;
  5 + this->userID = id;
  6 + cSocket = new StreamSocket();
  7 + listeners = new list<ListenerRenderer*>();
  8 + PRINTL(util::_DEBUG, "Renderer Done!\n");
  9 +}
  10 +
  11 +Renderer::~Renderer() {
  12 + listeners->clear();
  13 + delete listeners;
  14 + if(cSocket) delete cSocket;
  15 + PRINTL(util::_DEBUG, "Renderer finalized!\n");
  16 +}
  17 +
  18 +void Renderer::addListener(ListenerRenderer* listener) {
  19 + listeners->push_back(listener);
  20 +}
  21 +
  22 +void Renderer::notifyListeners() {
  23 + PRINTL(util::_DEBUG, "Renderização finalizada!\n");
  24 + for (list<ListenerRenderer*>::iterator i = listeners->begin(); i != listeners->end(); i++) {
  25 + (*i)->notifyEndOfRenderization();
  26 + }
  27 +}
  28 +
  29 +void Renderer::executeServerScript() {
  30 + PRINTL(util::_DEBUG, "Executando o Script de inicialização do servidor\n");
  31 +
  32 + //Temporário. 'Matar' todos os processos do player.
  33 + string killcmd = "killall -9 videoCreator.x86_64 > /dev/null 2>&1";
  34 + system(killcmd.c_str());
  35 + sleep(2); //tempo para matar o processo
  36 +
  37 + string command = "cd ";
  38 +
  39 + char* renderPath;
  40 + renderPath = getenv("RENDERER");
  41 + if(renderPath != NULL)
  42 + command.append(renderPath);
  43 + else
  44 + command.append(PATH_RENDERER);
  45 +
  46 + command.append(" && ").append("python render.py ")
  47 + .append(userID).append(" >/dev/null 2>&1 &");
  48 + system(command.c_str());
  49 +}
  50 +
  51 +void Renderer::connectToUnityPlayer() {
  52 + try{
  53 + int i = 0; // Contador de tentativas
  54 + static InetAddress* addr = InetAddress::createByName(HOST);
  55 +
  56 + PRINTL(util::_DEBUG, "Conectando ao UnityPlayer...\n");
  57 + while(!cSocket->isConnected()){
  58 + try{
  59 +
  60 + cSocket->connect(addr, PORT);
  61 +
  62 + }catch(lavidlib::SocketException &ex){
  63 + if(i < 10) { // Numeros de tentativas de conexão (pode ser alterado)
  64 + i++;
  65 + sleep(1);
  66 + }else{
  67 + PRINTL(util::_ERROR, "Número de tentativas de conexão excedido!\n");
  68 + throw lavidlib::RuntimeException(ex.getMessage().c_str());
  69 + }
  70 + }
  71 + }
  72 + }catch(lavidlib::UnknownHostException &ex){
  73 + throw lavidlib::RuntimeException(ex.getMessage().c_str());
  74 + }
  75 +}
  76 +
  77 +//Armazena as glosas em uma fila até q o método initialize() seja chamado p/ fazer os envios
  78 +void Renderer::receiveGlosa(string glosa, int64_t pts) {
  79 + ostringstream oss;
  80 + string formatedGlosa; //Formato da glosa que será enviada para o player: "glosa#pts"
  81 +
  82 + if(glosa == BADSENTENCE || glosa == BADTEXT)
  83 + formatedGlosa = ""; //O player entende "#pts" como pose neutra
  84 + else
  85 + formatedGlosa = glosa;
  86 +
  87 + oss << pts;
  88 + formatedGlosa += "#";
  89 + formatedGlosa += oss.str();
  90 + glosaQueue.push(formatedGlosa);
  91 +}
  92 +
  93 +void Renderer::exportGlosa() {
  94 + if(glosaQueue.empty())
  95 + throw lavidlib::RuntimeException("Fila de glosas vazia!");
  96 +
  97 + int glosaSize;
  98 + char* glosaBff;
  99 +
  100 + string glosaCpy = glosaQueue.front(); //Pega quem estiver na frente da fila
  101 + glosaSize = strlen(glosaCpy.c_str())+1;
  102 + glosaBff = new char[glosaSize];
  103 + strcpy(glosaBff, glosaCpy.c_str());
  104 +
  105 + try {
  106 + cSocket->write(glosaBff, glosaSize); //Envia a glosa formatada p/ o player
  107 + }catch(lavidlib::IOException &ex){
  108 + throw lavidlib::RuntimeException(ex.getMessage().c_str());
  109 + }
  110 +
  111 + char* received = new char[3]; //Mensagem de confirmação de recebimento da glosa: "OK\0"
  112 + do {
  113 + try {
  114 + cSocket->read(received, 3); //Aguarda a confirmação
  115 + }catch(lavidlib::IOException &ex){
  116 + throw lavidlib::RuntimeException(ex.getMessage().c_str());
  117 + }
  118 + }while(strcmp(received, OK_FLAG) != 0); //Verifica se é a confirmação correta
  119 +
  120 + glosaQueue.pop(); //Se o envio foi bem sucedido, remove a glosa da fila
  121 +
  122 + delete [] glosaBff;
  123 + delete [] received;
  124 +}
  125 +
  126 +void Renderer::waitScreenShots() {
  127 + int endSize;
  128 + char* finalize;
  129 +
  130 + endSize = strlen(END_FLAG)+1;
  131 + finalize = new char[endSize];
  132 +
  133 + PRINTL(util::_DEBUG, "Aguardando a captura das ScreenShots.\n");
  134 + do {
  135 + try {
  136 + cSocket->read(finalize, endSize); //Aguarda o player notificar o fim da captura das ScreenShots
  137 + }catch(lavidlib::IOException &ex){
  138 + throw lavidlib::RuntimeException(ex.getMessage().c_str());
  139 + }
  140 + }while(strcmp(finalize, END_FLAG) != 0); //Verifica se é a mensagem correta ("FINALIZE\0")
  141 +
  142 + cSocket->close();
  143 +}
  144 +
  145 +void Renderer::renderVideo() {
  146 + PRINTL(util::_DEBUG, "Renderizando...\n");
  147 + string command = "ffmpeg -y -loglevel quiet -framerate 30 -i ";
  148 + command.append(PATH_SCREENS).append(userID).append("/frame_%d.png ")
  149 + .append("-vcodec libx264 -pix_fmt yuv420p ").append(pathOutVideo);
  150 + system(command.c_str());
  151 +}
  152 +
  153 +void Renderer::initialize() {
  154 + executeServerScript();
  155 + try{
  156 + connectToUnityPlayer();
  157 + }catch(lavidlib::RuntimeException &ex){
  158 + throw lavidlib::RuntimeException(ex.getMessage().c_str());
  159 + }
  160 + this->Start();
  161 +}
  162 +
  163 +void Renderer::Run() {
  164 + PRINTL(util::_DEBUG, "Enviando glosas para o player...\n");
  165 + while(!glosaQueue.empty()){ //Inicia o envio das glosas que estão na fila
  166 + try{
  167 + exportGlosa();
  168 + }catch(lavidlib::RuntimeException &ex){
  169 + throw lavidlib::RuntimeException(ex.getMessage().c_str());
  170 + }
  171 + }
  172 +
  173 + PRINTL(util::_INFO, "Gerando vídeo...\n");
  174 + receiveGlosa(END_FLAG, -1); //Quando a fila estiver vazia, a flag "FINALIZE" será enviada
  175 + try{
  176 + exportGlosa();
  177 + waitScreenShots();
  178 + }catch(lavidlib::RuntimeException &ex){
  179 + throw lavidlib::RuntimeException(ex.getMessage().c_str());
  180 + }
  181 + renderVideo();
  182 + notifyListeners();
  183 + cleanFiles();
  184 +}
  185 +
  186 +void Renderer::cleanFiles() {
  187 + string clean = "rm -rf ";
  188 + clean.append(PATH_SCREENS).append(userID).append("/");
  189 + system(clean.c_str());
  190 +}
... ...
servico/src/include/serviceException.h
1   -/***************************************************************************
2   - * Universidade Federal da Paraíba *
3   - * Copyright (C) 2014 by Laboratório de Aplicações de Vídeo Digital *
4   - * *
5   - * Centro de Informática - UFPB - Campus I *
6   - * João Pessoa - PB - Brasil *
7   - * *
8   - * Author: Erickson Silva (erickson.silva@lavid.ufpb.br) *
9   - * *
10   - **************************************************************************/
  1 +/**
  2 + * \file serviceException.h
  3 + *
  4 + * \author Erickson Silva <erickson.silva@lavid.ufpb.br>
  5 + * \date 2014
  6 + */
11 7  
12 8 #ifndef SERVICEEXCEPTION_H
13 9 #define SERVICEEXCEPTION_H
... ...
servico/src/include/serviceTester.h 0 → 100644
... ... @@ -0,0 +1,113 @@
  1 +/**
  2 + * \file serviceTester.h
  3 + *
  4 + * \author Wesnydy Lima Ribeiro <wesnydy@lavid.ufpb.br>
  5 + * \date 2015
  6 + */
  7 +
  8 +#ifndef SERVICETESTER_H
  9 +#define SERVICETESTER_H
  10 +
  11 +#include <iostream>
  12 +#include <lavidlib/io/File.h>
  13 +#include <lavidlib/io/FileIO.h>
  14 +#include "serviceException.h"
  15 +#include "serviceWindowGenerationFromRec.h"
  16 +#include "serviceWindowGenerationFromSubtitle.h"
  17 +#include "serviceWindowGenerationFromText.h"
  18 +
  19 +#define MODE_TEST 3
  20 +#define TESTER_ID "Test"
  21 +#define PATH_TEST_CONTENTS "vlibras_user/.vlibras-config/test/videos"
  22 +#define PATH_TEST_UPLOADS "vlibras_user/.vlibras-config/test/uploads"
  23 +
  24 +#define VID_FILE "vlibras_user/.vlibras-config/test/uploads/test_video.mp4"
  25 +#define SRT_FILE "vlibras_user/.vlibras-config/test/uploads/test_srt.srt"
  26 +#define REC_FILE "vlibras_user/.vlibras-config/test/uploads/test_rec.mov"
  27 +#define TXT_FILE "vlibras_user/.vlibras-config/test/uploads/test_text.txt"
  28 +#define OUT_FILE "vlibras_user/.vlibras-config/test/videos/Test.mp4"
  29 +
  30 +using namespace util;
  31 +using namespace std;
  32 +
  33 +/** \brief Classe que implementa o serviço de testes.
  34 + *
  35 + * \headerfile servico/src/include/serviceTester.h
  36 + */
  37 +class ServiceTester: public Thread {
  38 +
  39 +public:
  40 + /** Construtor.
  41 + *
  42 + * \param position Posição do vídeo de LIBRAS em relação ao vídeo original.
  43 + * \param size Tamanho do vídeo de LIBRAS.
  44 + * \param Background Plano de fundo do vídeo de LIBRAS.
  45 + */
  46 + ServiceTester(int position, int size, int background);
  47 +
  48 + /** Destrutor */
  49 + ~ServiceTester();
  50 +
  51 + /** Indica o fim do processo de testes dos módulos.
  52 + *
  53 + * \return O status do do processo.
  54 + */
  55 + bool isFinished();
  56 +
  57 +private:
  58 + int position;
  59 + int resolution;
  60 + int background;
  61 +
  62 + bool fail;
  63 + bool finish;
  64 + string msgErr;
  65 +
  66 + File* fIn;
  67 + File* fOut;
  68 + FileIO* fIO_in;
  69 + FileIO* fIO_out;
  70 +
  71 + ServiceWindowGenerationFromRec* service_rec;
  72 + ServiceWindowGenerationFromSubtitle* service_srt;
  73 + ServiceWindowGenerationFromText* service_text;
  74 +
  75 + /** Checa o serviço de vídeo com legendas */
  76 + void checkServiceSRT();
  77 +
  78 + /** Checa o serviço de reconhecimento de vídeo */
  79 + void checkServiceRec();
  80 +
  81 + /** Checa o serviço de tradução de texto */
  82 + void checkServiceText();
  83 +
  84 + /** Este método é chamado quando a Thread for iniciada. */
  85 + void Run();
  86 +
  87 + /** Indica se houve falha em algum processo.
  88 + *
  89 + * \return retorna True se ocorreu algum erro, caso contrário, retorna false.
  90 + */
  91 + bool hasFailed();
  92 +
  93 + /** Remove os arquivos temporários, gerados pelos processos.*/
  94 + void deleteFiles();
  95 +
  96 + /** Define o path dos arquivos temporários. */
  97 + void setPathContents();
  98 +
  99 + /** Verifica os arquivos de saída gerados.
  100 + *
  101 + * Caso os arquivos de sáida esperarados não existam,
  102 + * um status de falha será retornado.
  103 + * Nos casos em que houver mixagem, o vídeo de entrada
  104 + * e o vídeo de saída serão comparados pelo tamanho.
  105 + *
  106 + * \param fileIn arquivo de entrada.
  107 + * \param fileOut arquivo de saída.
  108 + * \return Status da verificação.
  109 + */
  110 + bool checkFiles(string fileIn, string fileOut);
  111 +};
  112 +
  113 +#endif /* SERVICETESTER_H */
0 114 \ No newline at end of file
... ...
servico/src/include/serviceWindowGeneration.h
  1 +/**
  2 + * \file serviceWindowGeneration.h
  3 + */
  4 +
1 5 #ifndef SERVICEWINDOWGENERATION_H
2 6 #define SERVICEWINDOWGENERATION_H
3 7  
4 8 #include <vector>
  9 +#include <iostream>
5 10 #include <stdint.h>
6 11 #include <string>
  12 +#include <sstream>
7 13 #include <locale>
8 14 #include "jthread.h"
9   -#include "dprintf.h"
10   -#include "Mixer.h"
11   -#include "synchronizer.h"
12   -#include "listenerSynchronizer.h"
  15 +#include "logging.h"
  16 +#include "mixer.h"
  17 +#include "renderer.h"
  18 +#include "listenerRenderer.h"
13 19 #include "listenerTradutor.h"
14 20 #include "tradutorPortGlosa.h"
15 21 #include "serviceException.h"
16   -#include <json/json.h>
  22 +#include <json/json.h>
17 23 #include <lavidlib/base/RuntimeException.h>
18 24  
19   -#define DEVELOPER "devel"
20   -#define PRODUCTION "prod"
21   -#define BASEDIR "vlibras_user/dicionario_libras/"
22   -#define BASEDIRTRANSP "vlibras_user/dicionarioTransp_libras/"
23   -#define VIDEO_POSE_NEUTRA "poseneutra"
24   -#define EXTENSAO_DICIONARIO ".ts"
25   -#define PATH_DEVEL "vlibras_user/vlibras-contents/videos/"
26   -#define PATH_DEVEL_UPLOADS "vlibras_user/vlibras-contents/uploads/"
27   -#define PATH_VBOX_UPLOADS "vlibras_user/.vlibras-conf/uploads/"
28   -#define PATH_CONF_FILE "vlibras_user/.vlibras-conf/param.json"
  25 +#define DEVELOPER 1
  26 +#define PRODUCTION 2
  27 +#define TESTER 3
  28 +#define PATH_DEVEL_CONTENTS "vlibras_user/vlibras-contents/videos"
  29 +#define PATH_DEVEL_UPLOADS "vlibras_user/vlibras-contents/uploads"
  30 +#define PATH_TESTER_CONTENTS "vlibras_user/.vlibras-config/test/videos"
  31 +#define PATH_TESTER_UPLOADS "vlibras_user/.vlibras-config/test/uploads"
  32 +#define PATH_VBOX_UPLOADS "vlibras_user/.vlibras-config/uploads"
  33 +#define PATH_CONF_FILE "vlibras_user/.vlibras-config/params.json"
  34 +#define PATH_TESTER_FILE "/home/user/.vlibras-config/test/tester.json"
29 35 #define MAX_SIZE_PATH 256
30 36  
31   -using namespace Json;
32 37 using namespace Tradutor;
33 38 using namespace jthread;
34 39 using namespace std;
  40 +using namespace lavidlib;
  41 +using namespace util;
35 42  
  43 +/** \brief A classe base para todos os serviços.
  44 + *
  45 + * \headerfile servico/src/include/serviceWindowGeneration.h
  46 + */
36 47 class ServiceWindowGeneration {
37 48  
38 49 protected:
39 50 TradutorPortGlosa* tradutor;
40   - Synchronizer* sincronizador;
  51 + Renderer* renderer;
41 52 Mixer* mixer;
42 53  
43   - Value root;
44   - Reader reader;
  54 + Json::Value root;
  55 + Json::Reader reader;
45 56 vector<int64_t>* vetor_pts;
46 57  
47 58 bool finish;
... ... @@ -49,10 +60,10 @@ protected:
49 60 bool parsingSuccessful;
50 61  
51 62 char* path_input;
  63 + char* path_client;
52 64 char* path_libras;
53 65 char* path_contents;
54 66 char* path_uploads;
55   - char* client_type;
56 67 char* user_id;
57 68  
58 69 int size;
... ... @@ -60,20 +71,36 @@ protected:
60 71 int transparency;
61 72 int sub_language;
62 73 int service_type;
  74 + int exec_mode;
63 75 int numero_legendas;
64 76 int legendas_enviadas;
65 77  
  78 + /** Seta o número de legendas.
  79 + *
  80 + * \param sub_size A quantidade de legendas.
  81 + */
66 82 virtual void setSizeOfSubtitles(int sub_size) = 0;
67   - virtual void setPathContents() = 0;
68   - virtual void setPathLibras() = 0;
69   - virtual void setBackground() = 0;
70 83  
71   - //virtual void transcodeVideoToWebm();
72   - virtual void transcodeVideoToMp4() = 0;
  84 + /** Define o path dos arquivos de saída. */
  85 + virtual void setPathContents() = 0;
73 86  
74 87 public:
  88 + /** Define o path do vídeo de LIBRAS. */
  89 + virtual void setPathLibras() = 0;
  90 +
  91 + /** Inicializa o serviço. */
75 92 virtual void initialize() = 0;
  93 +
  94 + /** Indica o fim do processo do serviço.
  95 + *
  96 + * \return O status do processo.
  97 + */
76 98 virtual bool isFinished() = 0;
  99 +
  100 + /** Envia para a tradução a sentença obtida.
  101 + *
  102 + * \param text A sentença obtida.
  103 + */
77 104 virtual void notifyTranslator(unsigned char* text) = 0;
78 105 };
79 106  
... ...
servico/src/include/serviceWindowGenerationFromRec.h
  1 +/**
  2 + * \file serviceWindowGenerationFromRec.h
  3 + */
  4 +
1 5 #ifndef SERVICEWINDOWGENERATIONFROMREC_H
2 6 #define SERVICEWINDOWGENERATIONFROMREC_H
3 7  
... ... @@ -7,36 +11,119 @@
7 11  
8 12 #define SERVICE_TYPE_REC 2
9 13 #define SERVICE_TYPE_REC_ONLY_AUDIO 5
  14 +#define SERVICE_TYPE_REC_UNMIXED 6
10 15  
11   -class ServiceWindowGenerationFromRec : public ServiceWindowGeneration, public RecognizeListener, public ListenerTradutor, public ListenerSynchronizer, public Thread {
  16 +/** \brief Classe que implementa o serviço de Reconhecimento.
  17 + *
  18 + * \headerfile servico/src/include/serviceWindowGenerationFromRec.h
  19 + */
  20 +class ServiceWindowGenerationFromRec : public ServiceWindowGeneration, public RecognizeListener, public ListenerTradutor, public ListenerRenderer, public Thread {
12 21  
13 22 private:
14 23 Recognize* rec;
15 24  
  25 + /** Adiciona a etiqueta de tempo.
  26 + *
  27 + * Cada sentença conterá sua respectiva de tempo.
  28 + * \param pts A etiqueta de tempo.
  29 + */
16 30 void addPTS(int64_t pts);
  31 +
  32 + /** Seta o número de legendas.
  33 + *
  34 + * \param A quantidade de legendas.
  35 + * \exception ServiceException Se houver algum erro durante a execução.
  36 + */
17 37 void setSizeOfSubtitles(int sub_size);
18   - void setPathContents();
  38 +
  39 + /** Define o path do vídeo de LIBRAS. */
19 40 void setPathLibras();
20   - void setBackground();
21 41  
22   - void transcodeVideoToMp4();
23   - void createThumbnail();
  42 + /** Define o path dos arquivos de saída.
  43 + *
  44 + * \exception RuntimeException Se houver algum erro durante a execução.
  45 + */
  46 + void setPathContents();
  47 +
  48 + /** Indica se o serviço está sendo executado.
  49 + *
  50 + * \return O status do serviço.
  51 + */
24 52 bool isRunning();
25 53 public:
26   - ServiceWindowGenerationFromRec(char* pathVideo, int sublanguage, int position, int size,
27   - int transparency, char* id, int serviceType, char* rate);
28   - ServiceWindowGenerationFromRec(char* pathVideo, int sublanguage, int pos, int size,
29   - int transp, char* id, char* client, int serviceType);
  54 +
  55 + /** Construtor.
  56 + *
  57 + * \param pathVideo Path do vídeo de entrada.
  58 + * \param position Posição do vídeo de LIBRAS em relação ao vídeo original.
  59 + * \param size Tamanho do vídeo de LIBRAS.
  60 + * \param transparency Transparência do plano de fundo do vídeo.
  61 + * \param id Identificação do cliente.
  62 + * \param client Modo de execução.
  63 + * \param serviceType Tipo do serviço.
  64 + * \param rate
  65 + */
  66 + ServiceWindowGenerationFromRec(char* pathVideo, int position, int size,
  67 + int transparency, char* id, char* client, int serviceType, char* rate);
  68 +
  69 + /** Construtor.
  70 + *
  71 + * \param pathVideo Path do vídeo de entrada.
  72 + * \param pos Posição do vídeo de LIBRAS em relação ao vídeo original.
  73 + * \param size Tamanho do vídeo de LIBRAS.
  74 + * \param transp Transparência do plano de fundo do vídeo.
  75 + * \param id Identificação do cliente.
  76 + * \param mode Modo de execução.
  77 + * \param serviceType Tipo do serviço.
  78 + */
  79 + ServiceWindowGenerationFromRec(char* pathVideo, int pos, int size,
  80 + int transp, char* id, int mode, int serviceType);
  81 +
  82 + /** Destrutor */
30 83 ~ServiceWindowGenerationFromRec();
31 84  
  85 + /** Notifica novas sentenças reconhecidas.
  86 + *
  87 + * \param text A sentença reconhecida.
  88 + * \param pts A etiqueta de tempo da sentença.
  89 + */
32 90 void notifyTextRecognized(unsigned char* text, int64_t pts);
33   - void notifyTranslation(vector<string>* glosas);
  91 +
  92 + /** Recebe a notificação do fim da renderização do vídeo */
  93 + void notifyEndOfRenderization();
  94 +
  95 + /** Recebe a notificação do fim da tradução da sentença.
  96 + *
  97 + * \param glosa A sentença traduzida.
  98 + * \exception ServiceException Se houver algum erro durante a execução.
  99 + */
  100 + void notifyTranslation(char* glosa);
  101 +
  102 + /** Envia para a tradução a sentença obtida.
  103 + *
  104 + * \param text A sentença obtida.
  105 + */
34 106 void notifyTranslator(unsigned char* text);
35   - void notifyEndOfSynchronization();
  107 +
  108 + /** Notifica o fim do reconhecimento.
  109 + *
  110 + * \param sentences_size O número de sentenças reconhecidas.
  111 + */
36 112 void notifyEnd(int sentences_size);
37 113  
  114 + /** Inicia o serviço de reconhecimento.
  115 + *
  116 + * \exception ServiceException Se houver algum erro durante a execução.
  117 + */
38 118 void initialize();
  119 +
  120 + /** Indica o fim do processo do serviço.
  121 + *
  122 + * \return O status do processo.
  123 + */
39 124 bool isFinished();
  125 +
  126 + /** Este método é chamado quando a Thread for iniciada. */
40 127 void Run();
41 128 };
42 129  
... ...
servico/src/include/serviceWindowGenerationFromSRT.h
... ... @@ -1,47 +0,0 @@
1   -#ifndef SERVICEWINDOWGENERATIONFROMSRT_H
2   -#define SERVICEWINDOWGENERATIONFROMSRT_H
3   -
4   -#include "listenerSRT.h"
5   -#include "extratorFactory.h"
6   -#include "serviceWindowGeneration.h"
7   -
8   -#define SERVICE_TYPE_SRT 1
9   -#define SERVICE_TYPE_SRT_ONLY 4
10   -
11   -class ServiceWindowGenerationFromSRT : public ServiceWindowGeneration, public ListenerSRT, public ListenerTradutor, public ListenerSynchronizer, public Thread {
12   -
13   -private:
14   - ExtratorFactory* extrator_factory;
15   - ExtratorSRT* extratorSRT;
16   -
17   - char* path_srt;
18   -
19   - void addPTS(int64_t pts);
20   - void setSizeOfSubtitles(int sub_size);
21   - void setPathContents();
22   - void setPathLibras();
23   - void setBackground();
24   -
25   - void transcodeVideoToMp4();
26   - void createThumbnail();
27   - bool isRunning();
28   -public:
29   - //construtor de serviço de video e legenda
30   - ServiceWindowGenerationFromSRT(char* pathVideo, char* pathSRT, int sublanguage, int pos,
31   - int size, int transp, char* id, char* client, int serviceType);
32   - //construtor de serviço de somente legenda
33   - ServiceWindowGenerationFromSRT(char* pathSRT, int transparency, char* id, char* client, int serviceType);
34   - ~ServiceWindowGenerationFromSRT();
35   -
36   - void notifySubtitle(unsigned char* subtitle, int64_t pts);
37   - void notifyTranslation(vector<string>* glosas);
38   - void notifyTranslator(unsigned char* text);
39   - void notifyEndOfSynchronization();
40   - void notifyEnd(int sub_size);
41   -
42   - void initialize();
43   - bool isFinished();
44   - void Run();
45   -};
46   -
47   -#endif /* SERVICEWINDOWGENERATIONFROMSRT_H_ */
48 0 \ No newline at end of file
servico/src/include/serviceWindowGenerationFromSubtitle.h 0 → 100644
... ... @@ -0,0 +1,150 @@
  1 +/**
  2 + * \file ServiceWindowGenerationFromSubtitle.h
  3 + */
  4 +
  5 +#ifndef SERVICEWINDOWGENERATIONFROMSUB_H
  6 +#define SERVICEWINDOWGENERATIONFROMSUB_H
  7 +
  8 +#include "listenerSub.h"
  9 +#include "extratorFactory.h"
  10 +#include "serviceWindowGeneration.h"
  11 +#include <lavidlib/io/File.h>
  12 +#include <lavidlib/io/FileIO.h>
  13 +#include <lavidlib/io/BufferedReader.h>
  14 +#include <lavidlib/io/IOException.h>
  15 +#include <lavidlib/io/EOFException.h>
  16 +
  17 +#define SIGNATURE "WEBVTT"
  18 +#define SERVICE_TYPE_SRT 1
  19 +#define SERVICE_TYPE_SRT_ONLY 4
  20 +
  21 +/** \brief Classe que implementa o serviço de extração de legendas.
  22 + *
  23 + * \headerfile servico/src/include/ServiceWindowGenerationFromSubtitle.h
  24 + */
  25 +class ServiceWindowGenerationFromSubtitle : public ServiceWindowGeneration, public ListenerSub, public ListenerTradutor, public ListenerRenderer, public Thread {
  26 +
  27 +private:
  28 + char* path_srt;
  29 +
  30 + ExtratorFactory* extrator_factory;
  31 + ExtratorSRT* extratorSRT;
  32 + ExtratorVTT* extratorVTT;
  33 +
  34 + File* file;
  35 + FileIO* fileIO;
  36 + BufferedReader* bffReader;
  37 +
  38 + /** Adiciona a etiqueta de tempo.
  39 + *
  40 + * Cada sentença conterá sua respectiva de tempo.
  41 + * \param pts A etiqueta de tempo.
  42 + */
  43 + void addPTS(int64_t pts);
  44 +
  45 + /** Seta o número de legendas.
  46 + *
  47 + * \param A quantidade de legendas.
  48 + * \exception ServiceException Se houver algum erro durante a execução.
  49 + */
  50 + void setSizeOfSubtitles(int sub_size);
  51 +
  52 + /** Define o path do vídeo de LIBRAS. */
  53 + void setPathLibras();
  54 +
  55 + /** Define o path dos arquivos de saída.
  56 + *
  57 + * \exception RuntimeException Se houver algum erro durante a execução.
  58 + */
  59 + void setPathContents();
  60 +
  61 + /** Retorna o extrator espefifico do arquivo de legenda. */
  62 + Extrator::ExtratorType getExtratorType();
  63 +
  64 + /** Indica se o serviço está sendo executado.
  65 + *
  66 + * \return O status do serviço.
  67 + */
  68 + bool isRunning();
  69 +public:
  70 + /** Construtor do serviço de vídeo com legendas.
  71 + *
  72 + * \param pathVideo Path do vídeo de entrada.
  73 + * \param pathSRT Path do arquivo de legendas.
  74 + * \param sublanguage Linguagem das legendas do arquivo.
  75 + * \param pos Posição do vídeo de LIBRAS em relação ao vídeo original.
  76 + * \param size Tamanho do vídeo de LIBRAS.
  77 + * \param transp Transparência do plano de fundo do vídeo.
  78 + * \param id Identificação do cliente.
  79 + * \param mode Modo de execução.
  80 + * \param serviceType Tipo do serviço.
  81 + */
  82 + ServiceWindowGenerationFromSubtitle(char* pathVideo, char* pathSRT, int sublanguage, int pos,
  83 + int size, int transp, char* id, int mode, int serviceType);
  84 +
  85 + /** Construtor do serviço de legendas.
  86 + *
  87 + * \param pathSRT Path do arquivo de legendas.
  88 + * \param sublanguage Linguagem das legendas do arquivo.
  89 + * \param transparency Transparência do plano de fundo do vídeo.
  90 + * \param id Identificação do cliente.
  91 + * \param mode Modo de execução.
  92 + * \param serviceType Tipo do serviço.
  93 + */
  94 + ServiceWindowGenerationFromSubtitle(char* pathSRT, int sublanguage, int transparency, char* id, int mode, int serviceType);
  95 +
  96 + /** Destrutor */
  97 + ~ServiceWindowGenerationFromSubtitle();
  98 +
  99 + /** Notifica novas legendas extraídas.
  100 + *
  101 + * \param subtitle A legenda extraída.
  102 + * \param pts A etiqueta de tempo da legenda.
  103 + */
  104 + void notifySubtitle(unsigned char* subtitle, uint64_t pts);
  105 +
  106 + /** Recebe a notificação do fim da renderização do vídeo */
  107 + void notifyEndOfRenderization();
  108 +
  109 + /** Recebe a notificação do fim da tradução da legenda.
  110 + *
  111 + * \param glosa A legenda traduzida.
  112 + */
  113 + void notifyTranslation(char* glosas);
  114 +
  115 + /** Envia para a tradução a legenda obtida.
  116 + *
  117 + * \param text A legenda obtida.
  118 + */
  119 + void notifyTranslator(unsigned char* text);
  120 +
  121 + /** Envia a glosa para o renderizador.
  122 + *
  123 + * \param glosa A glosa obtida.
  124 + * \exception ServiceException Se houver algum erro durante a execução.
  125 + */
  126 + void notifyRenderer(string glosa);
  127 +
  128 + /** Notifica o fim da extração de legendas.
  129 + *
  130 + * \param sub_size O número de legendas extraídas.
  131 + */
  132 + void notifyEnd(int sub_size);
  133 +
  134 + /** Inicia o serviço de extração de legendas.
  135 + *
  136 + * \exception ServiceException Se houver algum erro durante a execução.
  137 + */
  138 + void initialize();
  139 +
  140 + /** Indica o fim do processo do serviço.
  141 + *
  142 + * \return O status do processo.
  143 + */
  144 + bool isFinished();
  145 +
  146 + /** Este método é chamado quando a Thread for iniciada. */
  147 + void Run();
  148 +};
  149 +
  150 +#endif /* SERVICEWINDOWGENERATIONFROMSUB_H_ */
0 151 \ No newline at end of file
... ...
servico/src/include/serviceWindowGenerationFromText.h
  1 +/**
  2 + * \file serviceWindowGenerationFromTXT.h
  3 + */
  4 +
1 5 #ifndef SERVICEWINDOWGENERATIONFROMTEXT_H
2 6 #define SERVICEWINDOWGENERATIONFROMTEXT_H
3 7  
... ... @@ -7,31 +11,98 @@
7 11  
8 12 #define MAX_TEXT_SIZE 2048 //FIXME: está restrito a 2K bytes de texto
9 13  
10   -class ServiceWindowGenerationFromText : public ServiceWindowGeneration, public ListenerTXT, public ListenerTradutor, public ListenerSynchronizer, public Thread {
  14 +/** \brief Classe que implementa o serviço de extração de texto.
  15 + *
  16 + * \headerfile servico/src/include/serviceWindowGenerationFromTXT.h
  17 + */
  18 +class ServiceWindowGenerationFromText : public ServiceWindowGeneration, public ListenerTXT, public ListenerTradutor, public ListenerRenderer, public Thread {
11 19  
12 20 private:
13 21 ExtratorFactory* extrator_factory;
14 22 ExtratorTXT* extratorTXT;
15 23  
  24 + /** Seta o número de linhas.
  25 + *
  26 + * \param A quantidade de linhas.
  27 + * \exception ServiceException Se houver algum erro durante a execução.
  28 + */
16 29 void setSizeOfSubtitles(int sub_size);
  30 +
  31 + /** Define o path do vídeo de LIBRAS. */
  32 + void setPathLibras();
  33 +
  34 + /** Define o path dos arquivos de saída.
  35 + *
  36 + * \exception RuntimeException Se houver algum erro durante a execução.
  37 + */
17 38 void setPathContents();
18   - void setPathLibras();
19   - void setBackground();
20 39  
21   - void transcodeVideoToMp4();
  40 + /** Indica se o serviço está sendo executado.
  41 + *
  42 + * \return O status do serviço.
  43 + */
22 44 bool isRunning();
23 45 public:
24   - ServiceWindowGenerationFromText(char* pathFile, int transparency, char* id, char* client);
  46 + /** Construtor.
  47 + *
  48 + * \param pathFile Path do arquivo de texto de entrada.
  49 + * \param sublanguage Linguagem das legendas do arquivo.
  50 + * \param transparency Transparência do plano de fundo do vídeo.
  51 + * \param id Identificação do cliente.
  52 + * \param mode Modo de execução.
  53 + */
  54 + ServiceWindowGenerationFromText(char* pathFile, int sublanguage, int transparency, char* id, int mode);
  55 +
  56 + /** Destrutor */
25 57 ~ServiceWindowGenerationFromText();
26 58  
  59 + /** Notifica novas linhas extraídas.
  60 + *
  61 + * \param line A linha extraída.
  62 + */
27 63 void notifyLine(unsigned char* line);
28   - void notifyTranslation(vector<string>* glosas);
  64 +
  65 + /** Recebe a notificação do fim da renderização do vídeo */
  66 + void notifyEndOfRenderization();
  67 +
  68 + /** Recebe a notificação do fim da tradução do texto.
  69 + *
  70 + * \param glosa O texto traduzido.
  71 + */
  72 + void notifyTranslation(char* glosa);
  73 +
  74 + /** Envia para a tradução a linha obtida.
  75 + *
  76 + * \param text A linha obtida.
  77 + */
29 78 void notifyTranslator(unsigned char* text);
30   - void notifyEndOfSynchronization();
  79 +
  80 + /** Envia a glosa para o renderizador.
  81 + *
  82 + * \param glosa A glosa obtida.
  83 + * \exception ServiceException Se houver algum erro durante a execução.
  84 + */
  85 + void notifyRenderer(string glosa);
  86 +
  87 + /** Notifica o fim da extração do texto.
  88 + *
  89 + * \param line_size O número de linhas extraídas.
  90 + */
31 91 void notifyEnd(int line_size);
32 92  
  93 + /** Inicia o serviço de extração de texto.
  94 + *
  95 + * \exception ServiceException Se houver algum erro durante a execução.
  96 + */
33 97 void initialize();
  98 +
  99 + /** Indica o fim do processo do serviço.
  100 + *
  101 + * \return O status do processo.
  102 + */
34 103 bool isFinished();
  104 +
  105 + /** Este método é chamado quando a Thread for iniciada. */
35 106 void Run();
36 107 };
37 108  
... ...
servico/src/serviceTester.cpp 0 → 100644
... ... @@ -0,0 +1,168 @@
  1 +#include "serviceTester.h"
  2 +
  3 +ServiceTester::ServiceTester(int _position, int _size, int _background) {
  4 + if(_position != 0)
  5 + this->position = _position;
  6 + else
  7 + this->position = 3; //bottom_rigth
  8 +
  9 + if(_size != 0)
  10 + this->resolution = _size;
  11 + else
  12 + this->resolution = 2; //medium
  13 +
  14 + this->background = _background;
  15 + msgErr = "";
  16 + finish = false;
  17 + fail = false;
  18 + PRINTL(util::_DEBUG, "ServiceTester Done!\n");
  19 +}
  20 +
  21 +ServiceTester::~ServiceTester() {
  22 + PRINTL(util::_DEBUG, "ServiceTester Finalized!\n");
  23 +}
  24 +
  25 +void ServiceTester::checkServiceSRT() {
  26 + PRINTL(util::_DEBUG, "Checando extração de legenda...\n");
  27 + setPathContents();
  28 +
  29 + service_srt = new ServiceWindowGenerationFromSubtitle((char*)VID_FILE, (char*)SRT_FILE, 1, position,
  30 + resolution, background, (char*)TESTER_ID, MODE_TEST, 1);
  31 +
  32 + try{
  33 + service_srt->initialize();
  34 + }catch(ServiceException &ex){
  35 + msgErr += "Extração de legenda\n";
  36 + fail = true;
  37 + return;
  38 + }
  39 +
  40 + while(!service_srt->isFinished())
  41 + sleep(5);
  42 + delete service_srt;
  43 +
  44 + bool sucess;
  45 + sucess = checkFiles(VID_FILE, OUT_FILE);
  46 + if(!sucess){
  47 + msgErr += "Extração de legenda\n";
  48 + }
  49 + deleteFiles();
  50 +}
  51 +
  52 +void ServiceTester::checkServiceRec() {
  53 + PRINTL(util::_DEBUG, "Checando reconhecimento...\n");
  54 + setPathContents();
  55 +
  56 + service_rec = new ServiceWindowGenerationFromRec((char*)REC_FILE, 0, 0,
  57 + background, (char*)TESTER_ID, MODE_TEST, 6);// 6 serviço sem mixagem
  58 +
  59 + try{
  60 + service_rec->initialize();
  61 + }catch(ServiceException &ex){
  62 + msgErr += "Reconhecimento\n";
  63 + fail = true;
  64 + return;
  65 + }
  66 + while(!service_rec->isFinished())
  67 + sleep(5);
  68 + delete service_rec;
  69 +
  70 + bool sucess;
  71 + sucess = checkFiles(REC_FILE, OUT_FILE);
  72 + if(!sucess){
  73 + msgErr += "Reconhecimento\n";
  74 + }
  75 + deleteFiles();
  76 +}
  77 +void ServiceTester::checkServiceText() {
  78 + PRINTL(util::_DEBUG, "Checando extração de texto...\n");
  79 + setPathContents();
  80 +
  81 + service_text = new ServiceWindowGenerationFromText((char*)TXT_FILE, 1, background,
  82 + (char*)TESTER_ID, MODE_TEST);
  83 +
  84 + try{
  85 + service_text->initialize();
  86 + }catch(ServiceException &ex){
  87 + msgErr += "Extração de texto\n";
  88 + fail = true;
  89 + return;
  90 + }
  91 +
  92 + while (!service_text->isFinished())
  93 + usleep(100000); //100ms
  94 + delete service_text;
  95 +
  96 + bool sucess;
  97 + sucess = checkFiles(TXT_FILE, OUT_FILE);
  98 + if(!sucess){
  99 + msgErr += "Extração de texto\n";
  100 + }
  101 + deleteFiles();
  102 +}
  103 +
  104 +bool ServiceTester::checkFiles(string fileIn, string fileOut) {
  105 + int64_t inSize;
  106 + int64_t outSize;
  107 + fIn = new lavidlib::File(fileIn);
  108 + fOut = new lavidlib::File(fileOut);
  109 +
  110 + try{
  111 + fIO_in = new lavidlib::FileIO(fIn->getPath(), FileIO::MODE_READ);
  112 + fIO_out = new lavidlib::FileIO(fOut->getPath(), FileIO::MODE_READ);
  113 + }catch(Exception &ex){
  114 + delete fIn;
  115 + delete fOut;
  116 + fail = true;
  117 + return false;
  118 + }
  119 +
  120 + inSize = fIO_in->getSize();
  121 + outSize = fIO_out->getSize();
  122 +
  123 + delete fIn;
  124 + delete fOut;
  125 + delete fIO_in;
  126 + delete fIO_out;
  127 +
  128 + if(outSize != 0 && outSize != inSize)
  129 + return true;
  130 +
  131 + fail = true;
  132 + return false;
  133 +}
  134 +
  135 +bool ServiceTester::isFinished(){
  136 + return this->finish;
  137 +}
  138 +
  139 +bool ServiceTester::hasFailed() {
  140 + return this->fail;
  141 +}
  142 +
  143 +void ServiceTester::setPathContents() {
  144 + string command = "mkdir -p ";
  145 + command.append(PATH_TEST_CONTENTS).append(" && mkdir -p ")
  146 + .append(PATH_TEST_UPLOADS).append("/").append(TESTER_ID);
  147 + system(command.c_str());
  148 +}
  149 +
  150 +void ServiceTester::deleteFiles() {
  151 + string command = "rm -f ";
  152 + command.append(OUT_FILE).append(" && rm -rf ")
  153 + .append(PATH_TEST_UPLOADS).append("/").append(TESTER_ID);
  154 + system(command.c_str());
  155 +}
  156 +
  157 +void ServiceTester::Run() {
  158 + PRINTL(util::_INFO, "Verificando módulos, aguarde...\n");
  159 + checkServiceText();
  160 + checkServiceSRT();
  161 + checkServiceRec();
  162 +
  163 + if(hasFailed())
  164 + throw ServiceException(msgErr);
  165 +
  166 + PRINTL(util::_INFO, "Não foram encontrados problemas!\n");
  167 + finish = true;
  168 +}
0 169 \ No newline at end of file
... ...
servico/src/serviceWindowGenerationFromRec.cpp
1 1 #include "serviceWindowGenerationFromRec.h"
2 2  
3 3 ServiceWindowGenerationFromRec::ServiceWindowGenerationFromRec(
4   - char* pathVideo, int sublanguage, int pos, int size, int transp, char* id, int serviceType, char* rate){
  4 + char* pathVideo, int pos, int size, int transp, char* id, char* client, int serviceType, char* rate){
5 5  
6 6 this->path_input = pathVideo;
7   - this->sub_language = sublanguage;
8 7 this->position = pos;
9 8 this->size = size;
10 9 this->transparency = transp;
11 10 this->user_id = id;
  11 + // this->client_type = client;
12 12 this->service_type = serviceType;
13 13 numero_legendas = INT_MAX;
14 14 legendas_enviadas = 0;
... ... @@ -17,19 +17,18 @@ ServiceWindowGenerationFromRec::ServiceWindowGenerationFromRec(
17 17 tradutor = new TradutorPortGlosa();
18 18 running = true;
19 19 finish = false;
20   - DPRINTF("Done!\n");
  20 + PRINTL(util::_DEBUG, "Service Rec Done!\n");
21 21 }
22 22  
23 23 ServiceWindowGenerationFromRec::ServiceWindowGenerationFromRec(
24   - char* pathVideo, int sublanguage, int pos, int size, int transp, char* id, char* client, int serviceType){
  24 + char* pathVideo, int pos, int size, int transp, char* id, int mode, int serviceType){
25 25  
26 26 this->path_input = pathVideo;
27   - this->sub_language = sublanguage;
28 27 this->position = pos;
29 28 this->size = size;
30 29 this->transparency = transp;
31 30 this->user_id = id;
32   - this->client_type = client;
  31 + this->exec_mode = mode;
33 32 this->service_type = serviceType;
34 33 numero_legendas = INT_MAX;
35 34 legendas_enviadas = 0;
... ... @@ -43,73 +42,91 @@ ServiceWindowGenerationFromRec::ServiceWindowGenerationFromRec(
43 42 }
44 43 running = true;
45 44 finish = false;
46   - DPRINTF("Done!\n");
  45 + PRINTL(util::_DEBUG, "Service Rec Done!\n");
47 46 }
48 47  
49 48 ServiceWindowGenerationFromRec::~ServiceWindowGenerationFromRec(){
50 49 free(vetor_pts);
51 50 if (tradutor) delete tradutor;
  51 + if (renderer) delete renderer;
52 52 if (rec) delete rec;
53   - if (sincronizador) delete sincronizador;
54   - if (mixer) delete mixer;
55   - DDDPRINTF("Service Rec finished!\n");
  53 + PRINTL(util::_DEBUG, "Service Rec finished!\n");
56 54 }
57 55  
58 56 void ServiceWindowGenerationFromRec::setPathContents(){
59   - if(strcmp(client_type,DEVELOPER) == 0){
60   - this->path_contents = PATH_DEVEL;
61   - this->path_uploads = PATH_DEVEL_UPLOADS;
62   - rec->setPathAudioContents(path_uploads);
63   - }else if(strcmp(client_type, PRODUCTION) == 0){
64   - ifstream conf_file(PATH_CONF_FILE, ifstream::binary);
65   - parsingSuccessful = reader.parse(conf_file, root);
66   - if(!parsingSuccessful){
67   - conf_file.close();
68   - throw ServiceException("Fail to parsing param.json");
69   - }
70   - string attr = root.get("storage", PATH_VBOX_UPLOADS).asString();
71   - this->path_contents = new char[MAX_SIZE_PATH];
72   - strcpy(this->path_contents, attr.c_str());
73   - this->path_uploads = PATH_VBOX_UPLOADS;
74   - rec->setPathAudioContents(path_uploads);
75   - conf_file.close();
76   - }else{
77   - throw ServiceException("Invalid client!");
78   - }
  57 + switch(exec_mode) {
  58 + case DEVELOPER:
  59 + {
  60 + char* vStorage;
  61 + char* vUploads;
  62 + vStorage = getenv("VLSTORAGE");
  63 + vUploads = getenv("VLUPLOADS");
  64 +
  65 + if(vStorage != NULL && vUploads != NULL){
  66 + this->path_contents = vStorage;
  67 + this->path_uploads = vUploads;
  68 + PRINTL(util::_DEBUG, "Paths definidos pelo desenvolvedor:\n %s\n%s\n", path_contents, path_uploads);
  69 + }else{
  70 + this->path_contents = (char*) PATH_DEVEL_CONTENTS;
  71 + this->path_uploads = (char*) PATH_DEVEL_UPLOADS;
  72 + }
  73 + rec->setPathAudioContents(path_uploads);
  74 + }break;
  75 +
  76 + case PRODUCTION:
  77 + {
  78 + ifstream conf_file(PATH_CONF_FILE, ifstream::binary);
  79 + parsingSuccessful = reader.parse(conf_file, root);
  80 +
  81 + if(parsingSuccessful) {
  82 + string attr = "vlibras_user/";
  83 + attr += root.get("storage", PATH_VBOX_UPLOADS).asString();
  84 + this->path_contents = new char[MAX_SIZE_PATH];
  85 + strcpy(this->path_contents, attr.c_str());
  86 + this->path_uploads = (char*) PATH_VBOX_UPLOADS;
  87 + rec->setPathAudioContents(path_uploads);
  88 + }else{
  89 + conf_file.close();
  90 + Logging::instance()->writeLog("Erro com a leitura do arquivo params.json");
  91 + throw RuntimeException("Fail to parsing params.json");
  92 + }
  93 + conf_file.close();
  94 + }break;
  95 +
  96 + case TESTER:
  97 + {
  98 + this->path_contents = (char*) PATH_TESTER_CONTENTS;
  99 + this->path_uploads = (char*) PATH_TESTER_UPLOADS;
  100 + rec->setPathAudioContents(path_uploads);
  101 + }break;
  102 +
  103 + default:
  104 + throw ServiceException("Invalid execution mode!");
  105 + }
79 106 }
80 107  
81   -void ServiceWindowGenerationFromRec::setPathLibras(){
82   - char* final_path = new char[MAX_SIZE_PATH];
83   - strcpy(final_path, this->path_uploads);
84   - strcat(final_path, this->user_id);
85   - strcat(final_path, "/video_libras.ts");
  108 +void ServiceWindowGenerationFromRec::setPathLibras() {
  109 + string final_path = "";
  110 + path_libras = new char[MAX_SIZE_PATH];
86 111  
87   - this->path_libras = final_path;
88   -}
  112 + if(this->service_type == SERVICE_TYPE_REC)
  113 + final_path.append(this->path_uploads).append("/").append(this->user_id);
  114 + else
  115 + final_path.append(this->path_contents);
89 116  
90   -void ServiceWindowGenerationFromRec::setBackground(){
91   - if(this->transparency == 0) { //pega dicionario com BackGround opaco
92   - char* dicPath;
93   - dicPath = getenv("DIC_LIBRAS");
94   - if(dicPath != NULL)
95   - sincronizador = new Synchronizer(dicPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
96   - else
97   - sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
98   -
99   - } else if(this->transparency == 1) { //pega dicionario com BackGround transparente
100   - char* dicTPath;
101   - dicTPath = getenv("DICTRANSP_LIBRAS");
102   - if(dicTPath != NULL)
103   - sincronizador = new Synchronizer(dicTPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
104   - else
105   - sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
106   - }
  117 + final_path.append("/").append(this->user_id).append(".mp4");
  118 + strcpy(this->path_libras, final_path.c_str());
107 119 }
108 120  
109 121 void ServiceWindowGenerationFromRec::setSizeOfSubtitles(int sub_size){
110 122 numero_legendas = sub_size;
111   - if (legendas_enviadas >= numero_legendas)
112   - sincronizador->stop();
  123 + if (legendas_enviadas >= numero_legendas){
  124 + try{
  125 + renderer->initialize();
  126 + }catch(lavidlib::RuntimeException &ex){
  127 + throw ServiceException(ex.getMessage().c_str());
  128 + }
  129 + }
113 130 }
114 131  
115 132 void ServiceWindowGenerationFromRec::addPTS(int64_t pts){
... ... @@ -126,36 +143,34 @@ void ServiceWindowGenerationFromRec::notifyTextRecognized(unsigned char* text, i
126 143 notifyTranslator(text);
127 144 }
128 145  
129   -//Quando o sincronizador termina, ele invoca esse método para avisar
130   -void ServiceWindowGenerationFromRec::notifyEndOfSynchronization() {
131   - if (this->service_type == SERVICE_TYPE_REC) {
132   - mixer = new Mixer();
133   - mixer->initialize(this->path_input, this->path_libras,this->position,this->size,
134   - this->transparency, this->user_id, this->path_uploads, this->path_contents);
135   - createThumbnail();
136   - }else{
137   - transcodeVideoToMp4();
  146 +void ServiceWindowGenerationFromRec::notifyTranslation(char* glosa) {
  147 + string sGlosa(reinterpret_cast<char*>(glosa));
  148 + try{
  149 + renderer->receiveGlosa(sGlosa, vetor_pts->front());
  150 + legendas_enviadas++;
  151 + }catch(lavidlib::RuntimeException &ex){
  152 + throw ServiceException(ex.getMessage().c_str());
138 153 }
139   - this->running = false;
  154 + vetor_pts->erase(vetor_pts->begin());
140 155 }
141 156  
142   -void ServiceWindowGenerationFromRec::notifyTranslation(vector<string> * glosas) {
143   - for (int i = 0; i < glosas->size(); i++) {
144   - locale loc;
145   - string glosa_lower = "";
146   - for (int k = 0; k < glosas->at(i).length(); k++){
147   - glosa_lower += std::tolower(glosas->at(i).at(k), loc);
148   - }
149   - int64_t pts_notificado = vetor_pts->front();
150   - sincronizador->recebeglosa(glosa_lower, pts_notificado);
  157 +void ServiceWindowGenerationFromRec::notifyEndOfRenderization() {
  158 + if(this->service_type == SERVICE_TYPE_REC){
  159 + mixer = new Mixer(this->path_input, this->path_libras, this->size, this->position,
  160 + this->transparency, this->user_id, this->path_uploads, this->path_contents);
  161 + mixer->initialize();
  162 + delete mixer;
151 163 }
152   - vetor_pts->erase(vetor_pts->begin());
153   - legendas_enviadas++;
  164 + running = false;
154 165 }
155 166  
156 167 void ServiceWindowGenerationFromRec::notifyEnd(int sentences_size){
157   - DPRINTF("Service REC recebeu: %d sentenças.\n", sentences_size);
158   - setSizeOfSubtitles(sentences_size);
  168 + PRINTL(util::_DEBUG, "Service REC recebeu: %d sentenças.\n", sentences_size);
  169 + try{
  170 + setSizeOfSubtitles(sentences_size);
  171 + }catch(ServiceException &ex) {
  172 + finish = true;
  173 + }
159 174 }
160 175  
161 176 bool ServiceWindowGenerationFromRec::isRunning(){
... ... @@ -167,69 +182,24 @@ bool ServiceWindowGenerationFromRec::isFinished(){
167 182 }
168 183  
169 184 void ServiceWindowGenerationFromRec::initialize(){
170   - DPRINTF("Service REC Initialize.\n");
171   - rec->addListener(this);
  185 + PRINTL(util::_DEBUG, "Service REC Initialize.\n");
172 186 setPathLibras();
  187 + rec->addListener(this);
  188 + tradutor->addListener(this);
173 189  
174   - if(this->sub_language == 1)
175   - tradutor->addListener(this);
176   -
177   - if(this->service_type != SERVICE_TYPE_REC_ONLY_AUDIO){
178   - vector<string> tokens;
179   - char* pathtmp = this->path_input;
180   - int size = strlen(pathtmp);
181   - char vtemp [size];
182   -
183   - strcpy(vtemp, pathtmp);
184   - pathtmp = strtok(vtemp, ".");
185   - while (pathtmp != NULL) {
186   - tokens.push_back(string(pathtmp));
187   - pathtmp = strtok(NULL, ".");
188   - }
189   -
190   - string buildstrpath = tokens[0] + "_libras" + EXTENSAO_DICIONARIO;
191   - this->path_libras = new char[buildstrpath.size()];
192   - strcpy(this->path_libras, buildstrpath.c_str());
193   - //printf("O Serviço montou o seguinte path para o vídeo de Libras: %s\n", path_libras);
194   -
195   - }else{
196   - tradutor->addListener(this);
197   - }
198   -
199   - setBackground();
200   -
201   - uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro
202   - sincronizador->setPCRBase(pcr_base);
203   - sincronizador->addListener(this);
204   - sincronizador->Start();
205   -
  190 + renderer = new Renderer(this->path_libras ,this->user_id);
  191 + renderer->addListener(this);
  192 +
206 193 try{
207 194 rec->initialize();
208 195 } catch(RecognizeException ex){
209 196 throw ServiceException(ex.getMessage());
210   - }
  197 + } catch(RuntimeException &ex){
  198 + throw ServiceException(ex.getMessage().c_str());
  199 + }
211 200 this->Start();
212 201 }
213 202  
214   -void ServiceWindowGenerationFromRec::transcodeVideoToMp4(){
215   - DPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n");
216   - string command = "ffmpeg -i ";
217   - command.append(path_libras)
218   - .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ")
219   - .append(path_contents).append(user_id).append(".mp4");
220   - //printf("[INFO]: Transcodification command -> %s\n", command.c_str());
221   - system(command.c_str());
222   -}
223   -
224   -void ServiceWindowGenerationFromRec::createThumbnail(){
225   - string command = "ffmpeg -ss 10 -i ";
226   - command.append(path_contents).append(user_id).append(".mp4")
227   - .append(" -vcodec png -vframes 1 -an -f rawvideo -y -vf scale=200:200 ").append(" -v quiet ")
228   - .append(path_contents).append(user_id).append(".png");
229   - //printf("[INFO]: Thumbnail command -> %s\n", command.c_str());
230   - system(command.c_str());
231   -}
232   -
233 203 void ServiceWindowGenerationFromRec::Run(){
234 204 while(isRunning()){
235 205 usleep(200000);
... ...
servico/src/serviceWindowGenerationFromSRT.cpp
... ... @@ -1,248 +0,0 @@
1   -#include "serviceWindowGenerationFromSRT.h"
2   -
3   -ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(char* pathVideo, char* pathSRT, int sublanguage,
4   - int pos, int size, int transp, char* id, char* client, int serviceType) {
5   -
6   - this->path_input = pathVideo;
7   - this->path_srt = pathSRT;
8   - this-> sub_language = sublanguage;
9   - this->position = pos;
10   - this->size = size;
11   - this->transparency = transp;
12   - this->user_id = id;
13   - this->client_type = client;
14   - this->service_type = serviceType;
15   - numero_legendas = INT_MAX;
16   - legendas_enviadas = 0;
17   - vetor_pts = new vector<int64_t >();
18   - tradutor = new TradutorPortGlosa();
19   - extrator_factory = new ExtratorFactory();
20   - try{
21   - setPathContents();
22   - }catch(RuntimeException ex){
23   - throw ServiceException(ex.getMessage());
24   - }
25   - running = true;
26   - finish = false;
27   - DPRINTF("Done!\n");
28   -}
29   -
30   -ServiceWindowGenerationFromSRT::ServiceWindowGenerationFromSRT(char* pathSRT, int transp, char* id, char* client, int serviceType) {
31   -
32   - this->path_srt = pathSRT;
33   - this->transparency = transp;
34   - this->user_id = id;
35   - this->client_type = client;
36   - this->service_type = serviceType;
37   - numero_legendas = INT_MAX;
38   - legendas_enviadas = 0;
39   - vetor_pts = new vector<int64_t >();
40   - tradutor = new TradutorPortGlosa();
41   - extrator_factory = new ExtratorFactory();
42   - try{
43   - setPathContents();
44   - }catch(RuntimeException ex){
45   - throw ServiceException(ex.getMessage());
46   - }
47   - running = true;
48   - finish = false;
49   - DPRINTF("Done!\n");
50   -}
51   -
52   -ServiceWindowGenerationFromSRT::~ServiceWindowGenerationFromSRT() {
53   - free(vetor_pts);
54   - if (mixer) delete mixer;
55   - if (tradutor) delete tradutor;
56   - if (sincronizador) delete sincronizador;
57   - if (extratorSRT)delete extratorSRT;
58   - if (extrator_factory) delete extrator_factory;
59   - DDDPRINTF("Service SRT finalized!\n");
60   -}
61   -
62   -void ServiceWindowGenerationFromSRT::setPathContents() {
63   - if(strcmp(client_type,DEVELOPER) == 0){
64   - this->path_contents = PATH_DEVEL;
65   - this->path_uploads = PATH_DEVEL_UPLOADS;
66   - }else if(strcmp(client_type, PRODUCTION) == 0){
67   - ifstream conf_file(PATH_CONF_FILE, ifstream::binary);
68   - parsingSuccessful = reader.parse(conf_file, root);
69   - if(!parsingSuccessful){
70   - conf_file.close();
71   - throw ServiceException("Fail to parsing param.json");
72   - }
73   - string attr = root.get("storage", PATH_VBOX_UPLOADS).asString();
74   - this->path_contents = new char[MAX_SIZE_PATH];
75   - strcpy(this->path_contents, attr.c_str());
76   - this->path_uploads = PATH_VBOX_UPLOADS;
77   - conf_file.close();
78   - }else{
79   - throw ServiceException("Invalid client!");
80   - }
81   -}
82   -
83   -void ServiceWindowGenerationFromSRT::setPathLibras() {
84   - char* final_path = new char[MAX_SIZE_PATH];
85   - strcpy(final_path, this->path_uploads);
86   - strcat(final_path, this->user_id);
87   - strcat(final_path, "/video_libras.ts");
88   -
89   - this->path_libras = final_path;
90   -}
91   -
92   -void ServiceWindowGenerationFromSRT::setBackground() {
93   - if(this->transparency == 0) { //pega dicionario com BackGround opaco
94   - char* dicPath;
95   - dicPath = getenv("DIC_LIBRAS");
96   - if(dicPath != NULL)
97   - sincronizador = new Synchronizer(dicPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
98   - else
99   - sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
100   -
101   - } else if(this->transparency == 1) { //pega dicionario com BackGround transparente
102   - char* dicTPath;
103   - dicTPath = getenv("DICTRANSP_LIBRAS");
104   - if(dicTPath != NULL)
105   - sincronizador = new Synchronizer(dicTPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
106   - else
107   - sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
108   - }
109   -}
110   -
111   -void ServiceWindowGenerationFromSRT::setSizeOfSubtitles(int sub_size) {
112   - numero_legendas = sub_size;
113   - if (legendas_enviadas >= numero_legendas)
114   - sincronizador->stop();
115   -}
116   -
117   -void ServiceWindowGenerationFromSRT::addPTS(int64_t pts){
118   - vetor_pts->push_back(pts);
119   -}
120   -
121   -void ServiceWindowGenerationFromSRT::notifyTranslator(unsigned char* subtitle) {
122   - const char* constchar = (const char*) subtitle;
123   - char* legenda_copy = new char[strlen(constchar)+1];
124   - strcpy(legenda_copy, constchar);
125   - tradutor->traduz((unsigned char*) legenda_copy);
126   - free(legenda_copy);
127   -}
128   -
129   -void ServiceWindowGenerationFromSRT::notifySubtitle(unsigned char *subtitle, int64_t pts){
130   - addPTS(pts);
131   - notifyTranslator(subtitle);
132   -}
133   -
134   -void ServiceWindowGenerationFromSRT::notifyEndOfSynchronization() {
135   - if (this->service_type == SERVICE_TYPE_SRT) {
136   - mixer = new Mixer();
137   - mixer->initialize(this->path_input, this->path_libras,this->position,this->size,
138   - this->transparency, this->user_id, this->path_uploads, this->path_contents);
139   - createThumbnail();
140   - }else{
141   - transcodeVideoToMp4();
142   - }
143   - this->running = false;
144   -}
145   -
146   -void ServiceWindowGenerationFromSRT::notifyTranslation(vector<string> * glosas) {
147   - for (int i = 0; i < glosas->size(); i++) {
148   - locale loc;
149   - string glosa_lower = "";
150   - for (int k = 0; k < glosas->at(i).length(); k++){
151   - glosa_lower += std::tolower(glosas->at(i).at(k), loc);
152   - }
153   - int64_t pts_notificado = vetor_pts->front();
154   - sincronizador->recebeglosa(glosa_lower, pts_notificado);
155   - }
156   - vetor_pts->erase(vetor_pts->begin());
157   - legendas_enviadas++;
158   -}
159   -
160   -void ServiceWindowGenerationFromSRT::notifyEnd(int sub_size) {
161   - DPRINTF("Service SRT recebeu: %d legendas.\n", sub_size);
162   - setSizeOfSubtitles(sub_size);
163   -}
164   -
165   -bool ServiceWindowGenerationFromSRT::isRunning() {
166   - return this->running;
167   -}
168   -
169   -bool ServiceWindowGenerationFromSRT::isFinished() {
170   - return this->finish;
171   -}
172   -
173   -void ServiceWindowGenerationFromSRT::initialize() {
174   - DPRINTF("Service SRT Initialize.\n");
175   - extratorSRT = (ExtratorSRT*) extrator_factory->getExtrator(Extrator::SRT);
176   - extratorSRT->addListener(this);
177   - extratorSRT->setFilePath(path_srt);
178   -
179   - setPathLibras();
180   -
181   - if (this->sub_language == 1)
182   - tradutor->addListener(this);
183   -
184   - if(this->service_type != SERVICE_TYPE_SRT_ONLY){
185   - vector<string> tokens;
186   - char* pathtmp = this->path_input;
187   - int size = strlen(pathtmp);
188   - char vtemp [size];
189   -
190   - strcpy(vtemp, pathtmp);
191   - pathtmp = strtok(vtemp, ".");
192   - while (pathtmp != NULL) {
193   - tokens.push_back(string(pathtmp));
194   - pathtmp = strtok(NULL, ".");
195   - }
196   -
197   - string buildstrpath = tokens[0] + "_libras" + EXTENSAO_DICIONARIO;
198   - this->path_libras = new char[buildstrpath.size()];
199   - strcpy(this->path_libras, buildstrpath.c_str());
200   - //printf("O Serviço montou o seguinte path para o vídeo de Libras: %s\n", path_libras);
201   -
202   - }else{
203   - tradutor->addListener(this);
204   - }
205   -
206   - setBackground();
207   -
208   - if (service_type != SERVICE_TYPE_SRT) {
209   - uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro
210   - sincronizador->setPCRBase(pcr_base);
211   - }
212   -
213   - sincronizador->addListener(this);
214   - sincronizador->Start();
215   -
216   - try{
217   - extratorSRT->initialize();
218   - }catch(ExtratorException ex){
219   - throw ServiceException(ex.getMessage());
220   - }
221   - this->Start();
222   -}
223   -
224   -void ServiceWindowGenerationFromSRT::transcodeVideoToMp4(){
225   - DPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n");
226   - string command = "ffmpeg -i ";
227   - command.append(path_libras)
228   - .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ")
229   - .append(path_contents).append(user_id).append(".mp4");
230   - //printf("[INFO]: Transcodification command -> %s\n", command.c_str());
231   - system(command.c_str());
232   -}
233   -
234   -void ServiceWindowGenerationFromSRT::createThumbnail(){
235   - string command = "ffmpeg -ss 10 -i ";
236   - command.append(path_contents).append(user_id).append(".mp4")
237   - .append(" -vcodec png -vframes 1 -an -f rawvideo -y -vf scale=200:200 ").append(" -v quiet ")
238   - .append(path_contents).append(user_id).append(".png");
239   - //printf("[INFO]: Thumbnail command -> %s\n", command.c_str());
240   - system(command.c_str());
241   -}
242   -
243   -void ServiceWindowGenerationFromSRT::Run() {
244   - while(isRunning()){
245   - usleep(200000);
246   - }
247   - finish = true;
248   -}
249 0 \ No newline at end of file
servico/src/serviceWindowGenerationFromSubtitle.cpp 0 → 100644
... ... @@ -0,0 +1,288 @@
  1 +#include "serviceWindowGenerationFromSubtitle.h"
  2 +
  3 +ServiceWindowGenerationFromSubtitle::ServiceWindowGenerationFromSubtitle(char* pathVideo, char* pathSRT, int sublanguage,
  4 + int pos, int size, int transp, char* id, int mode, int serviceType) {
  5 +
  6 + this->path_input = pathVideo;
  7 + this->path_srt = pathSRT;
  8 + this->sub_language = sublanguage;
  9 + this->position = pos;
  10 + this->size = size;
  11 + this->transparency = transp;
  12 + this->user_id = id;
  13 + this->exec_mode = mode;
  14 + this->service_type = serviceType;
  15 + numero_legendas = INT_MAX;
  16 + legendas_enviadas = 0;
  17 + vetor_pts = new vector<int64_t >();
  18 + extrator_factory = new ExtratorFactory();
  19 + try{
  20 + setPathContents();
  21 + }catch(RuntimeException ex){
  22 + throw ServiceException(ex.getMessage());
  23 + }
  24 + running = true;
  25 + finish = false;
  26 + PRINTL(util::_DEBUG, "Service Subtitle Done!\n");
  27 +}
  28 +
  29 +ServiceWindowGenerationFromSubtitle::ServiceWindowGenerationFromSubtitle(char* pathSRT, int sublanguage, int transp, char* id, int mode, int serviceType) {
  30 + this->path_srt = pathSRT;
  31 + this->sub_language = sublanguage;
  32 + this->transparency = transp;
  33 + this->user_id = id;
  34 + this->exec_mode = mode;
  35 + this->service_type = serviceType;
  36 + numero_legendas = INT_MAX;
  37 + legendas_enviadas = 0;
  38 + vetor_pts = new vector<int64_t >();
  39 + extrator_factory = new ExtratorFactory();
  40 + try{
  41 + setPathContents();
  42 + }catch(RuntimeException ex){
  43 + throw ServiceException(ex.getMessage());
  44 + }
  45 + running = true;
  46 + finish = false;
  47 + PRINTL(util::_DEBUG, "Service Subtitle Done!\n");
  48 +}
  49 +
  50 +ServiceWindowGenerationFromSubtitle::~ServiceWindowGenerationFromSubtitle() {
  51 + free(vetor_pts);
  52 + if (tradutor) delete tradutor;
  53 + // if (mixer) delete mixer;
  54 + if (renderer) delete renderer;
  55 + if (extratorVTT)delete extratorVTT;
  56 + if (extrator_factory) delete extrator_factory;
  57 + PRINTL(util::_DEBUG, "Service Subtitle finalized!\n");
  58 +}
  59 +
  60 +void ServiceWindowGenerationFromSubtitle::setPathContents() {
  61 + switch(exec_mode) {
  62 + case DEVELOPER:
  63 + {
  64 + char* vStorage;
  65 + char* vUploads;
  66 + vStorage = getenv("VLSTORAGE");
  67 + vUploads = getenv("VLUPLOADS");
  68 +
  69 + if(vStorage != NULL && vUploads != NULL){
  70 + this->path_contents = vStorage;
  71 + this->path_uploads = vUploads;
  72 + PRINTL(util::_DEBUG, "Paths definidos pelo desenvolvedor:\n %s\n%s\n", path_contents, path_uploads);
  73 + }else{
  74 + this->path_contents = (char*) PATH_DEVEL_CONTENTS;
  75 + this->path_uploads = (char*) PATH_DEVEL_UPLOADS;
  76 + }
  77 + }break;
  78 +
  79 + case PRODUCTION:
  80 + {
  81 + ifstream conf_file(PATH_CONF_FILE, ifstream::binary);
  82 + parsingSuccessful = reader.parse(conf_file, root);
  83 +
  84 + if(parsingSuccessful) {
  85 + string attr = "vlibras_user/";
  86 + attr += root.get("storage", PATH_VBOX_UPLOADS).asString();
  87 + this->path_contents = new char[MAX_SIZE_PATH];
  88 + strcpy(this->path_contents, attr.c_str());
  89 + this->path_uploads = (char*) PATH_VBOX_UPLOADS;
  90 + }else{
  91 + conf_file.close();
  92 + Logging::instance()->writeLog("Erro com a leitura do arquivo params.json");
  93 + throw new RuntimeException("Fail to parsing params.json");
  94 + }
  95 + conf_file.close();
  96 + }break;
  97 +
  98 + case TESTER:
  99 + {
  100 + this->path_contents = (char*) PATH_TESTER_CONTENTS;
  101 + this->path_uploads = (char*) PATH_TESTER_UPLOADS;
  102 + }break;
  103 +
  104 + default:
  105 + throw ServiceException("Invalid execution mode!");
  106 + }
  107 +}
  108 +
  109 +Extrator::ExtratorType ServiceWindowGenerationFromSubtitle::getExtratorType(){
  110 + this->file = new lavidlib::File(this->path_srt);
  111 + try{
  112 + this->fileIO = new lavidlib::FileIO(file->getPath(), FileIO::MODE_READ);
  113 + this->bffReader = new BufferedReader(fileIO);
  114 + }catch(Exception &ex){
  115 + Logging::instance()->writeLog("ServiceWindowGenerationFromSubtitle.cpp <Error>: Arquivo de legenda não encontrado.");
  116 + throw ServiceException("Falha ao abrir o arquivo de legenda! Verifique se o mesmo existe.\n");
  117 + }
  118 +
  119 + string signature;
  120 + try{
  121 + signature = bffReader->readLine();
  122 + }catch(lavidlib::EOFException &ex){
  123 + throw ServiceException("Arquivo sem conteúdo.");
  124 + }
  125 +
  126 + /* As verificações a seguir estão de acordo com o padrão
  127 + * definido pelo W3C Community Group.
  128 + */
  129 + if(signature.size() < 6){
  130 + return Extrator::SRT;
  131 + }
  132 +
  133 + if(signature.size() == 6 && strcmp(SIGNATURE, signature.c_str()) == 0){
  134 + return Extrator::VTT;
  135 + }else{
  136 + return Extrator::SRT;
  137 + }
  138 +
  139 + if(signature.size() > 6 && signature.find(SIGNATURE) == string::npos){
  140 + return Extrator::SRT;
  141 + }else if(!isspace(signature.at(6))){
  142 + return Extrator::SRT;
  143 + }
  144 +
  145 + delete bffReader;
  146 + delete fileIO;
  147 +
  148 + return Extrator::VTT;
  149 +}
  150 +
  151 +void ServiceWindowGenerationFromSubtitle::setPathLibras() {
  152 + string final_path = "";
  153 + path_libras = new char[MAX_SIZE_PATH];
  154 +
  155 + if(this->service_type == SERVICE_TYPE_SRT)
  156 + final_path.append(this->path_uploads).append("/").append(this->user_id);
  157 + else
  158 + final_path.append(this->path_contents);
  159 +
  160 + final_path.append("/").append(this->user_id).append(".mp4");
  161 + strcpy(this->path_libras, final_path.c_str());
  162 +}
  163 +
  164 +void ServiceWindowGenerationFromSubtitle::setSizeOfSubtitles(int sub_size) {
  165 + numero_legendas = sub_size;
  166 + if (legendas_enviadas >= numero_legendas){
  167 + try{
  168 + renderer->initialize();
  169 + }catch(lavidlib::RuntimeException &ex){
  170 + throw ServiceException(ex.getMessage().c_str());
  171 + }
  172 + }
  173 +}
  174 +
  175 +void ServiceWindowGenerationFromSubtitle::addPTS(int64_t pts){
  176 + vetor_pts->push_back(pts);
  177 +}
  178 +
  179 +void ServiceWindowGenerationFromSubtitle::notifyTranslator(unsigned char* subtitle) {
  180 + const char* constchar = (const char*) subtitle;
  181 + char* legenda_copy = new char[strlen(constchar)+1];
  182 + strcpy(legenda_copy, constchar);
  183 + tradutor->traduz((unsigned char*) legenda_copy);
  184 + free(legenda_copy);
  185 +}
  186 +
  187 +void ServiceWindowGenerationFromSubtitle::notifySubtitle(unsigned char *subtitle, uint64_t pts){
  188 + addPTS(pts);
  189 + if (sub_language == 1) {
  190 + notifyTranslator(subtitle);
  191 + }else{
  192 + string subt(reinterpret_cast<char*>(subtitle));
  193 +
  194 + locale loc;
  195 + string glosa = "";
  196 + for (string::size_type i=0; i< subt.length(); ++i) {
  197 + glosa += std::toupper(subt[i], loc);
  198 + }
  199 + notifyRenderer(glosa);
  200 + }
  201 +}
  202 +
  203 +void ServiceWindowGenerationFromSubtitle::notifyTranslation(char* glosa) {
  204 + string sGlosa(glosa);
  205 + notifyRenderer(sGlosa);
  206 +}
  207 +
  208 +void ServiceWindowGenerationFromSubtitle::notifyRenderer(string glosa) {
  209 + try{
  210 + renderer->receiveGlosa(glosa, vetor_pts->front());
  211 + legendas_enviadas++;
  212 + }catch(lavidlib::RuntimeException &ex){
  213 + throw ServiceException(ex.getMessage().c_str());
  214 + }
  215 + vetor_pts->erase(vetor_pts->begin());
  216 +}
  217 +
  218 +void ServiceWindowGenerationFromSubtitle::notifyEndOfRenderization() {
  219 + if(this->service_type == SERVICE_TYPE_SRT){
  220 + mixer = new Mixer(this->path_input, this->path_libras, this->size, this->position,
  221 + this->transparency, this->user_id, this->path_uploads, this->path_contents);
  222 + mixer->initialize();
  223 + delete mixer;
  224 + }
  225 + this->running = false;
  226 +}
  227 +
  228 +void ServiceWindowGenerationFromSubtitle::notifyEnd(int sub_size) {
  229 + PRINTL(util::_DEBUG, "Service Subtitle recebeu: %d legendas.\n", sub_size);
  230 + try{
  231 + setSizeOfSubtitles(sub_size);
  232 + }catch(ServiceException &ex) {
  233 + finish = true;
  234 + }
  235 +
  236 +}
  237 +
  238 +bool ServiceWindowGenerationFromSubtitle::isRunning() {
  239 + return this->running;
  240 +}
  241 +
  242 +bool ServiceWindowGenerationFromSubtitle::isFinished() {
  243 + return this->finish;
  244 +}
  245 +
  246 +void ServiceWindowGenerationFromSubtitle::initialize() {
  247 + PRINTL(util::_DEBUG, "Service Subtitle Initialize.\n");
  248 + setPathLibras();
  249 +
  250 + Extrator::ExtratorType extrator_t = getExtratorType();
  251 +
  252 + if(extrator_t == Extrator::SRT){
  253 + extratorSRT = (ExtratorSRT*) extrator_factory->getExtrator(Extrator::SRT);
  254 + extratorSRT->addListener(this);
  255 + extratorSRT->setFilePath(path_srt);
  256 + }else{
  257 + extratorVTT = (ExtratorVTT*) extrator_factory->getExtrator(Extrator::VTT);
  258 + extratorVTT->addListener(this);
  259 + extratorVTT->setFilePath(path_srt);
  260 + }
  261 +
  262 + tradutor = new TradutorPortGlosa();
  263 + if (this->sub_language == 1) {
  264 + tradutor->addListener(this);
  265 + }
  266 +
  267 + renderer = new Renderer(this->path_libras ,this->user_id);
  268 + renderer->addListener(this);
  269 +
  270 + try{
  271 + if(extrator_t == Extrator::SRT)
  272 + extratorSRT->initialize();
  273 + else
  274 + extratorVTT->initialize();
  275 + }catch(ExtratorException ex){
  276 + throw ServiceException(ex.getMessage());
  277 + }catch(RuntimeException &ex){
  278 + throw ServiceException(ex.getMessage().c_str());
  279 + }
  280 + this->Start();
  281 +}
  282 +
  283 +void ServiceWindowGenerationFromSubtitle::Run() {
  284 + while(isRunning()){
  285 + usleep(200000);
  286 + }
  287 + finish = true;
  288 +}
... ...
servico/src/serviceWindowGenerationFromText.cpp
1 1 #include "serviceWindowGenerationFromText.h"
2 2  
3   -ServiceWindowGenerationFromText::ServiceWindowGenerationFromText(char* pathFile, int transp, char* id, char* client) {
  3 +ServiceWindowGenerationFromText::ServiceWindowGenerationFromText(char* pathFile, int sublanguage, int transp, char* id, int mode) {
4 4 this->path_input = pathFile;
5 5 this->transparency = transp;
  6 + this->sub_language = sublanguage;
6 7 this->user_id = id;
7   - client_type = client;
  8 + this->exec_mode = mode;
8 9 running = true;
9 10 finish = false;
10 11 numero_legendas = INT_MAX;
11 12 legendas_enviadas = 0;
12   - vetor_pts = new vector<int64_t >();
13   - tradutor = new TradutorPortGlosa();
14 13 extrator_factory = new ExtratorFactory();
15 14 try{
16 15 setPathContents();
... ... @@ -19,102 +18,122 @@ ServiceWindowGenerationFromText::ServiceWindowGenerationFromText(char* pathFile,
19 18 }
20 19 running = true;
21 20 finish = false;
22   - DPRINTF("Done!\n");
  21 + PRINTL(util::_DEBUG, "Service Text Done!\n");
23 22 }
24 23  
25 24 ServiceWindowGenerationFromText::~ServiceWindowGenerationFromText() {
26   - free(vetor_pts);
27 25 if (tradutor) delete tradutor;
28   - if (sincronizador) delete sincronizador;
  26 + if (renderer) delete renderer;
29 27 if (extratorTXT)delete extratorTXT;
30 28 if (extrator_factory) delete extrator_factory;
31   - DDDPRINTF("Service Text finalized!\n");
  29 + PRINTL(util::_DEBUG, "Service Text finalized!\n");
32 30 }
33 31  
34 32 void ServiceWindowGenerationFromText::setPathContents() {
35   - if(strcmp(client_type,DEVELOPER) == 0){
36   - this->path_contents = PATH_DEVEL;
37   - this->path_uploads = PATH_DEVEL_UPLOADS;
38   - }else if(strcmp(client_type, PRODUCTION) == 0){
39   - ifstream conf_file(PATH_CONF_FILE, ifstream::binary);
40   - parsingSuccessful = reader.parse(conf_file, root);
41   - if(!parsingSuccessful){
42   - throw new RuntimeException("Fail to parsing param.json");
43   - }
44   - string attr = root.get("storage", PATH_VBOX_UPLOADS).asString();
45   - this->path_contents = new char[MAX_SIZE_PATH];
46   - strcpy(this->path_contents, attr.c_str());
47   - this->path_uploads = PATH_VBOX_UPLOADS;
48   - }else{
49   - throw ServiceException("Invalid client!");
  33 + switch(exec_mode) {
  34 + case DEVELOPER:
  35 + {
  36 + char* vStorage;
  37 + vStorage = getenv("VLSTORAGE");
  38 + if(vStorage != NULL){
  39 + this->path_contents = vStorage;
  40 + PRINTL(util::_DEBUG, "Path definido pelo desenvolvedor:\n%s\n", path_contents);
  41 + }else{
  42 + this->path_contents = (char*) PATH_DEVEL_CONTENTS;
  43 + }
  44 + }break;
  45 +
  46 + case PRODUCTION:
  47 + {
  48 + ifstream conf_file(PATH_CONF_FILE, ifstream::binary);
  49 + parsingSuccessful = reader.parse(conf_file, root);
  50 +
  51 + if(parsingSuccessful) {
  52 + string attr = "vlibras_user/";
  53 + attr += root.get("storage", PATH_VBOX_UPLOADS).asString();
  54 + this->path_contents = new char[MAX_SIZE_PATH];
  55 + strcpy(this->path_contents, attr.c_str());
  56 + }else{
  57 + conf_file.close();
  58 + Logging::instance()->writeLog("Erro com a leitura do arquivo params.json");
  59 + throw new RuntimeException("Fail to parsing params.json");
  60 + }
  61 + conf_file.close();
  62 + }break;
  63 +
  64 + case TESTER:
  65 + {
  66 + this->path_contents = (char*) PATH_TESTER_CONTENTS;
  67 + }break;
  68 +
  69 + default:
  70 + throw ServiceException("Invalid execution mode!");
50 71 }
51 72 }
52 73  
53 74 void ServiceWindowGenerationFromText::setPathLibras() {
54   - char* final_path = new char[MAX_SIZE_PATH];
55   - strcpy(final_path, this->path_uploads);
56   - strcat(final_path, this->user_id);
57   - strcat(final_path, "/video_libras.ts");
58   -
59   - this->path_libras = final_path;
  75 + string final_path = "";
  76 + path_libras = new char[MAX_SIZE_PATH];
  77 + final_path.append(this->path_contents).append("/").
  78 + append(this->user_id).append(".mp4");
  79 + strcpy(this->path_libras, final_path.c_str());
60 80 }
61 81  
62   -void ServiceWindowGenerationFromText::setBackground() {
63   - if(this->transparency == 0) { //pega dicionario com BackGround opaco
64   - char* dicPath;
65   - dicPath = getenv("DIC_LIBRAS");
66   - if(dicPath != NULL)
67   - sincronizador = new Synchronizer(dicPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
68   - else
69   - sincronizador = new Synchronizer(BASEDIR, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
70   -
71   - } else if(this->transparency == 1) { //pega dicionario com BackGround transparente
72   - char* dicTPath;
73   - dicTPath = getenv("DICTRANSP_LIBRAS");
74   - if(dicTPath != NULL)
75   - sincronizador = new Synchronizer(dicTPath, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
76   - else{
77   - sincronizador = new Synchronizer(BASEDIRTRANSP, EXTENSAO_DICIONARIO, this->path_libras, this->transparency);
  82 +void ServiceWindowGenerationFromText::setSizeOfSubtitles(int sub_size) {
  83 + numero_legendas = sub_size;
  84 + if (legendas_enviadas >= numero_legendas){
  85 + try{
  86 + renderer->initialize();
  87 + }catch(lavidlib::RuntimeException &ex){
  88 + throw ServiceException(ex.getMessage().c_str());
78 89 }
79 90 }
80 91 }
81 92  
82   -void ServiceWindowGenerationFromText::setSizeOfSubtitles(int sub_size) {
83   - numero_legendas = sub_size;
84   - if (legendas_enviadas >= numero_legendas)
85   - sincronizador->stop();
86   -}
87   -
88 93 void ServiceWindowGenerationFromText::notifyTranslator(unsigned char* text) {
89   - tradutor->traduz(text);
  94 + tradutor->traduz(text);
90 95 }
91 96  
92   -void ServiceWindowGenerationFromText::notifyLine(unsigned char* line) {
93   - notifyTranslator(line);
  97 +void ServiceWindowGenerationFromText::notifyLine(unsigned char* line){
  98 + if (sub_language == 1)
  99 + notifyTranslator(line);
  100 + else{
  101 + string text(reinterpret_cast<char*>(line));
  102 +
  103 + locale loc;
  104 + string glosa = "";
  105 + for (string::size_type i=0; i< text.length(); ++i) {
  106 + glosa += std::toupper(text[i], loc);
  107 + }
  108 + notifyRenderer(glosa);
  109 + }
94 110 }
95 111  
96   -void ServiceWindowGenerationFromText::notifyEndOfSynchronization() {
97   - transcodeVideoToMp4();
98   - this->running = false;
  112 +void ServiceWindowGenerationFromText::notifyTranslation(char* glosa) {
  113 + string sGlosa(glosa);
  114 + notifyRenderer(sGlosa);
99 115 }
100 116  
101   -void ServiceWindowGenerationFromText::notifyTranslation(vector<string> * glosas) {
102   - for (int i = 0; i < glosas->size(); i++) {
103   - locale loc;
104   - string glosa_lower = "";
105   - for (int k = 0; k < glosas->at(i).length(); k++){
106   - glosa_lower += std::tolower(glosas->at(i).at(k), loc);
107   - }
108   - sincronizador->recebeglosa(glosa_lower, 1000);
  117 +void ServiceWindowGenerationFromText::notifyRenderer(string glosa) {
  118 + try{
  119 + renderer->receiveGlosa(glosa, (int64_t) -1);
  120 + legendas_enviadas++;
  121 + }catch(lavidlib::RuntimeException &ex){
  122 + throw ServiceException(ex.getMessage().c_str());
109 123 }
110   - sincronizador->stop();
111   - legendas_enviadas++;
112 124 }
113 125  
  126 +void ServiceWindowGenerationFromText::notifyEndOfRenderization() {
  127 + this->running = false;
  128 +}
114 129  
115 130 void ServiceWindowGenerationFromText::notifyEnd(int line_size) {
116   - DPRINTF("Service Text recebeu: %d linhas.\n", line_size);
117   - setSizeOfSubtitles(line_size);
  131 + PRINTL(util::_DEBUG, "Service Text recebeu: %d linhas.\n", line_size);
  132 + try{
  133 + setSizeOfSubtitles(line_size);
  134 + }catch(ServiceException &ex) {
  135 + finish = true;
  136 + }
118 137 }
119 138  
120 139 bool ServiceWindowGenerationFromText::isRunning() {
... ... @@ -126,43 +145,33 @@ bool ServiceWindowGenerationFromText::isFinished() {
126 145 }
127 146  
128 147 void ServiceWindowGenerationFromText::initialize() {
129   - DPRINTF("Service Text Initialize.\n");
130   - extratorTXT = (ExtratorTXT*) extrator_factory->getExtrator(Extrator::TXT);
  148 + PRINTL(util::_DEBUG, "Service Text Initialize.\n");
  149 + setPathLibras();
  150 + extratorTXT = (ExtratorTXT*) extrator_factory->getExtrator(Extrator::TXT);
131 151 extratorTXT->addListener(this);
132 152 extratorTXT->setFilePath(path_input);
133 153  
134   - setPathLibras();
135   -
136   - tradutor->addListener(this);
137   -
138   - setBackground();
  154 + tradutor = new TradutorPortGlosa();
  155 + if (this->sub_language == 1) {
  156 + tradutor->addListener(this);
  157 + }
139 158  
140   - uint64_t pcr_base = (uint64_t) 1000; //FIXME: macro
141   - sincronizador->setPCRBase(pcr_base);
142   - sincronizador->addListener(this);
143   - sincronizador->Start();
  159 + renderer = new Renderer(this->path_libras, this->user_id);
  160 + renderer->addListener(this);
144 161  
145 162 try{
146   - extratorTXT->initialize();
  163 + extratorTXT->initialize();
147 164 }catch(ExtratorException ex){
148   - throw ServiceException(ex.getMessage());
  165 + throw ServiceException(ex.getMessage().c_str());
  166 + }catch(RuntimeException &ex){
  167 + throw ServiceException(ex.getMessage().c_str());
149 168 }
150 169 this->Start();
151 170 }
152 171  
153   -void ServiceWindowGenerationFromText::transcodeVideoToMp4(){
154   - DPRINTF("[AGUARDE] Transcodificando o vídeo de Libras...\n");
155   - string command = "ffmpeg -i ";
156   - command.append(path_libras)
157   - .append(" -qscale 0 -strict experimental -vcodec libx264 -preset fast -r 30 ").append(" -v quiet ")
158   - .append(path_contents).append(user_id).append(".mp4");
159   - //printf("[INFO]: Transcodification command -> %s\n", command.c_str());
160   - system(command.c_str());
161   -}
162   -
163 172 void ServiceWindowGenerationFromText::Run(){
164 173 while(isRunning()){
165 174 usleep(200000);
166 175 }
167 176 finish = true;
168   -}
169 177 \ No newline at end of file
  178 +}
... ...
synchronizer/src/include/listenerSynchronizer.h
... ... @@ -1,14 +0,0 @@
1   -#ifndef _LISTENER_SYNCHRONIZER_H
2   -#define _LISTENER_SYNCHRONIZER_H
3   -
4   -#include <string>
5   -#include <stdint.h>
6   -
7   -using namespace std;
8   -
9   -class ListenerSynchronizer {
10   -public:
11   - virtual void notifyEndOfSynchronization() = 0;
12   -};
13   -
14   -#endif
15 0 \ No newline at end of file
synchronizer/src/include/synchronizer.h
... ... @@ -1,126 +0,0 @@
1   -#ifndef SYNCHRONIZER_H
2   -#define SYNCHRONIZER_H
3   -
4   -#include <stdio.h>
5   -#include <stdlib.h>
6   -#include <string.h>
7   -#include <errno.h>
8   -#include <time.h>
9   -#include <unistd.h>
10   -#include <signal.h>
11   -#include <fcntl.h>
12   -#include <sys/time.h>
13   -#include <arpa/inet.h>
14   -#include <sys/socket.h>
15   -#include <vector>
16   -#include <list>
17   -#include <iostream>
18   -#include <fstream>
19   -#include "dprintf.h"
20   -#include "jmutex.h"
21   -#include "jthread.h"
22   -#include "listenerSynchronizer.h"
23   -//#include "httpstreamer.h"
24   -
25   -#define VIDEO_PADRAO "vlibras_user/dicionario_libras/poseneutra.ts"
26   -#define VIDEOTRANSP_PADRAO "vlibras_user/dicionarioTransp_libras/poseneutra.ts"
27   -
28   -//DICIONARIO 30 fps
29   -#define PCRPID 256
30   -#define PESPID 256
31   -
32   -//DICIONARIO 45 fps
33   -//#define PCRPID 4097
34   -//#define PESPID 4113
35   -
36   -using namespace jthread;
37   -using namespace std;
38   -
39   -class Synchronizer : public jthread::Thread {
40   -
41   -private:
42   - bool hastext;
43   - int taxa;
44   - int filefd;
45   - vector <char*> *videos;
46   - int devicetv;
47   -
48   - uint64_t pcrBaseGeral;
49   - uint64_t ultimoPCRBase;
50   - uint64_t ultimoPCRBaseMod;
51   - int64_t pcr_inicial;
52   - int mediaDiferencaPCR;
53   - int contagemPCR;
54   -
55   - ofstream escreveAux;
56   - char* extensao;
57   - char* baseDir;
58   -
59   - int64_t tempo_poseneutra;
60   - vector <int64_t> *vector_pts;
61   - int flagPrimeiroArquivo;
62   -
63   - list<ListenerSynchronizer*> * listeners;
64   - Mutex* mutex_sync;
65   - Mutex* mutexi;
66   -
67   - char* path_libras;
68   - int transparency;
69   -
70   - int count_tasks;
71   - bool service_running;
72   -
73   -
74   -public:
75   - Synchronizer();
76   - Synchronizer(/*int64_t pcr_inicial, */char*baseDir, char* extensao, char* path_libras, int transparency);
77   - virtual ~Synchronizer();
78   -
79   - void setPCRBase(uint64_t pcr_base);
80   -
81   - void Run();
82   - void stop();
83   -
84   - void soletraGlosa(string glosa, int64_t pts);//em fase de teste
85   - void recebeglosa(char * video, int tam, int64_t pts);
86   - void recebeglosa(string glosa, int64_t pts);
87   - char * getproximoarquivo();
88   -
89   - void msleep(long tsleep, long *desconto);
90   -
91   - int gettaxa();
92   - int64_t getMilisegundos();
93   -
94   - void settaxa(int taxa);
95   -
96   - vector <char*> * getVideos();
97   -
98   - void analisaPCR(unsigned char * pacote);
99   - void analisaPTSDTS(unsigned char *pacote);
100   - int getPid(unsigned char *pacote);
101   - bool contemAF(unsigned char *pacote);
102   - int getTamanhoAF(unsigned char *pacote);
103   - bool contemPCR(unsigned char *pacote);
104   - uint64_t retornaPCRBase(unsigned char *pacote);
105   - void setPCRBase(unsigned char *pacote, uint64_t pcrbase);
106   - bool contemPayloadStartIndicator(unsigned char *pacote);
107   - bool contemPayloadData(unsigned char *pacote);
108   - bool verificaPESStartCode(unsigned char *PESPacket);
109   - bool verificaPESStreamID(unsigned char *PESPacket);
110   - bool contemPTS(unsigned char *PESPacket);
111   - bool contemDTS(unsigned char *PESPacket);
112   - uint64_t retornaPTS(unsigned char *PESPacket);
113   - uint64_t retornaDTS(unsigned char *PESPacket);
114   - void setNovoPTS(unsigned char *pacote, uint64_t PTS);
115   - void setNovoDTS(unsigned char *pacote, uint64_t DTS);
116   - void escrevePacote(char *pacote);
117   - int escrevePacote(int * descritor, char *pacote, int size);
118   -
119   - virtual void addListener(ListenerSynchronizer* listener);
120   - virtual void removeListener(ListenerSynchronizer* listener);
121   - virtual void notifyListeners();
122   -
123   -};
124   -
125   -
126   -#endif /* SYNCHRONIZER_H */
synchronizer/src/synchronizer.cpp
... ... @@ -1,568 +0,0 @@
1   -#include "synchronizer.h"
2   -
3   -Synchronizer::Synchronizer() {
4   - baseDir = (char*) "vlibras_user/dicionario_libras/";
5   - extensao = (char*) ".ts";
6   - filefd = 0;
7   - videos = new vector <char*> ();
8   - vector_pts = new vector <int64_t > ();
9   - this->mutexi = new Mutex();
10   -
11   - this->baseDir = new char[strlen(baseDir) + 1];
12   - strcpy(this->baseDir, baseDir);
13   -
14   - this->extensao = new char[strlen(extensao) + 1];
15   - strcpy(this->extensao, extensao);
16   - flagPrimeiroArquivo = 1;
17   - listeners = new list<ListenerSynchronizer*>();
18   - this->path_libras = path_libras;
19   - DPRINTF("Done!\n")
20   -}
21   -
22   -Synchronizer::Synchronizer(/*int64_t pcr_inicial, */char* baseDir, char* extensao, char* path_libras, int transparency) {
23   -
24   - hastext = true;
25   - count_tasks = 0; // Usado no teste de Eduardo!
26   - service_running = true;
27   -
28   - this->pcr_inicial = -1;
29   - this->tempo_poseneutra = 120000;
30   -
31   - this->transparency = transparency;
32   -
33   - //cout << "\n\nTransparencia: " << this->transparency << "\n";
34   -
35   - this->baseDir = new char[strlen(baseDir) + 1];
36   - strcpy(this->baseDir, baseDir);
37   -
38   - //cout << "\n\n#######BASEDIR: " << this->baseDir << "\n";
39   -
40   - this->extensao = new char[strlen(extensao) + 1];
41   - strcpy(this->extensao, extensao);
42   -
43   - filefd = 0;
44   - videos = new vector <char*> ();
45   - pcrBaseGeral = 0;
46   - ultimoPCRBase = 0;
47   - mediaDiferencaPCR = 0;
48   - contagemPCR = 0;
49   - vector_pts = new vector <int64_t > ();
50   - flagPrimeiroArquivo = 1;
51   - listeners = new list<ListenerSynchronizer*>();
52   - this->path_libras = new char[strlen(path_libras) + 1];
53   - strcpy(this->path_libras, path_libras);
54   - //cout << "-> path libras sync: " << path_libras << endl;
55   - this->mutex_sync = new Mutex();
56   - this->mutexi = new Mutex();
57   -
58   - DPRINTF("Done!\n")
59   -}
60   -
61   -Synchronizer::~Synchronizer() {
62   - free(videos);
63   - listeners->clear();
64   - delete listeners;
65   - if (escreveAux.is_open()) escreveAux.close();
66   - DDDPRINTF("Synchronizer finalized!\n");
67   -
68   -}
69   -
70   -string toLower(string strr) {
71   - char str[100];
72   - string ret;
73   - strcpy(str, strr.c_str());
74   - int differ = 'A' - 'a';
75   - char ch;
76   - int ii = strlen(str);
77   - for (int i = 0; i < ii; i++) {
78   - strncpy(&ch, str + i, 1);
79   - if (ch >= 'A' && ch <= 'Z') {
80   - ch = ch - differ;
81   - memcpy(str + i, &ch, 1);
82   - }
83   - }
84   - ret = str;
85   - return ret;
86   -}
87   -
88   -void Synchronizer::setPCRBase(uint64_t pcr_base){
89   - this->pcr_inicial = pcr_base;
90   -}
91   -
92   -char* converteString(string palavra) {
93   -
94   - const char* aux = new char[palavra.size()];
95   - aux = palavra.c_str();
96   - char * aux2 = (char*) aux;
97   -
98   - return aux2;
99   -}
100   -
101   -/* Método utilizado pelos serviços (Services Generation) para informar que
102   - este processo pode ser finalizado após a demanda atual, isto é, depois
103   - que terminar de gerar os vídeos que estão na fila.
104   - */
105   -void Synchronizer::stop() {
106   - //printf("> O Synchronizer recebeu a mensagem de que pode terminar a execução\n");
107   - service_running = false;
108   -}
109   -
110   -int Synchronizer::gettaxa() {
111   - return taxa;
112   -}
113   -
114   -void Synchronizer::settaxa(int taxa) {
115   - this->taxa = taxa;
116   -}
117   -
118   -vector <char*> * Synchronizer::getVideos() {
119   - return videos;
120   -}
121   -
122   -/* Trata a glosa de modo single, ou seja, havendo sinal ou soletrando,
123   - este método é chamado individualmente em cada sinal correspondente.
124   - */
125   -void Synchronizer::recebeglosa(char * video, int tam, int64_t pts) {
126   - mutexi->Lock();
127   - char *video_copy = new char [tam + 1];
128   - strcpy(video_copy, video);
129   - videos->push_back(video_copy);
130   - count_tasks++;
131   - vector_pts->push_back(pts);
132   - mutexi->Unlock();
133   -}
134   -
135   -int64_t Synchronizer::getMilisegundos() {
136   - struct timeval tempo;
137   - gettimeofday(&tempo, NULL);
138   - return (int64_t) tempo.tv_sec * 1000 + tempo.tv_usec / 1000;
139   -}
140   -
141   -void Synchronizer::msleep(long tsleep, long *desconto) {
142   - struct timeval tempo;
143   - long deltaTAux = 0;
144   - long tusleep = 0;
145   - int64_t tAux = 0, tAux2 = 0;
146   -
147   - tsleep -= *desconto;
148   -
149   - tusleep = tsleep / 1000;
150   -
151   - gettimeofday(&tempo, NULL);
152   - tAux = tempo.tv_sec * 1000 + tempo.tv_usec / 1000;
153   -
154   - while ((tsleep > 0) && (deltaTAux <= tsleep)) {
155   - usleep(tusleep);
156   -
157   - gettimeofday(&tempo, NULL);
158   - tAux2 = tempo.tv_sec * 1000 + tempo.tv_usec / 1000;
159   -
160   - deltaTAux = (tAux2 - tAux)*1000;
161   - }
162   -
163   - //desconto = (deltaTAux - (tsleep/1000))*1000;
164   - *desconto = (deltaTAux - tsleep);
165   -}
166   -
167   -char* proximo = new char[1000];
168   -char* proximo2 = new char[1000];
169   -
170   -char * Synchronizer::getproximoarquivo() {
171   - char * video = new char[1000];
172   - string s1, s2, s3;
173   - video = NULL;
174   - list<char *>::iterator it;
175   - //proximo = NULL;
176   -
177   - if (videos->size() == 0) {
178   - if(this->transparency == 0){
179   - return VIDEO_PADRAO;
180   - }else{
181   - return VIDEOTRANSP_PADRAO;
182   - }
183   - }
184   -
185   - mutexi->Lock();
186   - video = videos->front();
187   -
188   - videos->erase(videos->begin());
189   - mutexi->Unlock();
190   -
191   - if (video == NULL) {
192   - if(this->transparency == 0){
193   - return VIDEO_PADRAO;
194   - }else{
195   - return VIDEOTRANSP_PADRAO;
196   - }
197   - }else{
198   - return video;
199   - }
200   -}
201   -
202   -void Synchronizer::analisaPCR(unsigned char *pacote) {
203   - // preciso ter o PID de PCR
204   - if ((getPid(pacote) != PCRPID) || (!contemAF(pacote))
205   - //if ((!contemAF(pacote))
206   - || (getTamanhoAF(pacote) == 0) || (!contemPCR(pacote))) {
207   -
208   -
209   - if (contemPCR(pacote)){
210   - //printf("Encontrei PCR - PID:%d\n", getPid(pacote));
211   -
212   - }
213   - return;
214   - }
215   -
216   - uint64_t pcrBase = retornaPCRBase(pacote);
217   -
218   - if (mediaDiferencaPCR != 0 && contagemPCR == 0) { // nesse caso esse eh o primeiro PCR de um novo video
219   - //printf("Encontrei o primeiro PCR de um video!\n");
220   - setPCRBase(pacote, pcrBaseGeral + mediaDiferencaPCR); // tem que multiplicar por 2 o mediaDiferencaPCR?
221   - ultimoPCRBaseMod = pcrBaseGeral + mediaDiferencaPCR;
222   - mediaDiferencaPCR = 0;
223   - } else if (mediaDiferencaPCR == 0 && contagemPCR == 0 && flagPrimeiroArquivo == 1) {
224   - flagPrimeiroArquivo = 0;
225   - setPCRBase(pacote, pcr_inicial + mediaDiferencaPCR); // tem que multiplicar por 2 o mediaDiferencaPCR?
226   - contagemPCR++;
227   - sleep(1);
228   - ultimoPCRBaseMod = pcr_inicial + mediaDiferencaPCR;
229   -
230   - }
231   - else {
232   -
233   - mediaDiferencaPCR = (ultimoPCRBase > 0) ? pcrBase - ultimoPCRBase : 0;
234   - contagemPCR++;
235   -
236   - //if (pcrBaseGeral != 0) { // se nao for o primeiro video //2 - Mudei para o serviço
237   - setPCRBase(pacote, ultimoPCRBaseMod + mediaDiferencaPCR);
238   - ultimoPCRBaseMod += mediaDiferencaPCR;
239   - //}
240   - }
241   -
242   - ultimoPCRBase = pcrBase;
243   -
244   -}
245   -
246   -void Synchronizer::analisaPTSDTS(unsigned char *pacote) {
247   - int inicioPESData = 4;
248   - if (contemAF(pacote)) inicioPESData += getTamanhoAF(pacote) + 1;
249   -
250   - if ((!verificaPESStartCode(pacote + inicioPESData)) ||
251   - (!verificaPESStreamID(pacote + inicioPESData)) ||
252   - (!contemPTS(pacote + inicioPESData))) {
253   -
254   - return;
255   - }
256   -
257   - uint64_t PTS = retornaPTS(pacote + inicioPESData);
258   - int diferenca = PTS - ultimoPCRBase;
259   - // confirmar se isso aqui SEMPRE eh chamado depois de pelo menos um PCR ser encontrado, principalmente
260   - // no inicio do video
261   - if (ultimoPCRBaseMod != 0)
262   - setNovoPTS(pacote + inicioPESData, ultimoPCRBaseMod + diferenca);
263   - else
264   - setNovoPTS(pacote + inicioPESData, pcrBaseGeral + diferenca);
265   -
266   - if (!contemDTS(pacote + inicioPESData)) return;
267   -
268   - uint64_t DTS = retornaDTS(pacote + inicioPESData);
269   - diferenca = DTS - ultimoPCRBase;
270   -
271   - if (ultimoPCRBaseMod != 0)
272   - setNovoDTS(pacote + inicioPESData, ultimoPCRBaseMod + diferenca);
273   - else
274   - setNovoDTS(pacote + inicioPESData, pcrBaseGeral + diferenca);
275   -}
276   -
277   -int Synchronizer::getPid(unsigned char *pacote) {
278   - return ((pacote[1] & 0x1F) << 8) | pacote[2];
279   -}
280   -
281   -bool Synchronizer::contemAF(unsigned char *pacote) {
282   - return pacote[3] & 0x20;
283   -}
284   -
285   -int Synchronizer::getTamanhoAF(unsigned char *pacote) {
286   - return pacote[4];
287   -}
288   -
289   -bool Synchronizer::contemPCR(unsigned char *pacote) {
290   - return pacote[5] & 0x10;
291   -}
292   -
293   -uint64_t Synchronizer::retornaPCRBase(unsigned char *pacote) {
294   - uint64_t pcrbase = 0;
295   -
296   - pcrbase = (uint64_t) pacote[6] << 25 | pacote[7] << 17 | pacote[8] << 9
297   - | pacote[9] << 1 | (pacote[10] & 0x80) >> 7;
298   -
299   - return pcrbase;
300   -}
301   -
302   -void Synchronizer::setPCRBase(unsigned char *pacote, uint64_t pcrbase) {
303   - pacote[6] = pcrbase >> 25;
304   - pacote[7] = pcrbase >> 17;
305   - pacote[8] = pcrbase >> 9;
306   - pacote[9] = pcrbase >> 1;
307   - if ((pcrbase << 63) != 0)
308   - pacote[10] = pacote[10] | 0x80;
309   - else
310   - pacote[10] = pacote[10] & 0x7F;
311   -}
312   -
313   -bool Synchronizer::contemPayloadStartIndicator(unsigned char *pacote) {
314   - return pacote[1] & 0x40;
315   -}
316   -
317   -bool Synchronizer::contemPayloadData(unsigned char *pacote) {
318   - return pacote[3] & 0x10;
319   -}
320   -
321   -bool Synchronizer::verificaPESStartCode(unsigned char *PESPacket) {
322   - return (((PESPacket[0] << 16) | (PESPacket[1] << 8) | (PESPacket[2]))
323   - == 0x000001) ? 1 : 0;
324   -}
325   -
326   -bool Synchronizer::verificaPESStreamID(unsigned char *PESPacket) {
327   - int stream_id = PESPacket[3];
328   -
329   - return ((stream_id != 0xBC) && (stream_id != 0xBE) && (stream_id != 0xBF)
330   - && (stream_id != 0xF0) && (stream_id != 0xF1) && (stream_id != 0xFF)
331   - && (stream_id != 0xF2) && (stream_id != 0xF8));
332   -}
333   -
334   -bool Synchronizer::contemPTS(unsigned char *PESPacket) {
335   - //printf("\nTem PTS: %d\n", PESPacket[7] & 0x80);
336   - return PESPacket[7] & 0x80;
337   -}
338   -
339   -bool Synchronizer::contemDTS(unsigned char *PESPacket) {
340   - return PESPacket[7] & 0x40;
341   -}
342   -
343   -uint64_t Synchronizer::retornaPTS(unsigned char *PESPacket) {
344   - uint64_t PTS = (uint64_t) ((PESPacket[9] & 0x0E) >> 1) << 30 |
345   - (PESPacket[10] << 22) |
346   - (((PESPacket[11] & 0xFE) >> 1) << 15) |
347   - (PESPacket[12] << 7) |
348   - ((PESPacket[13] & 0xFE) >> 1);
349   - return PTS;
350   -}
351   -
352   -uint64_t Synchronizer::retornaDTS(unsigned char *PESPacket) {
353   - uint64_t DTS = (uint64_t) ((PESPacket[14] & 0x0E) >> 1) << 30 |
354   - (PESPacket[15] << 22) |
355   - (((PESPacket[16] & 0xFE) >> 1) << 15) |
356   - (PESPacket[17] << 7) |
357   - ((PESPacket[18] & 0xFE) >> 1);
358   - return DTS;
359   -}
360   -
361   -void Synchronizer::setNovoPTS(unsigned char *pacote, uint64_t PTS) {
362   - pacote[9] = pacote[9] & 0xF1;
363   - pacote[9] = pacote[9] | ((PTS >> 30) << 1);
364   - pacote[10] = PTS >> 22;
365   - pacote[11] = pacote[11] & 0x1;
366   - pacote[11] = pacote[11] | ((PTS >> 15) << 1);
367   - pacote[12] = PTS >> 7;
368   - pacote[13] = pacote[13] & 0x1;
369   - pacote[13] = pacote[13] | PTS << 1;
370   -}
371   -
372   -void Synchronizer::setNovoDTS(unsigned char *pacote, uint64_t DTS) {
373   - pacote[14] = pacote[14] & 0xF1;
374   - pacote[14] = pacote[14] | ((DTS >> 30) << 1);
375   - pacote[15] = DTS >> 22;
376   - pacote[16] = pacote[16] & 0x1;
377   - pacote[16] = pacote[16] | ((DTS >> 15) << 1);
378   - pacote[17] = DTS >> 7;
379   - pacote[18] = pacote[18] & 0x1;
380   - pacote[18] = pacote[18] | DTS << 1;
381   -}
382   -
383   -void Synchronizer::escrevePacote(char *pacote) {
384   - if (!escreveAux.is_open()) {
385   - escreveAux.open(this->path_libras, ios::out | ios::binary);
386   -
387   - }
388   - //printf("tamanho do pacote = %d\n\n", strlen(pacote));
389   - escreveAux.write(pacote, 188*70);
390   - //printf(" OK!\n\n");
391   -
392   -}
393   -
394   -int Synchronizer::escrevePacote(int * descritor, char *pacote, int size) {
395   - if (*descritor < 0) {// ainda não abri
396   - *descritor = open(this->path_libras, O_WRONLY | O_CREAT, 0660);
397   - if (descritor < 0) {
398   - printf("Can't open output file\n");
399   - return -1;
400   - }
401   - }
402   - return write(*descritor, pacote, size);
403   -}
404   -
405   -void ouch(int sig) {
406   - printf("\nSinal Capturado %d", sig);
407   - (void) signal(SIGPIPE, SIG_DFL);
408   -
409   -}
410   -
411   -void Synchronizer::soletraGlosa(string glosa, int64_t pts) {
412   -
413   - //string path = (string) baseDir + glosa + (string) extensao;
414   - //cout << "\n***Glosa NAO ENCONTRADA: " << glosa << endl;
415   - /*mutexi->Lock();
416   - int file = open(converteString(path), O_RDONLY);
417   - mutexi->Unlock();*/
418   - //if (file != NULL) {
419   - for (int i = 0; i < glosa.length(); i++) {
420   - if (glosa[i] == '[')
421   - return;
422   - char c = glosa[i];
423   - if (c >= 97 && c <= 122) {
424   - string path2 = (string) baseDir + glosa[i] + (string) extensao;
425   - char* path2_char = converteString(path2);
426   - recebeglosa(converteString(path2), strlen(path2_char), pts);
427   - }
428   - }
429   - //close(file);
430   - //} else {
431   - // printf("*** ERRO ao abrir o arquivo.");
432   - //}
433   -
434   -}
435   -
436   -/* Utilizado no teste de Eduardo */
437   -void Synchronizer::recebeglosa(string glosa, int64_t pts) {
438   - glosa = toLower(glosa);
439   -
440   - size_t found;
441   - found=glosa.rfind("dl");
442   - if (found == 0)
443   - glosa = glosa.substr(2, glosa.length());
444   -
445   - string path = (string) baseDir + glosa.c_str() + (string) extensao;
446   - char* urlchar = converteString(path);
447   - mutexi->Lock();
448   - FILE *f = fopen(urlchar, "r");
449   - mutexi->Unlock();
450   - if (f == NULL) {
451   - soletraGlosa(glosa, pts);
452   - } else {
453   - fclose(f);
454   - recebeglosa(urlchar, strlen(urlchar), pts);
455   - }
456   -
457   -}
458   -
459   -
460   -void Synchronizer::addListener(ListenerSynchronizer* listener) {
461   - listeners->push_back(listener);
462   -}
463   -
464   -void Synchronizer::removeListener(ListenerSynchronizer* listener) {
465   - listeners->remove(listener);
466   -}
467   -
468   -void Synchronizer::notifyListeners() {
469   - for (list<ListenerSynchronizer*>::iterator i = listeners->begin(); i != listeners->end(); i++) {
470   - (*i)->notifyEndOfSynchronization();
471   - }
472   -}
473   -
474   -void Synchronizer::Run() {
475   -
476   - pcrBaseGeral = ultimoPCRBase = mediaDiferencaPCR = contagemPCR = ultimoPCRBaseMod = 0;
477   - int64_t t0 = 0, tf = 0;
478   - int64_t pts_run;
479   - int cnt, finalcnt, bitrate = 1121600, deltaT = 0;
480   - int bufferSize = 7 * 188;
481   - char * buff = new char[bufferSize];
482   -
483   - char * arquivo;
484   -
485   - while (videos->size() == 0){
486   - usleep(50000); //50ms
487   - }
488   -
489   - if(this->transparency == 0)
490   - arquivo = VIDEO_PADRAO;
491   - else
492   - arquivo = VIDEOTRANSP_PADRAO;
493   -
494   - mutexi->Lock();
495   - filefd = open(arquivo, O_RDONLY);
496   - mutexi->Unlock();
497   -
498   - if (filefd < 0)
499   - cout << "NAO CONSEGUI ABRIR O ARQUIVO2 - " << arquivo << endl;
500   -
501   - (void) signal(SIGPIPE, ouch);
502   -
503   - int videos_processed = 0;
504   -
505   - int desc_out = -1;
506   -
507   - while (videos_processed <= count_tasks || service_running) {
508   -
509   - cnt = read(filefd, buff, bufferSize);
510   -
511   - // atualiza os valores de PCR e PTS/DTS para cada video
512   - for (int i = 0; i < cnt / 188; i++) {
513   - analisaPCR((unsigned char*) buff + (188 * i));
514   - analisaPTSDTS((unsigned char*) buff + (188 * i));
515   - }
516   -
517   - escrevePacote(&desc_out,buff,cnt);
518   - free(buff);
519   - buff = new char[bufferSize];
520   -
521   - finalcnt = cnt;
522   - if (finalcnt == 0) {
523   -
524   - while (videos->size() == 0 && service_running) { // esperando arquivos do serviço
525   - usleep(10000);
526   - }
527   -
528   - pts_run = vector_pts->front();
529   - if (ultimoPCRBaseMod + tempo_poseneutra < pts_run) {
530   - if(this->transparency == 0){
531   - arquivo = VIDEO_PADRAO;
532   - }else{
533   - arquivo = VIDEOTRANSP_PADRAO;
534   - }
535   -
536   - }else {
537   - if (vector_pts->size() > 0) {
538   - vector_pts->erase(vector_pts->begin());
539   - arquivo = getproximoarquivo();
540   - }
541   - videos_processed++;
542   - }
543   -
544   - close(filefd);
545   - filefd = open(arquivo, O_RDONLY);
546   - if (ultimoPCRBase != 0) {
547   - if (ultimoPCRBaseMod != 0) {
548   - pcrBaseGeral = ultimoPCRBaseMod;
549   - } else {
550   - pcrBaseGeral = ultimoPCRBase;
551   - }
552   - contagemPCR = 0;
553   - ultimoPCRBaseMod = 0;
554   - }
555   - } else if (finalcnt == -1) {
556   - printf("Erro: Finalizando Sincronizador!\n");
557   - this->stop();
558   - }
559   - } // Fim do while!
560   -
561   - //fsync(desc_out);
562   - close(filefd);
563   - close(desc_out);
564   - notifyListeners();
565   -
566   -}
567   -
568   -
tradutor/src/include/listenerTradutor.h
1   -/*
2   - * File: ouvinteTradutor.h
3   - * Author: derzu
4   - *
5   - * Created on 2 de Fevereiro de 2010, 15:48
  1 +/**
  2 + * \file listenerTradutor.h
  3 + *
  4 + * \author Derzu Omaia
  5 + * \date 02/02/2010
6 6 */
  7 +
7 8 #ifndef _LISTENERTRADUTOR_H
8 9 #define _LISTENERTRADUTOR_H
9 10  
... ... @@ -14,11 +15,7 @@ namespace Tradutor {
14 15  
15 16 class ListenerTradutor {
16 17 public:
17   - //OuvinteTradutor();
18   - //virtual ~OuvinteTradutor();
19   -
20   - // Metodo que vai ser chamado quando chegar a traducao
21   - virtual void notifyTranslation(std::vector<std::string> * glosas) = 0;
  18 + virtual void notifyTranslation(char* glosa) = 0;
22 19 };
23 20  
24 21 }
... ...
tradutor/src/include/pyTradutor.h
... ... @@ -8,7 +8,8 @@
8 8 //*****************************************************************
9 9  
10 10 /**
11   - * \file pyTradutor.hpp
  11 + * \file pyTradutor.h
  12 + *
12 13 * \authors Erickson Silva, Gustavo Sobral
13 14 * \date Janeiro 2015
14 15 */
... ... @@ -20,6 +21,8 @@
20 21 * Essa classe permite a execução e comunição do Tradutor
21 22 * (Português -> Glosa) do sistema escrito em Python
22 23 * permitindo sua utilização numa aplicação C++.
  24 + *
  25 + * \headerfile tradutor/src/include/pyTradutor.h
23 26 */
24 27 class PyTradutor
25 28 {
... ... @@ -32,19 +35,19 @@ private:
32 35 PyObject * pResult;
33 36 public:
34 37  
35   - /** \brief O construtor da classe
  38 + /** O construtor da classe
36 39 *
37 40 * O construtor inicia o ambiente Python para execução da tradução do tradutor.
38 41 */
39 42 PyTradutor();
40 43  
41   - /** \brief O destrutor da classe
  44 + /** O destrutor da classe
42 45 *
43 46 * O Destrutor finaliza o ambiente Python montado para execução da tradução.
44 47 */
45 48 ~PyTradutor();
46 49  
47   - /** \brief Converte Português para Glosa
  50 + /** Converte Português para Glosa
48 51 *
49 52 * Converte a string de entrada em Português para Glosa
50 53 * através da execução do Tradutor e retorna esse resultado
... ...
tradutor/src/include/tradutorPortGlosa.h
1 1 /**
2   - * edit:
3   - * @author Erickson Silva
4   - * @date 14/10/2013
  2 + * \file tradutorPortGlosa.h
5 3 *
  4 + * \authors Derzu Omaia, Erickson Silva
  5 + * \date 14/10/2013
6 6 */
7 7  
8   -/**
9   - * Essa classe converte portugues para Glosa
10   - *
11   - * @author Derzu Omaia
12   - * @date 21/10/2009
13   - *
14   - */
15 8 #include <iostream>
16 9 #include <list>
17 10 #include <pthread.h>
18 11 #include "listenerTradutor.h"
19   -#include "pyTradutor.h"
20   -#include "listenerInput.h"
21   -#include "dprintf.h"
  12 +#include "pyTradutor.h"
  13 +#include "logging.h"
22 14  
23 15 #ifndef _GERADOR_GLOSA_H_
24 16 #define _GERADOR_GLOSA_H_
25 17  
26 18 using namespace std;
  19 +using namespace util;
27 20  
28 21 namespace Tradutor {
29 22  
30   - class TradutorPortGlosa : public ListenerInput{
  23 + /** \brief classe para conversão de português para glosa
  24 + *
  25 + * \headerfile tradutor/src/include/tradutorPortGlosa.h
  26 + */
  27 + class TradutorPortGlosa {
31 28 public:
  29 +
  30 + /** Construtor. */
32 31 TradutorPortGlosa();
  32 +
  33 + /** Destrutor. */
33 34 virtual ~TradutorPortGlosa();
34   - std::vector<std::string> * portuguesToGlosaVector(const char * input);
35   - std::vector<std::string> * portuguesToGlosaVectorSplit(char * pGlosa);
  35 +
  36 + /**
  37 + * Traduz um texto (char* input) para um vetor de tokens<string> contendo a
  38 + * traducao para glosa.
  39 + *
  40 + * \param input texto de entrada.
  41 + * \return Vetor de string contendo os tokens em glosa traduzidos.
  42 + */
  43 + char* portuguesToGlosaVector(const char * input);
36 44  
37   - // Adiciona
  45 + /** Adiciona ouvintes do tradutorPortGlosa.
  46 + *
  47 + * \param listener O ouvinte a ser registrado.
  48 + */
38 49 void addListener(ListenerTradutor * listener);
39   - // Remove
  50 +
  51 + /** Remove ouvintes do tradutorPortGlosa.
  52 + *
  53 + * \param listener O ouvinte a ser removido.
  54 + */
40 55 void removeListener(ListenerTradutor * listener);
41 56  
  57 + /** Traduz o portugues para glosa.
  58 + *
  59 + * Traduz o texto de portugues para glosa e notifica os ouvintes
  60 + * após a tradução.
  61 + *
  62 + * \param texto O texto a ser traduzido.
  63 + */
42 64 void traduz(unsigned char * texto);
  65 +
  66 + /** Invoca os notificadores.
  67 + *
  68 + * Após a tradução, os ouvintes são notificados
  69 + * sobre a nova glosa.
  70 + *
  71 + * \param texto O texto para a tradução.
  72 + */
43 73 virtual void notifyInput(unsigned char * texto);
44 74 //virtual void notificaCC(unsigned char * cc, int64_t pts);
45 75  
46 76  
47 77 private:
48   - void notifyListeners(std::vector<std::string> * traducao);
  78 + /** Notifica os ouvintes sobre o fim da tradução. */
  79 + void notifyListeners(char* traducao);
49 80  
50 81 std::list<ListenerTradutor*> * listeners;
51 82 PyTradutor * pyTradutor;
... ...
tradutor/src/pyTradutor.cpp
... ... @@ -39,7 +39,7 @@ PyTradutor::PyTradutor()
39 39 PyTradutor::~PyTradutor()
40 40 {
41 41 // Free the allocated memory and finalize the Python interpreter
42   - Py_Finalize();
  42 + //Py_Finalize();
43 43 }
44 44  
45 45 char * PyTradutor::convertStringToGlosa(const char * input)
... ...
tradutor/src/tradutorPortGlosa.cpp
... ... @@ -21,7 +21,7 @@ namespace Tradutor {
21 21 // Inicia o mutex
22 22 mutex = (pthread_mutex_t *) malloc( sizeof(pthread_mutex_t) );
23 23 pthread_mutex_init(mutex, NULL);
24   - DPRINTF("Done!\n")
  24 + PRINTL(util::_DEBUG, "Translator Done!\n");
25 25 }
26 26  
27 27  
... ... @@ -31,11 +31,10 @@ namespace Tradutor {
31 31 if (mutex) {
32 32 int ret = pthread_mutex_destroy(mutex);
33 33 if (ret)
34   - DDDPRINTF("Erro, destruindo mutex.\n");
  34 + PRINTL(util::_ERROR, "Erro, destruindo mutex.\n");
35 35 free(mutex);
36 36 }
37   - DDDPRINTF("Translator finalized!\n")
38   -
  37 + PRINTL(util::_DEBUG, "Translator finalized!\n");
39 38 }
40 39  
41 40 void TradutorPortGlosa::addListener(ListenerTradutor* listener) {
... ... @@ -48,7 +47,7 @@ namespace Tradutor {
48 47 }
49 48  
50 49  
51   - void TradutorPortGlosa::notifyListeners(vector<string> * traducao) {
  50 + void TradutorPortGlosa::notifyListeners(char* traducao) {
52 51 for (list<ListenerTradutor*>::iterator i = listeners->begin() ; i != listeners->end() ; i++){
53 52 (*i)->notifyTranslation(traducao);
54 53 }
... ... @@ -73,10 +72,8 @@ namespace Tradutor {
73 72  
74 73 void TradutorPortGlosa::traduz(unsigned char * texto) {
75 74  
76   - vector<string> * vGlosa = portuguesToGlosaVector((const char *)texto);
77   - if (vGlosa->size() > 0)
78   - notifyListeners(vGlosa);
79   - free(vGlosa);
  75 + char* glosa = portuguesToGlosaVector((const char *)texto);
  76 + notifyListeners(glosa);
80 77 }
81 78  
82 79  
... ... @@ -87,42 +84,10 @@ namespace Tradutor {
87 84 * @param input texto de entrada
88 85 * @return vetor de string contendo os tokens em glosa traduzidos.
89 86 **/
90   - vector<string> * TradutorPortGlosa::portuguesToGlosaVector(const char * input) {
91   - char * sGlosa;
92   - vector<string> * vGlosa;
  87 + char* TradutorPortGlosa::portuguesToGlosaVector(const char * input) {
  88 + char * glosa;
93 89 // Faz a tradução de portugues para glosa
94   - sGlosa = pyTradutor->convertStringToGlosa(input);
95   - // Cria vetor de string contendo os tokens da glosa já traduzidos
96   - vGlosa = portuguesToGlosaVectorSplit(sGlosa);
97   - return vGlosa;
98   - }
99   -
100   - /**
101   - * Faz split de uma string (char * sGlosa) para um vector<string> contendo os
102   - * tokens da glosa
103   - *
104   - * @param sGlosa string de glosa
105   - * @return vetor de string contendo os tokens em glosa.
106   - **/
107   - vector<string> * TradutorPortGlosa::portuguesToGlosaVectorSplit(char * sGlosa) {
108   -
109   - //printf("[INFO] Glosa: %s\n", sGlosa);
110   -
111   - vector<string> * vGlosa = new vector<string>();
112   - string str(reinterpret_cast<char*>(sGlosa));
113   -
114   - int cutAt;
115   - while((cutAt = str.find_first_of(" ")) != str.npos){
116   - if(cutAt > 0){
117   - vGlosa->push_back(str.substr(0,cutAt));
118   - }
119   - str = str.substr(cutAt+1);
120   - }
121   -
122   - if(str.length() > 0) {
123   - vGlosa->push_back(str);
124   - }
125   -
126   - return vGlosa;
  90 + glosa = pyTradutor->convertStringToGlosa(input);
  91 + return glosa;
127 92 }
128 93 }
... ...
util/src/argParser.cpp 0 → 100644
... ... @@ -0,0 +1,282 @@
  1 +#include "argParser.h"
  2 +
  3 +ArgParser::ArgParser(){}
  4 +
  5 +ArgParser::~ArgParser(){}
  6 +
  7 +void ArgParser::readArgs(char** argv, int argc)
  8 +{
  9 + int opt;
  10 + int long_index = 0;
  11 +
  12 + static struct option long_options[] = {
  13 + {"audio", required_argument, NULL, 'A'},
  14 + {"subtitle", required_argument, NULL, 'S'},
  15 + {"text", required_argument, NULL, 'T'},
  16 + {"video", required_argument, NULL, 'V'},
  17 + {"language", required_argument, NULL, 'l'},
  18 + {"background", required_argument, NULL, 'b'},
  19 + {"resolution", required_argument, NULL, 'r'},
  20 + {"position", required_argument, NULL, 'p'},
  21 + {"mode", required_argument, NULL, 'm'},
  22 + {"id", required_argument, NULL, 'i'},
  23 + {"no-mixer", no_argument, NULL, 'x'},
  24 + {"check-modules", no_argument, NULL, 'C'},
  25 + {"loglevel", required_argument, NULL, 'v'},
  26 + {"help", no_argument, NULL, 'h'},
  27 + {0, 0, 0, 0 }
  28 + };
  29 +
  30 + while ((opt = getopt_long_only(argc, argv, "A:S:T:V:b:l:m:p:r:v:", long_options, &long_index))!= -1)
  31 + {
  32 + switch (opt)
  33 + {
  34 + case 'A':
  35 + if(argc < 9){
  36 + PRINTL(util::_ERROR, "Insuficient arguments. Try again\n");
  37 + throw lavidlib::RuntimeException();
  38 + }
  39 +
  40 + globalArgs.service = _REC_AUDIO;
  41 + globalArgs.input = optarg;
  42 + break;
  43 +
  44 + case 'S':
  45 + if(argc < 11 || (globalArgs.service == _REC_VIDEO && argc < 17)){
  46 + PRINTL(util::_ERROR, "Insuficient arguments. Try again\n");
  47 + throw lavidlib::RuntimeException();
  48 + }
  49 +
  50 + if(globalArgs.service == _REC_VIDEO){ // ativa o serviço de vídeo e legendas
  51 + globalArgs.service = _VIDEO_WITH_SRT;
  52 + globalArgs.input_srt = optarg;
  53 + }else{
  54 + globalArgs.service = _ONLY_SRT;
  55 + globalArgs.input = optarg;
  56 + }
  57 + break;
  58 +
  59 + case 'T':
  60 + if(argc < 11){
  61 + PRINTL(util::_ERROR, "Insuficient arguments. Try again\n");
  62 + throw lavidlib::RuntimeException();
  63 + }
  64 +
  65 + globalArgs.service = _TEXT;
  66 + globalArgs.input = optarg;
  67 + break;
  68 +
  69 + case 'V':
  70 + if(argc < 13 || ((globalArgs.service == _ONLY_SRT && argc < 17))){
  71 + PRINTL(util::_ERROR, "Insuficient arguments. Try again\n");
  72 + throw lavidlib::RuntimeException();
  73 + }
  74 +
  75 + if(globalArgs.service == _ONLY_SRT){ // ativa o serviço de vídeo e legendas
  76 + globalArgs.service = _VIDEO_WITH_SRT;
  77 + globalArgs.input_srt = globalArgs.input;
  78 + }else if(globalArgs.mixer == _NO_MIXER) // desativa a mixagem
  79 + globalArgs.service = _WITHOUT_MIXER;
  80 + else
  81 + globalArgs.service = _REC_VIDEO;
  82 + globalArgs.input = optarg;
  83 + break;
  84 +
  85 + case 'l':
  86 + globalArgs.language = languageFromString(optarg);
  87 + break;
  88 +
  89 + case 'b':
  90 + globalArgs.back = backgroundFromString(optarg);
  91 + break;
  92 +
  93 + case 'r':
  94 + globalArgs.size = resolutionFromString(optarg);
  95 + break;
  96 +
  97 + case 'p':
  98 + globalArgs.position = positionFromString(optarg);
  99 + break;
  100 +
  101 + case 'm':
  102 + globalArgs.mode = executionModeFromString(optarg);
  103 + break;
  104 +
  105 + case 'i':
  106 + globalArgs.id = optarg;
  107 + break;
  108 +
  109 + case 'x':
  110 + if(globalArgs.service == _REC_VIDEO) // desativa a mixagem
  111 + globalArgs.service = _WITHOUT_MIXER;
  112 + else
  113 + globalArgs.mixer = _NO_MIXER;
  114 + break;
  115 +
  116 + case 'C':
  117 + globalArgs.service = _TESTER;
  118 + break;
  119 +
  120 + case 'v':
  121 + globalArgs.l_level = logFromString(optarg);
  122 + break;
  123 +
  124 + case 'h':
  125 + globalArgs.service = _HELP;
  126 + break;
  127 + case '?':
  128 + /* o getopt já mostra o erro no terminal!*/
  129 + break;
  130 + default:
  131 + printf("\nUsage: %s [Service_option] filepath [Options] --id [name] --mode [devel,prod]\n", argv[0]);
  132 + printf("\nTry --help for more informations.");
  133 + throw lavidlib::RuntimeException();
  134 + }
  135 + }
  136 +
  137 + if (argc < 2){
  138 + printf("Not enough arguments. Try --help.\n");
  139 + throw lavidlib::RuntimeException();
  140 + }
  141 +
  142 + /* Mostra os argumentos restantes depois das opções de linha de comando */
  143 + if (optind < argc)
  144 + {
  145 + printf("non-option ARGV-elements:\n");
  146 + while (optind < argc)
  147 + printf("%s\n", argv[optind++]);
  148 + }
  149 +}
  150 +
  151 +util::logLevel ArgParser::logFromString(const string& level)
  152 +{
  153 + if(level == "quiet")
  154 + return util::_QUIET;
  155 + if(level == "debug")
  156 + return util::_DEBUG;
  157 + if(level == "info")
  158 + return util::_INFO;
  159 + if(level == "warning")
  160 + return util::_WARNING;
  161 + if(level == "error")
  162 + return util::_ERROR;
  163 +
  164 + return util::_INFO;//default
  165 +}
  166 +
  167 +ArgParser::Languages ArgParser::languageFromString(const string& language)
  168 +{
  169 + if(language == "portugues")
  170 + return _PORTUGUESE;
  171 + if(language == "glosa")
  172 + return _GLOSA;
  173 +
  174 + returnErr("--language");
  175 +}
  176 +
  177 +ArgParser::Positions ArgParser::positionFromString(const string& position)
  178 +{
  179 + if(position == "top_left")
  180 + return _TOP_LEFT;
  181 + if(position == "top_right")
  182 + return _TOP_RIGHT;
  183 + if(position == "bottom_right")
  184 + return _BOTTOM_RIGHT;
  185 + if(position == "bottom_left")
  186 + return _BOTTOM_LEFT;
  187 +
  188 + returnErr("--position");
  189 +}
  190 +
  191 +ArgParser::Resolution ArgParser::resolutionFromString(const string& resolution)
  192 +{
  193 + if(resolution == "small")
  194 + return _SMALL;
  195 + if(resolution == "medium")
  196 + return _MEDIUM;
  197 + if(resolution == "large")
  198 + return _LARGE;
  199 +
  200 + returnErr("--resolution");
  201 +}
  202 +
  203 +ArgParser::Background ArgParser::backgroundFromString(const string& back)
  204 +{
  205 + if(back == "opaque")
  206 + return _OPAQUE;
  207 + if(back == "transp")
  208 + return _TRANSPARENT;
  209 +
  210 + returnErr("--background");
  211 +}
  212 +
  213 +ArgParser::Mode ArgParser::executionModeFromString(const string& mode)
  214 +{
  215 + if(mode == "prod")
  216 + return _PROD;
  217 + if(mode == "devel")
  218 + return _DEVEL;
  219 +
  220 + returnErr("--mode");
  221 +}
  222 +
  223 +void ArgParser::returnErr(const string& option)
  224 +{
  225 + cout << "Option '" << option << "' contains an invalid argument." << endl;
  226 + throw lavidlib::RuntimeException();
  227 +}
  228 +
  229 +int ArgParser::getService()
  230 +{
  231 + return globalArgs.service;
  232 +}
  233 +
  234 +int ArgParser::getLanguage()
  235 +{
  236 + return globalArgs.language;
  237 +}
  238 +
  239 +int ArgParser::getPosition()
  240 +{
  241 + return globalArgs.position;
  242 +}
  243 +
  244 +int ArgParser::getSize()
  245 +{
  246 + return globalArgs.size;
  247 +}
  248 +
  249 +int ArgParser::getBackground()
  250 +{
  251 + return globalArgs.back;
  252 +}
  253 +
  254 +int ArgParser::getMode()
  255 +{
  256 + return globalArgs.mode;
  257 +}
  258 +
  259 +int ArgParser::getOption()
  260 +{
  261 + return globalArgs.mixer;
  262 +}
  263 +
  264 +string ArgParser::getInput()
  265 +{
  266 + return globalArgs.input;
  267 +}
  268 +
  269 +string ArgParser::getInputSRT()
  270 +{
  271 + return globalArgs.input_srt;
  272 +}
  273 +
  274 +string ArgParser::getId()
  275 +{
  276 + return globalArgs.id;
  277 +}
  278 +
  279 +util::logLevel ArgParser::getLog()
  280 +{
  281 + return globalArgs.l_level;
  282 +}
... ...
util/src/include/argParser.h 0 → 100644
... ... @@ -0,0 +1,177 @@
  1 +/**
  2 + * \file argParser.h
  3 + *
  4 + * \author Wesnydy Lima Ribeiro <wesnydy@lavid.ufpb.br>
  5 + * \date 2015
  6 + */
  7 +
  8 +#ifndef ARG_PARSER_H
  9 +#define ARG_PARSER_H
  10 +
  11 +#include <stdio.h>
  12 +#include <string.h>
  13 +#include <iostream>
  14 +#include <stdlib.h>
  15 +#include <unistd.h>
  16 +#include <getopt.h>
  17 +#include "logging.h"
  18 +#include <lavidlib/base/RuntimeException.h>
  19 +
  20 +#define MAX_SIZE_PATH 256
  21 +
  22 +using namespace std;
  23 +using namespace util;
  24 +
  25 +/** \brief Analizador de argumentos de linha de comando.
  26 + *
  27 + * \headerfile util/src/include/argParser.h
  28 + */
  29 +class ArgParser {
  30 +public:
  31 + /** Construtor */
  32 + ArgParser();
  33 +
  34 + /** Destrutor */
  35 + ~ArgParser();
  36 +
  37 + /** Analiza os argumentos da linha de comando.
  38 + *
  39 + * \param argv Os argumentos.
  40 + * \param arc O número de argumentos.
  41 + * \exception RuntimeException Se forem encontrados argumentos inválidos ou na falta de argumentos.
  42 + */
  43 + void readArgs(char** argv, int argc);
  44 +
  45 + /** Retorna o serviço requisitado.
  46 + *
  47 + * \return O serviço.
  48 + */
  49 + int getService();
  50 +
  51 + /** Retorna a linguagem do arquivo de entrada.
  52 + *
  53 + * \return A linguagem do arquivo.
  54 + */
  55 + int getLanguage();
  56 +
  57 + /** Retorna a posição do vídeo de LIBRAS.
  58 + *
  59 + * \return A posição do vídeo.
  60 + */
  61 + int getPosition();
  62 +
  63 + /** Retorna o tamanho do vídeo de LIBRAS.
  64 + *
  65 + * \return O tamanho do vídeo.
  66 + */
  67 + int getSize();
  68 +
  69 + /** Retorna a transparência do plano de fundo.
  70 + *
  71 + * \return O background do vídeo.
  72 + */
  73 + int getBackground();
  74 +
  75 + /** Retorna o modo de execução.
  76 + *
  77 + * \return O modo de execução.
  78 + */
  79 + int getMode();
  80 +
  81 + /** Retorna opções extras ativadas.
  82 + *
  83 + * \return A opção extra.
  84 + */
  85 + int getOption();
  86 +
  87 + /** Retorna o path arquivo de entrada.
  88 + *
  89 + * \return O path do arquivo.
  90 + */
  91 + string getInput();
  92 +
  93 + /** Retorna o path arquivo de legendas.
  94 + *
  95 + * \return O path do arquivo de legendas.
  96 + */
  97 + string getInputSRT();
  98 +
  99 + /** Retorna a identificação do cliente.
  100 + *
  101 + * \return O ID do cliente.
  102 + */
  103 + string getId();
  104 +
  105 + /** Retorna o nível de log selecionado.
  106 + *
  107 + * \return O nível do log.
  108 + */
  109 + util::logLevel getLog();
  110 +
  111 +private:
  112 + enum Services { _VIDEO_WITH_SRT = 1, _REC_VIDEO, _TEXT, _ONLY_SRT, _REC_AUDIO, _WITHOUT_MIXER, _TESTER , _HELP};
  113 + enum Languages { _PORTUGUESE = 1, _GLOSA };
  114 + enum Positions { _TOP_LEFT = 1, _TOP_RIGHT, _BOTTOM_RIGHT, _BOTTOM_LEFT };
  115 + enum Resolution { _SMALL = 1, _MEDIUM, _LARGE };
  116 + enum Background { _OPAQUE, _TRANSPARENT };
  117 + enum Options { _NO_MIXER = 1 };
  118 + enum Mode { _DEVEL = 1 , _PROD };
  119 +
  120 + struct globalArgs_t {
  121 + Services service;
  122 + Languages language;
  123 + Positions position;
  124 + Resolution size;
  125 + Background back;
  126 + Options mixer;
  127 + Mode mode;
  128 + string input;
  129 + string input_srt;
  130 + string id;
  131 + util::logLevel l_level;
  132 + }globalArgs;
  133 +
  134 + /** Exibe erros ocorridos durante a analise dos argumentos.
  135 + *
  136 + * \param option A mensagem de erro.
  137 + */
  138 + void returnErr(const string& option);
  139 +
  140 + /** Retorna a opção de linguagem a partir de uma string.
  141 + *
  142 + * \return A linguagem do arquivo.
  143 + */
  144 + Languages languageFromString(const string& language);
  145 +
  146 + /** Retorna a opção de posição a partir de uma string.
  147 + *
  148 + * \return A posição do vídeo.
  149 + */
  150 + Positions positionFromString(const string& position);
  151 +
  152 + /** Retorna a opção de resolução a partir de uma string.
  153 + *
  154 + * \return A resolução do vídeo.
  155 + */
  156 + Resolution resolutionFromString(const string& resolution);
  157 +
  158 + /** Retorna a opção de background a partir de uma string.
  159 + *
  160 + * \return O background do vídeo.
  161 + */
  162 + Background backgroundFromString(const string& backg);
  163 +
  164 + /** Retorna a opção do modo de execução a partir de uma string.
  165 + *
  166 + * \return O modo de execução.
  167 + */
  168 + Mode executionModeFromString(const string& mode);
  169 +
  170 + /** Retorna o nível de log selecionado.
  171 + *
  172 + * \return O nível de log.
  173 + */
  174 + util::logLevel logFromString(const string& level);
  175 +};
  176 +
  177 +#endif /* ARG_PARSER_H */
0 178 \ No newline at end of file
... ...
util/src/include/dprintf.h
... ... @@ -1,79 +0,0 @@
1   -#ifndef __DPRINTF_H__
2   -#define __DPRINTF_H__
3   -
4   -/* A macro DEBUG_LEVEL determina o nivel de debugging
5   - * A seguinte regra eh utilizada:
6   - *
7   - * DEBUG_LEVEL >= 3: Apenas DDDPRINTF serah compilada.
8   - * DEBUG_LEVEL >= 2: DDDPRINTF E DDPRINTF serao compiladas.
9   - * DEBUG_LEVEL >= 1: DDDPRINTF, DDPRINTF e DPRINTF serao compiladas.
10   - * DEBUG_LEVEL == 0: Nada sera compilado. */
11   -
12   -#include <stdio.h>
13   -
14   -/* tamanho maximo (em bytes) do arquivo de log (1M) */
15   -//#define TAMANHO_MAXIMO_LOG 1048576
16   -#define TAMANHO_MAXIMO_LOG 5242880
17   -
18   - #define _DPRINTF_ERROR "\033[30m"
19   - #define _DPRINTF_WARN "\033[33m"
20   - #define _DPRINTF_INFO "\033[32m"
21   - #define _DPRINTF_FAIL "\033[31m"
22   - #define _DPRINTF_END "\033[0m"
23   -
24   -#define _DPRINTF_NOP(format, ...) do { } while (0)
25   -
26   -#ifdef DEBUG_LEVEL
27   -
28   - #if DEBUG_LEVEL & 4
29   - #define DDDPRINTF(format, ...) { \
30   - fprintf(stderr, \
31   - _DPRINTF_ERROR"%s::%s [%d] -> "_DPRINTF_END format, \
32   - __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
33   - }
34   -
35   - #else /* !DEBUG_LEVEL > 2 */
36   - #define DDDPRINTF _DPRINTF_NOP
37   - #endif /* DEBUG_LEVEL > 2 */
38   -
39   - #if DEBUG_LEVEL & 2
40   - #define DDPRINTF(format, ...) { \
41   - fprintf(stderr, \
42   - _DPRINTF_WARN"%s::%s [%d] -> "_DPRINTF_END format, \
43   - __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
44   - }
45   -
46   -#else /* !DEBUG_LEVEL > 1 */
47   - #define DDPRINTF _DPRINTF_NOP
48   - #endif /* DEBUG_LEVEL > 1 */
49   -
50   - #if DEBUG_LEVEL & 1
51   - #define DPRINTF(format, ...) { \
52   - fprintf(stderr, \
53   - _DPRINTF_INFO"%s::%s [%d] -> "_DPRINTF_END format, \
54   - __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
55   - }
56   -
57   - #else /* !DEBUG_LEVEL > 0 */
58   - #define DPRINTF _DPRINTF_NOP
59   - #endif /* DEBUG_LEVEL > 0 */
60   -
61   - #if DEBUG_LEVEL & 1
62   - #define DDDDPRINTF(format, ...) { \
63   - fprintf(stderr, \
64   - _DPRINTF_FAIL"%s::%s [%d] -> "_DPRINTF_END format, \
65   - __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
66   - }
67   -
68   - #else /* !DEBUG_LEVEL > 0 */
69   - #define DDDDPRINTF _DPRINTF_NOP
70   - #endif /* DEBUG_LEVEL > 0 */
71   -
72   -#else /* DEBUG_LEVEL */
73   - #define DPRINTF _DPRINTF_NOP
74   - #define DDPRINTF _DPRINTF_NOP
75   - #define DDDPRINTF _DPRINTF_NOP
76   -#endif /* ! DEBUG_LEVEL */
77   -
78   -#endif /* __DPRINTF_H__ */
79   -
util/src/include/logger.h
... ... @@ -1,52 +0,0 @@
1   -/***************************************************************************
2   - * Universidade Federal da Paraíba *
3   - * Copyright (C) 2014 by Laboratório de Aplicações de Vídeo Digital *
4   - * *
5   - * Centro de Informática - UFPB - Campus I *
6   - * João Pessoa - PB - Brasil *
7   - * *
8   - * Author: Erickson Silva (erickson.silva@lavid.ufpb.br) *
9   - * *
10   - **************************************************************************/
11   -
12   -#include <iostream>
13   -#include <fstream>
14   -#include <time.h>
15   -#include <stdio.h>
16   -#include <stdlib.h>
17   -#include <stddef.h>
18   -#include <iostream>
19   -#include <ctime>
20   -//#include <lavidlib/utils/Logger.h>
21   -
22   -
23   -#ifndef _LOGGER_H_
24   -#define _LOGGER_H_
25   -
26   -using namespace std;
27   -
28   -namespace Util {
29   -
30   - class Logger {
31   - public:
32   - static Logger* Instance();
33   - void openLogFile();
34   - void writeLog(char* log);
35   - void closeLogFile();
36   - char* getTime();
37   -
38   - private:
39   - Logger() ; // Private so that it can not be called
40   - Logger(Logger const&){}; // copy constructor is private
41   - Logger& operator=(Logger const&){}; // assignment operator is private
42   - static Logger* m_pInstance;
43   - ofstream file;
44   -
45   -
46   - };
47   -
48   -
49   -}
50   -
51   -
52   -#endif
util/src/include/logging.h 0 → 100644
... ... @@ -0,0 +1,84 @@
  1 +/**
  2 + * \file logging.h
  3 + *
  4 + * \author Wesnydy Lima Ribeiro <wesnydy@lavid.ufpb.br>
  5 + * \date 2015
  6 + */
  7 +
  8 +#ifndef LOGGING_H
  9 +#define LOGGING_H
  10 +
  11 +#include <stdio.h>
  12 +#include <stdlib.h>
  13 +#include <time.h>
  14 +
  15 +#define _ERROR_ "\033[31m"
  16 +#define _DEBUG_ "\033[30m"
  17 +#define _WARN_ "\033[33m"
  18 +#define _INFO_ "\033[32m"
  19 +#define _END_ "\033[0m"
  20 +
  21 +#define LOG_FILE "vlibras_user/vlibras-core/log/log"
  22 +
  23 +namespace util {
  24 +
  25 + enum logLevel { _QUIET = 1 , _ERROR, _WARNING, _INFO, _DEBUG};
  26 +
  27 + /** \brief Classe responsável pelo log exibido no terminal.
  28 + *
  29 + * \headerfile util/src/include/logging.h
  30 + */
  31 + class Logging {
  32 + public:
  33 + static Logging* instance();
  34 +
  35 + /** Retorna o nível de log selecionado.
  36 + *
  37 + * \return O nível de log.
  38 + */
  39 + logLevel getLevel();
  40 +
  41 + /** Seta o nível de log, no terminal. */
  42 + void setLevel(logLevel level);
  43 +
  44 + /** Escreve o log em um arquivo.
  45 + *
  46 + * \param logMsg A mensagem do log.
  47 + */
  48 + void writeLog(const char* logMsg);
  49 +
  50 + private:
  51 + Logging(){};
  52 + Logging(Logging const&){};
  53 + Logging& operator=(Logging const&){};
  54 +
  55 + static Logging* l_instance;
  56 + static logLevel l_level;
  57 + FILE* l_file;
  58 +
  59 + char* getTime();
  60 + };
  61 +
  62 + #define PRINTL(level, format, ... ) { \
  63 + logLevel llevel; \
  64 + llevel = Logging::instance()->getLevel(); \
  65 + if(level <= llevel){ \
  66 + switch(level){ \
  67 + case _DEBUG: \
  68 + fprintf(stdout, _DEBUG_"%s::%s<%d>: "_END_ format, __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
  69 + break; \
  70 + case _INFO: \
  71 + fprintf(stdout, _INFO_"%s::%s<%d>: "_END_ format, __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
  72 + break; \
  73 + case _WARNING: \
  74 + fprintf(stdout, _WARN_"%s::%s<%d>: "_END_ format, __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
  75 + break; \
  76 + case _ERROR: \
  77 + fprintf(stderr, _ERROR_"%s::%s<%d>: "_END_ format, __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
  78 + break; \
  79 + } \
  80 + } \
  81 + }//fim da função PRINTL
  82 +}
  83 +
  84 +#endif /* LOGGING_H */
0 85 \ No newline at end of file
... ...
util/src/logger.cpp
... ... @@ -1,51 +0,0 @@
1   -/***************************************************************************
2   - * Universidade Federal da Paraíba *
3   - * Copyright (C) 2014 by Laboratório de Aplicações de Vídeo Digital *
4   - * *
5   - * Centro de Informática - UFPB - Campus I *
6   - * João Pessoa - PB - Brasil *
7   - * *
8   - * Author: Erickson Silva (erickson.silva@lavid.ufpb.br) *
9   - * *
10   - **************************************************************************/
11   -
12   -#include "logger.h"
13   -
14   -namespace Util {
15   -
16   - Logger* Logger::m_pInstance = NULL;
17   -
18   - Logger::Logger(){
19   - }
20   -
21   - Logger* Logger::Instance(){
22   - if (!m_pInstance) // Only allow one instance of class to be generated.
23   - m_pInstance = new Logger;
24   -
25   - return m_pInstance;
26   - }
27   -
28   -
29   - void Logger::openLogFile(){
30   - file.open("vlibras_user/vlibras-core/log/log", ios_base::app);
31   - }
32   -
33   -
34   - void Logger::closeLogFile(){
35   - file.close();
36   - }
37   -
38   - char* Logger::getTime(){
39   - time_t curtime;
40   - time(&curtime);
41   - return ctime(&curtime);
42   - }
43   -
44   - void Logger::writeLog(char* exception){
45   - this->openLogFile();
46   - file << getTime();
47   - file << exception << "\n\n\r";
48   - this->closeLogFile();
49   - }
50   -
51   -}
util/src/logging.cpp 0 → 100644
... ... @@ -0,0 +1,38 @@
  1 +#include "logging.h"
  2 +
  3 +namespace util {
  4 +
  5 + Logging* Logging::l_instance = NULL;
  6 + logLevel Logging::l_level = _INFO;
  7 +
  8 + Logging* Logging::instance() {
  9 + if(!l_instance)
  10 + l_instance = new Logging();
  11 + return l_instance;
  12 + }
  13 +
  14 + logLevel Logging::getLevel() {
  15 + return this->l_level;
  16 + }
  17 +
  18 + void Logging::setLevel(logLevel level) {
  19 + if(level != 0)
  20 + this->l_level = level;
  21 + }
  22 +
  23 + char* Logging::getTime() {
  24 + time_t curtime;
  25 + time(&curtime);
  26 + return ctime(&curtime);
  27 + }
  28 +
  29 + void Logging::writeLog(const char* logMsg) {
  30 + l_file = fopen(LOG_FILE, "a");
  31 +
  32 + if(l_file == NULL)
  33 + return;
  34 +
  35 + fprintf(l_file, "%s'%s'\n\n\r", getTime() ,logMsg);
  36 + fclose(l_file);
  37 + }
  38 +}
0 39 \ No newline at end of file
... ...