grr.. typo
[Rockbox.git] / apps / plugins / mpegplayer / mpeg_misc.c
blobf5ecb6d6c8e650565420eaa96963365eca303575
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Miscellaneous helper API definitions
12 * Copyright (c) 2007 Michael Sevakis
14 * All files in this archive are subject to the GNU General Public License.
15 * See the file COPYING in the source tree root for full license agreement.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #include "plugin.h"
22 #include "mpegplayer.h"
24 /** Streams **/
26 /* Ensures direction is -1 or 1 and margin is properly initialized */
27 void stream_scan_normalize(struct stream_scan *sk)
29 if (sk->dir >= 0)
31 sk->dir = SSCAN_FORWARD;
32 sk->margin = sk->len;
34 else if (sk->dir < 0)
36 sk->dir = SSCAN_REVERSE;
37 sk->margin = 0;
41 /* Moves a scan cursor. If amount is positive, the increment is in the scan
42 * direction, otherwise opposite the scan direction */
43 void stream_scan_offset(struct stream_scan *sk, off_t by)
45 off_t bydir = by*sk->dir;
46 sk->pos += bydir;
47 sk->margin -= bydir;
48 sk->len -= by;
51 /** Time helpers **/
52 void ts_to_hms(uint32_t pts, struct hms *hms)
54 hms->frac = pts % TS_SECOND;
55 hms->sec = pts / TS_SECOND;
56 hms->min = hms->sec / 60;
57 hms->hrs = hms->min / 60;
58 hms->sec %= 60;
59 hms->min %= 60;
62 void hms_format(char *buf, size_t bufsize, struct hms *hms)
64 /* Only display hours if nonzero */
65 if (hms->hrs != 0)
67 rb->snprintf(buf, bufsize, "%u:%02u:%02u",
68 hms->hrs, hms->min, hms->sec);
70 else
72 rb->snprintf(buf, bufsize, "%u:%02u",
73 hms->min, hms->sec);
77 /** Maths **/
78 uint32_t muldiv_uint32(uint32_t multiplicand,
79 uint32_t multiplier,
80 uint32_t divisor)
82 if (divisor != 0)
84 uint64_t prod = (uint64_t)multiplier*multiplicand + divisor/2;
86 if ((uint32_t)(prod >> 32) < divisor)
87 return (uint32_t)(prod / divisor);
89 else if (multiplicand == 0 || multiplier == 0)
91 return 0; /* 0/0 = 0 : yaya */
93 /* else (> 0) / 0 = UINT32_MAX */
95 return UINT32_MAX; /* Saturate */