-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvideo_metadata.cpp
124 lines (109 loc) · 4.58 KB
/
video_metadata.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// Created by rolo on 29/8/19.
//
#include "video_metadata.h"
#include "util.hpp"
/**
* VideoMetadata::VideoMetadata(const string& _name, int _frame_length, int _fps, int dps)
*
* constructor que crea los metadatos a partir de todos sus componentes
*
* se utiliza al construir los descriptores
* */
VideoMetadata::VideoMetadata(const string& _name, int _frame_length, int _fps, int dps)
:name(_name), frame_length(_frame_length), frame_per_second(_fps), descriptors_per_second(dps)
{
descriptors_per_second = (descriptors_per_second != 0) ? descriptors_per_second : 1;
this->offset = (frame_per_second/(descriptors_per_second))-1;
}
/**
* VideoMetadata::VideoMetadata()
*
* Constructor vacio
* utilizado para cargar los metadatos de determinado video desde algun fichero.
* */
VideoMetadata::VideoMetadata()
:name(""), frame_length(0), frame_per_second(25),descriptors_per_second(3)
{
}
/**
* VideoMetadata::toFile(const string& filename)
*
* Metodo para serializar metadatos a fichero binario
* la estructura del nombre del fichero es la siguiente:
*
* <CUALQUIER_COSA>/DIR_PROYECTO/data/cache/<TIPO_VIDEO>/<NOMBRE_VIDEO>/metadata
* */
void VideoMetadata::toFile(const string& filename)
{
if (!this->isValid()) // se verifica que el nombre de fichero sea valido
return;
ofstream output_file(filename, ios::binary);
if(output_file.is_open())
{
char _name[1024] = {'\0'}; // se crea un arreglo de char alternativo para almacenar el nombre
strncpy(_name, name.c_str(), name.size()); // y evitar problemas de memoria con el string
output_file.write( (char *) &_name, sizeof(_name) ); // se guarda el nombre
output_file.write( (char *) &frame_length, sizeof(int) ); // el tamaño
output_file.write( (char *) &frame_per_second, sizeof(int) ); // etc
output_file.write( (char *) &descriptors_per_second, sizeof(int) );
}
output_file.close();
}
/**
* VideoMetadata::fromFile(const string& filename)
*
* Metodo para deserializar metadatos desde fichero binario
* la estructura del nombre del fichero es la siguiente:
*
* <CUALQUIER_COSA>/DIR_PROYECTO/data/cache/<TIPO_VIDEO>/<NOMBRE_VIDEO>/metadata
* */
void VideoMetadata::fromFile(const string& filename)
{
ifstream input_file(filename, ios::binary);
if(input_file.is_open())
{
char _name[1024] = {'\0'};
input_file.read( (char *) &_name, sizeof(_name) ); // cargamos el nombre
this->name = string(_name);
input_file.read( (char *) &frame_length, sizeof(int) ); // y todo lo demas
input_file.read( (char *) &frame_per_second, sizeof(int) );
input_file.read( (char *) &descriptors_per_second, sizeof(int) );
this->offset = (frame_per_second/descriptors_per_second)-1;
}
input_file.close();
}
/**
* VideoMetadata::getNextDescriptorName(int currentDescriptor)
*
* Metodo que retorna el nombre del proximo descriptor a partir del parametro
*
* si no es posible obtenerlo se retorna el string vacio
* */
string VideoMetadata::getNextDescriptorName(int currentDescriptor)
{
int next = currentDescriptor + offset; // se calcula el proximo descriptor
if (next > frame_length) // si sobrepasa el ultimo
next = frame_length; // se acota
string filename(this->name + "/" + std::to_string(next)); // se crea el nombre de fichero
if(existe_archivo(filename)) // si existe el descriptor buscado
return filename; // se retorna
return string(); // si no existe se retorna cadena vacia
}
/**
* VideoMetadata::getPrevDescriptorName(int currentDescriptor)
*
* Metodo que retorna el nombre del anterior descriptor a partir del parametro
*
* si no es posible obtenerlo se retorna el string vacio
* */
string VideoMetadata::getPrevDescriptorName(int currentDescriptor)
{
int prev = currentDescriptor - offset; // se calcula el anterior descriptor
if (prev < 0) // si sobrepasa el primero
prev = 0; // se acota
string filename(this->name + "/" + std::to_string(prev)); // se crea el nombre de fichero
if(existe_archivo(filename)) // si existe el descriptor buscado
return filename; // se retorna
return string();
}