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 */ |