ffmpeg / libavformat / cutils.c @ f6c7375a
History | View | Annotate | Download (2.45 KB)
1 |
/*
|
---|---|
2 |
* Various simple utilities for ffmpeg system
|
3 |
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
4 |
*
|
5 |
* This file is part of FFmpeg.
|
6 |
*
|
7 |
* FFmpeg is free software; you can redistribute it and/or
|
8 |
* modify it under the terms of the GNU Lesser General Public
|
9 |
* License as published by the Free Software Foundation; either
|
10 |
* version 2.1 of the License, or (at your option) any later version.
|
11 |
*
|
12 |
* FFmpeg is distributed in the hope that it will be useful,
|
13 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 |
* Lesser General Public License for more details.
|
16 |
*
|
17 |
* You should have received a copy of the GNU Lesser General Public
|
18 |
* License along with FFmpeg; if not, write to the Free Software
|
19 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 |
*/
|
21 |
#include "avformat.h" |
22 |
#include "internal.h" |
23 |
|
24 |
/* add one element to a dynamic array */
|
25 |
void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem) |
26 |
{ |
27 |
/* see similar ffmpeg.c:grow_array() */
|
28 |
int nb, nb_alloc;
|
29 |
intptr_t *tab; |
30 |
|
31 |
nb = *nb_ptr; |
32 |
tab = *tab_ptr; |
33 |
if ((nb & (nb - 1)) == 0) { |
34 |
if (nb == 0) |
35 |
nb_alloc = 1;
|
36 |
else
|
37 |
nb_alloc = nb * 2;
|
38 |
tab = av_realloc(tab, nb_alloc * sizeof(intptr_t));
|
39 |
*tab_ptr = tab; |
40 |
} |
41 |
tab[nb++] = elem; |
42 |
*nb_ptr = nb; |
43 |
} |
44 |
|
45 |
#define ISLEAP(y) (((y) % 4 == 0) && (((y) % 100) != 0 || ((y) % 400) == 0)) |
46 |
#define LEAPS_COUNT(y) ((y)/4 - (y)/100 + (y)/400) |
47 |
|
48 |
/* This is our own gmtime_r. It differs from its POSIX counterpart in a
|
49 |
couple of places, though. */
|
50 |
struct tm *brktimegm(time_t secs, struct tm *tm) |
51 |
{ |
52 |
int days, y, ny, m;
|
53 |
int md[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; |
54 |
|
55 |
days = secs / 86400;
|
56 |
secs %= 86400;
|
57 |
tm->tm_hour = secs / 3600;
|
58 |
tm->tm_min = (secs % 3600) / 60; |
59 |
tm->tm_sec = secs % 60;
|
60 |
|
61 |
/* oh well, may be someone some day will invent a formula for this stuff */
|
62 |
y = 1970; /* start "guessing" */ |
63 |
while (days > 365) { |
64 |
ny = (y + days/366);
|
65 |
days -= (ny - y) * 365 + LEAPS_COUNT(ny - 1) - LEAPS_COUNT(y - 1); |
66 |
y = ny; |
67 |
} |
68 |
if (days==365 && !ISLEAP(y)) { days=0; y++; } |
69 |
md[1] = ISLEAP(y)?29:28; |
70 |
for (m=0; days >= md[m]; m++) |
71 |
days -= md[m]; |
72 |
|
73 |
tm->tm_year = y; /* unlike gmtime_r we store complete year here */
|
74 |
tm->tm_mon = m+1; /* unlike gmtime_r tm_mon is from 1 to 12 */ |
75 |
tm->tm_mday = days+1;
|
76 |
|
77 |
return tm;
|
78 |
} |