|
Lines 1472-1477
Link Here
|
| 1472 |
} |
1476 |
} |
| 1473 |
|
1477 |
|
| 1474 |
|
1478 |
|
|
|
1479 |
static int |
| 1480 |
calcNeeded(lame_global_flags* gfp) |
| 1481 |
{ |
| 1482 |
int mf_needed; |
| 1483 |
/* some sanity checks */ |
| 1484 |
#if ENCDELAY < MDCTDELAY |
| 1485 |
# error ENCDELAY is less than MDCTDELAY, see encoder.h |
| 1486 |
#endif |
| 1487 |
#if FFTOFFSET > BLKSIZE |
| 1488 |
# error FFTOFFSET is greater than BLKSIZE, see encoder.h |
| 1489 |
#endif |
| 1490 |
|
| 1491 |
mf_needed = BLKSIZE + gfp->framesize - FFTOFFSET; /* amount needed for FFT */ |
| 1492 |
/*mf_needed = Max(mf_needed, 286 + 576 * (1 + gfc->mode_gr)); */ |
| 1493 |
mf_needed = Max(mf_needed, 512 + gfp->framesize - 32); |
| 1494 |
|
| 1495 |
assert(MFSIZE >= mf_needed); |
| 1496 |
|
| 1497 |
return mf_needed; |
| 1498 |
} |
| 1499 |
|
| 1475 |
/* |
1500 |
/* |
| 1476 |
* THE MAIN LAME ENCODING INTERFACE |
1501 |
* THE MAIN LAME ENCODING INTERFACE |
| 1477 |
* mt 3/00 |
1502 |
* mt 3/00 |
|
Lines 1555-1574
Link Here
|
| 1555 |
} |
1580 |
} |
| 1556 |
} |
1581 |
} |
| 1557 |
|
1582 |
|
| 1558 |
|
1583 |
mf_needed = calcNeeded(gfp); |
| 1559 |
/* some sanity checks */ |
|
|
| 1560 |
#if ENCDELAY < MDCTDELAY |
| 1561 |
# error ENCDELAY is less than MDCTDELAY, see encoder.h |
| 1562 |
#endif |
| 1563 |
#if FFTOFFSET > BLKSIZE |
| 1564 |
# error FFTOFFSET is greater than BLKSIZE, see encoder.h |
| 1565 |
#endif |
| 1566 |
|
| 1567 |
mf_needed = BLKSIZE + gfp->framesize - FFTOFFSET; /* amount needed for FFT */ |
| 1568 |
/*mf_needed = Max(mf_needed, 286 + 576 * (1 + gfc->mode_gr)); */ |
| 1569 |
mf_needed = Max(mf_needed, 512 + gfp->framesize - 32); |
| 1570 |
|
| 1571 |
assert(MFSIZE >= mf_needed); |
| 1572 |
|
1584 |
|
| 1573 |
mfbuf[0] = gfc->mfbuf[0]; |
1585 |
mfbuf[0] = gfc->mfbuf[0]; |
| 1574 |
mfbuf[1] = gfc->mfbuf[1]; |
1586 |
mfbuf[1] = gfc->mfbuf[1]; |
|
Lines 1602-1607
Link Here
|
| 1602 |
/* update mfbuf[] counters */ |
1614 |
/* update mfbuf[] counters */ |
| 1603 |
gfc->mf_size += n_out; |
1615 |
gfc->mf_size += n_out; |
| 1604 |
assert(gfc->mf_size <= MFSIZE); |
1616 |
assert(gfc->mf_size <= MFSIZE); |
|
|
1617 |
|
| 1618 |
/* lame_encode_flush may have set gfc->mf_sample_to_encode to 0 |
| 1619 |
* so we have to reinitialize it here when that happened. |
| 1620 |
*/ |
| 1621 |
if (gfc->mf_samples_to_encode < 1) { |
| 1622 |
gfc->mf_samples_to_encode = ENCDELAY + POSTDELAY; |
| 1623 |
} |
| 1605 |
gfc->mf_samples_to_encode += n_out; |
1624 |
gfc->mf_samples_to_encode += n_out; |
| 1606 |
|
1625 |
|
| 1607 |
|
1626 |
|
|
Lines 1926-1949
Link Here
|
| 1926 |
|
1945 |
|
| 1927 |
/* we always add POSTDELAY=288 padding to make sure granule with real |
1946 |
/* we always add POSTDELAY=288 padding to make sure granule with real |
| 1928 |
* data can be complety decoded (because of 50% overlap with next granule */ |
1947 |
* data can be complety decoded (because of 50% overlap with next granule */ |
| 1929 |
int end_padding = POSTDELAY; |
1948 |
int end_padding; |
| 1930 |
int pad_out_samples; |
|
|
| 1931 |
int frames_left; |
1949 |
int frames_left; |
| 1932 |
int samples_to_encode = gfc->mf_samples_to_encode; |
1950 |
int samples_to_encode = gfc->mf_samples_to_encode - POSTDELAY+288; |
|
|
1951 |
int mf_needed = calcNeeded(gfp); |
| 1933 |
|
1952 |
|
|
|
1953 |
/* Was flush already called? */ |
| 1954 |
if (gfc->mf_samples_to_encode < 1) { |
| 1955 |
return 0; |
| 1956 |
} |
| 1934 |
memset(buffer, 0, sizeof(buffer)); |
1957 |
memset(buffer, 0, sizeof(buffer)); |
| 1935 |
mp3count = 0; |
1958 |
mp3count = 0; |
| 1936 |
|
1959 |
|
| 1937 |
if (gfp->in_samplerate != gfp->out_samplerate) { |
1960 |
if (gfp->in_samplerate != gfp->out_samplerate) { |
| 1938 |
/* delay due to resampling; needs to be fixed, if resampling code gets changed */ |
1961 |
/* delay due to resampling; needs to be fixed, if resampling code gets changed */ |
| 1939 |
samples_to_encode += 16.*gfp->out_samplerate/gfp->in_samplerate; |
1962 |
samples_to_encode += 16.*gfp->out_samplerate/gfp->in_samplerate; |
| 1940 |
} |
1963 |
} |
| 1941 |
pad_out_samples = gfp->framesize - (samples_to_encode % gfp->framesize); |
1964 |
end_padding = gfp->framesize - (samples_to_encode % gfp->framesize); |
| 1942 |
end_padding += pad_out_samples; |
1965 |
gfp->encoder_padding = end_padding; |
| 1943 |
|
1966 |
|
| 1944 |
frames_left = (samples_to_encode + pad_out_samples) / gfp->framesize; |
1967 |
frames_left = (samples_to_encode + end_padding) / gfp->framesize; |
| 1945 |
while (frames_left > 0) { |
1968 |
|
|
|
1969 |
/* send in a frame of 0 padding until all internal sample buffers are flushed */ |
| 1970 |
while (frames_left > 0 && imp3 >= 0) { |
| 1971 |
int bunch = mf_needed-gfc->mf_size; |
| 1946 |
int frame_num = gfp->frameNum; |
1972 |
int frame_num = gfp->frameNum; |
|
|
1973 |
|
| 1974 |
bunch *= gfp->in_samplerate; |
| 1975 |
bunch /= gfp->out_samplerate; |
| 1976 |
if (bunch > 1152) bunch = 1152; |
| 1977 |
if (bunch < 1) bunch = 1; |
| 1947 |
|
1978 |
|
| 1948 |
mp3buffer_size_remaining = mp3buffer_size - mp3count; |
1979 |
mp3buffer_size_remaining = mp3buffer_size - mp3count; |
| 1949 |
|
1980 |
|
|
Lines 1951-1972
Link Here
|
| 1951 |
if (mp3buffer_size == 0) |
1982 |
if (mp3buffer_size == 0) |
| 1952 |
mp3buffer_size_remaining = 0; |
1983 |
mp3buffer_size_remaining = 0; |
| 1953 |
|
1984 |
|
| 1954 |
/* send in a frame of 0 padding until all internal sample buffers |
1985 |
imp3 = lame_encode_buffer(gfp, buffer[0], buffer[1], bunch, |
| 1955 |
* are flushed |
|
|
| 1956 |
*/ |
| 1957 |
imp3 = lame_encode_buffer(gfp, buffer[0], buffer[1], 32, |
| 1958 |
mp3buffer, mp3buffer_size_remaining); |
1986 |
mp3buffer, mp3buffer_size_remaining); |
| 1959 |
|
1987 |
|
| 1960 |
if (frame_num != gfp->frameNum) { |
|
|
| 1961 |
--frames_left; |
| 1962 |
} |
| 1963 |
if (imp3 < 0) { |
| 1964 |
/* some type of fatal error */ |
| 1965 |
return imp3; |
| 1966 |
} |
| 1967 |
mp3buffer += imp3; |
1988 |
mp3buffer += imp3; |
| 1968 |
mp3count += imp3; |
1989 |
mp3count += imp3; |
|
|
1990 |
frames_left -= (frame_num != gfp->frameNum) ? 1 : 0; |
| 1969 |
} |
1991 |
} |
|
|
1992 |
/* Set gfc->mf_samples_to_encode to 0, so we may detect |
| 1993 |
* and break loops calling it more than once in a row. |
| 1994 |
*/ |
| 1995 |
gfc->mf_samples_to_encode = 0; |
| 1996 |
|
| 1997 |
if (imp3 < 0) { |
| 1998 |
/* some type of fatal error */ |
| 1999 |
return imp3; |
| 2000 |
} |
| 2001 |
|
| 1970 |
mp3buffer_size_remaining = mp3buffer_size - mp3count; |
2002 |
mp3buffer_size_remaining = mp3buffer_size - mp3count; |
| 1971 |
/* if user specifed buffer size = 0, dont check size */ |
2003 |
/* if user specifed buffer size = 0, dont check size */ |
| 1972 |
if (mp3buffer_size == 0) |
2004 |
if (mp3buffer_size == 0) |
|
Lines 1997-2003
Link Here
|
| 1997 |
} |
2029 |
} |
| 1998 |
mp3count += imp3; |
2030 |
mp3count += imp3; |
| 1999 |
} |
2031 |
} |
| 2000 |
gfp->encoder_padding = end_padding; |
|
|
| 2001 |
#if 0 |
2032 |
#if 0 |
| 2002 |
{ |
2033 |
{ |
| 2003 |
int const ed = gfp->encoder_delay; |
2034 |
int const ed = gfp->encoder_delay; |
|
Lines 2011-2016
Link Here
|
| 2011 |
MSGF(gfc, "encoder padding=%d\n", ep); |
2042 |
MSGF(gfc, "encoder padding=%d\n", ep); |
| 2012 |
MSGF(gfc, "sample count=%d (%g)\n", ns, gfp->in_samplerate*duration); |
2043 |
MSGF(gfc, "sample count=%d (%g)\n", ns, gfp->in_samplerate*duration); |
| 2013 |
MSGF(gfc, "duration=%g sec\n", duration); |
2044 |
MSGF(gfc, "duration=%g sec\n", duration); |
|
|
2045 |
MSGF(gfc, "mf_size=%d\n",gfc->mf_size); |
| 2046 |
MSGF(gfc, "mf_samples_to_encode=%d\n",gfc->mf_samples_to_encode); |
| 2014 |
} |
2047 |
} |
| 2015 |
#endif |
2048 |
#endif |
| 2016 |
return mp3count; |
2049 |
return mp3count; |
|
Lines 2052-2058
Link Here
|
| 2052 |
/* flush internal mp3 buffers, and free internal buffers */ |
2085 |
/* flush internal mp3 buffers, and free internal buffers */ |
| 2053 |
/*****************************************************************/ |
2086 |
/*****************************************************************/ |
| 2054 |
#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED |
2087 |
#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED |
|
|
2088 |
/* OBSOLETE */ |
| 2089 |
int CDECL |
| 2090 |
lame_encode_finish(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size); |
| 2055 |
#else |
2091 |
#else |
|
|
2092 |
#endif |
| 2093 |
|
| 2056 |
int |
2094 |
int |
| 2057 |
lame_encode_finish(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size) |
2095 |
lame_encode_finish(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size) |
| 2058 |
{ |
2096 |
{ |
|
Lines 2062-2068
Link Here
|
| 2062 |
|
2100 |
|
| 2063 |
return ret; |
2101 |
return ret; |
| 2064 |
} |
2102 |
} |
| 2065 |
#endif |
|
|
| 2066 |
|
2103 |
|
| 2067 |
/*****************************************************************/ |
2104 |
/*****************************************************************/ |
| 2068 |
/* write VBR Xing header, and ID3 version 1 tag, if asked for */ |
2105 |
/* write VBR Xing header, and ID3 version 1 tag, if asked for */ |