• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/ap/gpl/minidlna/flac-1.2.1/src/libFLAC/

Lines Matching refs:chain

909 	 * This is the length of the chain initially read from the FLAC file.
920 FLAC__Metadata_Chain *chain;
957 static void chain_init_(FLAC__Metadata_Chain *chain)
959 FLAC__ASSERT(0 != chain);
961 chain->filename = 0;
962 chain->is_ogg = false;
963 chain->head = chain->tail = 0;
964 chain->nodes = 0;
965 chain->status = FLAC__METADATA_CHAIN_STATUS_OK;
966 chain->initial_length = 0;
967 chain->read_cb = 0;
970 static void chain_clear_(FLAC__Metadata_Chain *chain)
974 FLAC__ASSERT(0 != chain);
976 for(node = chain->head; node; ) {
982 if(0 != chain->filename)
983 free(chain->filename);
985 chain_init_(chain);
988 static void chain_append_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node)
990 FLAC__ASSERT(0 != chain);
996 if(0 != chain->tail)
997 chain->tail->data->is_last = false;
999 if(0 == chain->head)
1000 chain->head = node;
1002 FLAC__ASSERT(0 != chain->tail);
1003 chain->tail->next = node;
1004 node->prev = chain->tail;
1006 chain->tail = node;
1007 chain->nodes++;
1010 static void chain_remove_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node)
1012 FLAC__ASSERT(0 != chain);
1015 if(node == chain->head)
1016 chain->head = node->next;
1020 if(node == chain->tail)
1021 chain->tail = node->prev;
1025 if(0 != chain->tail)
1026 chain->tail->data->is_last = true;
1028 chain->nodes--;
1031 static void chain_delete_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node)
1033 chain_remove_node_(chain, node);
1037 static off_t chain_calculate_length_(FLAC__Metadata_Chain *chain)
1041 for(node = chain->head; node; node = node->next)
1052 FLAC__ASSERT(0 != iterator->chain);
1053 FLAC__ASSERT(0 != iterator->chain->head);
1054 FLAC__ASSERT(0 != iterator->chain->tail);
1062 iterator->chain->head = node;
1068 iterator->chain->nodes++;
1077 FLAC__ASSERT(0 != iterator->chain);
1078 FLAC__ASSERT(0 != iterator->chain->head);
1079 FLAC__ASSERT(0 != iterator->chain->tail);
1087 iterator->chain->tail = node;
1093 iterator->chain->tail->data->is_last = true;
1095 iterator->chain->nodes++;
1099 static FLAC__bool chain_merge_adjacent_padding_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node)
1105 chain_delete_node_(chain, node->next);
1112 /* Returns the new length of the chain, or 0 if there was an error. */
1119 static off_t chain_prepare_for_write_(FLAC__Metadata_Chain *chain, FLAC__bool use_padding)
1121 off_t current_length = chain_calculate_length_(chain);
1125 if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) {
1126 const off_t delta = chain->initial_length - current_length;
1127 chain->tail->data->length += delta;
1129 FLAC__ASSERT(current_length == chain->initial_length);
1132 else if(current_length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length) {
1136 chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
1139 padding->length = chain->initial_length - (FLAC__STREAM_METADATA_HEADER_LENGTH + current_length);
1142 chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
1146 chain_append_node_(chain, node);
1147 current_length = chain_calculate_length_(chain);
1148 FLAC__ASSERT(current_length == chain->initial_length);
1151 else if(current_length > chain->initial_length) {
1152 const off_t delta = current_length - chain->initial_length;
1153 if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) {
1155 if((off_t)chain->tail->data->length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta) {
1156 chain_delete_node_(chain, chain->tail);
1157 current_length = chain_calculate_length_(chain);
1158 FLAC__ASSERT(current_length == chain->initial_length);
1161 else if((off_t)chain->tail->data->length >= delta) {
1162 chain->tail->data->length -= delta;
1164 FLAC__ASSERT(current_length == chain->initial_length);
1173 static FLAC__bool chain_read_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Tell tell_cb)
1177 FLAC__ASSERT(0 != chain);
1185 chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR;
1188 chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
1191 chain->status = FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE;
1201 chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR;
1204 chain->first_offset = (off_t)pos;
1215 chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
1220 chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR;
1227 chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
1234 chain->status = get_equivalent_status_(read_metadata_block_data_cb_(handle, read_cb, seek_cb, node->data));
1235 if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) {
1239 chain_append_node_(chain, node);
1246 chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR;
1249 chain->last_offset = (off_t)pos;
1252 chain->initial_length = chain_calculate_length_(chain);
1259 FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data;
1261 if(*bytes > 0 && chain->status == FLAC__METADATA_CHAIN_STATUS_OK) {
1262 *bytes = chain->read_cb(buffer, sizeof(FLAC__byte), *bytes, chain->handle);
1280 FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data;
1287 chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
1294 chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
1298 chain_append_node_(chain, node);
1303 FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data;
1305 chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */
1308 static FLAC__bool chain_read_ogg_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb)
1312 FLAC__ASSERT(0 != chain);
1316 chain->handle = handle;
1317 chain->read_cb = read_cb;
1319 chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
1323 if(FLAC__stream_decoder_init_ogg_stream(decoder, chain_read_ogg_read_cb_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, chain_read_ogg_write_cb_, chain_read_ogg_metadata_cb_, chain_read_ogg_error_cb_, chain) != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
1325 chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */
1329 chain->first_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */
1332 chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */
1333 if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) {
1340 chain->last_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */
1342 chain->initial_length = chain_calculate_length_(chain);
1347 static FLAC__bool chain_rewrite_metadata_in_place_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, FLAC__IOCallback_Seek seek_cb)
1351 FLAC__ASSERT(0 != chain);
1352 FLAC__ASSERT(0 != chain->head);
1354 if(0 != seek_cb(handle, chain->first_offset, SEEK_SET)) {
1355 chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
1359 for(node = chain->head; node; node = node->next) {
1361 chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR;
1365 chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR;
1370 /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/
1372 chain->status = FLAC__METADATA_CHAIN_STATUS_OK;
1376 static FLAC__bool chain_rewrite_metadata_in_place_(FLAC__Metadata_Chain *chain)
1381 FLAC__ASSERT(0 != chain->filename);
1383 if(0 == (file = fopen(chain->filename, "r+b"))) {
1384 chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
1388 /* chain_rewrite_metadata_in_place_cb_() sets chain->status for us */
1389 ret = chain_rewrite_metadata_in_place_cb_(chain, (FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, fseek_wrapper_);
1396 static FLAC__bool chain_rewrite_file_(FLAC__Metadata_Chain *chain, const char *tempfile_path_prefix)
1403 FLAC__ASSERT(0 != chain);
1404 FLAC__ASSERT(0 != chain->filename);
1405 FLAC__ASSERT(0 != chain->head);
1408 if(0 == (f = fopen(chain->filename, "rb"))) {
1409 chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
1412 if(!open_tempfile_(chain->filename, tempfile_path_prefix, &tempfile, &tempfilename, &status)) {
1413 chain->status = get_equivalent_status_(status);
1417 if(!copy_n_bytes_from_file_(f, tempfile, chain->first_offset, &status)) {
1418 chain->status = get_equivalent_status_(status);
1424 for(node = chain->head; node; node = node->next) {
1426 chain->status = get_equivalent_status_(status);
1430 chain->status = get_equivalent_status_(status);
1434 /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/
1437 if(0 != fseeko(f, chain->last_offset, SEEK_SET)) {
1439 chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
1444 chain->status = get_equivalent_status_(status);
1450 if(!transport_tempfile_(chain->filename, &tempfile, &tempfilename, &status))
1457 static FLAC__bool chain_rewrite_file_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb)
1462 FLAC__ASSERT(0 != chain);
1463 FLAC__ASSERT(0 == chain->filename);
1464 FLAC__ASSERT(0 != chain->head);
1467 if(!copy_n_bytes_from_file_cb_(handle, read_cb, temp_handle, temp_write_cb, chain->first_offset, &status)) {
1468 chain->status = get_equivalent_status_(status);
1473 for(node = chain->head; node; node = node->next) {
1475 chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR;
1479 chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR;
1483 /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/
1486 if(0 != seek_cb(handle, chain->last_offset, SEEK_SET)) {
1487 chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
1491 chain->status = get_equivalent_status_(status);
1500 FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)calloc(1, sizeof(FLAC__Metadata_Chain));
1502 if(0 != chain)
1503 chain_init_(chain);
1505 return chain;
1508 FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain)
1510 FLAC__ASSERT(0 != chain);
1512 chain_clear_(chain);
1514 free(chain);
1517 FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain)
1521 FLAC__ASSERT(0 != chain);
1523 status = chain->status;
1524 chain->status = FLAC__METADATA_CHAIN_STATUS_OK;
1528 static FLAC__bool chain_read_(FLAC__Metadata_Chain *chain, const char *filename, FLAC__bool is_ogg)
1533 FLAC__ASSERT(0 != chain);
1536 chain_clear_(chain);
1538 if(0 == (chain->filename = strdup(filename))) {
1539 chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
1543 chain->is_ogg = is_ogg;
1546 chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
1550 /* the function also sets chain->status for us */
1552 chain_read_ogg_cb_(chain, file, (FLAC__IOCallback_Read)fread) :
1553 chain_read_cb_(chain, file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, ftell_wrapper_)
1561 FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename)
1563 return chain_read_(chain, filename, /*is_ogg=*/false);
1567 FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename)
1569 return chain_read_(chain, filename, /*is_ogg=*/true);
1572 static FLAC__bool chain_read_with_callbacks_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__bool is_ogg)
1576 FLAC__ASSERT(0 != chain);
1578 chain_clear_(chain);
1581 chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS;
1585 chain->is_ogg = is_ogg;
1589 chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
1593 /* the function also sets chain->status for us */
1595 chain_read_ogg_cb_(chain, handle, callbacks.read) :
1596 chain_read_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.tell)
1602 FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks)
1604 return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/false);
1608 FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks)
1610 return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/true);
1613 FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding)
1616 * but doesn't actually alter the chain. Make sure to update the logic
1619 const off_t current_length = chain_calculate_length_(chain);
1621 FLAC__ASSERT(0 != chain);
1625 if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING)
1628 else if(current_length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length)
1631 else if(current_length > chain->initial_length) {
1632 const off_t delta = current_length - chain->initial_length;
1633 if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) {
1635 if((off_t)chain->tail->data->length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta)
1638 else if((off_t)chain->tail->data->length >= delta)
1644 return (current_length != chain->initial_length);
1647 FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats)
1653 FLAC__ASSERT(0 != chain);
1655 if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */
1656 chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR;
1660 if (0 == chain->filename) {
1661 chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH;
1665 current_length = chain_prepare_for_write_(chain, use_padding);
1667 /* a return value of 0 means there was an error; chain->status is already set */
1672 get_file_stats_(chain->filename, &stats);
1674 if(current_length == chain->initial_length) {
1675 if(!chain_rewrite_metadata_in_place_(chain))
1679 if(!chain_rewrite_file_(chain, tempfile_path_prefix))
1685 chain->initial_length = current_length;
1686 chain->last_offset = chain->first_offset;
1687 for(node = chain->head; node; node = node->next)
1688 chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length);
1693 set_file_stats_(chain->filename, &stats);
1698 FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks)
1702 FLAC__ASSERT(0 != chain);
1704 if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */
1705 chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR;
1709 if (0 != chain->filename) {
1710 chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH;
1715 chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS;
1719 if (FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) {
1720 chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL;
1724 current_length = chain_prepare_for_write_(chain, use_padding);
1726 /* a return value of 0 means there was an error; chain->status is already set */
1730 FLAC__ASSERT(current_length == chain->initial_length);
1732 return chain_rewrite_metadata_in_place_cb_(chain, handle, callbacks.write, callbacks.seek);
1735 FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks)
1739 FLAC__ASSERT(0 != chain);
1741 if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */
1742 chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR;
1746 if (0 != chain->filename) {
1747 chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH;
1752 chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS;
1756 chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS;
1760 if (!FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) {
1761 chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL;
1765 current_length = chain_prepare_for_write_(chain, use_padding);
1767 /* a return value of 0 means there was an error; chain->status is already set */
1771 FLAC__ASSERT(current_length != chain->initial_length);
1775 chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
1779 if(!chain_rewrite_file_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.eof, temp_handle, temp_callbacks.write))
1785 chain->initial_length = current_length;
1786 chain->last_offset = chain->first_offset;
1787 for(node = chain->head; node; node = node->next)
1788 chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length);
1794 FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain)
1798 FLAC__ASSERT(0 != chain);
1800 for(node = chain->head; node; ) {
1801 if(!chain_merge_adjacent_padding_(chain, node))
1806 FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain)
1811 FLAC__ASSERT(0 != chain);
1817 for(i = 0, node = chain->head; i < chain->nodes; i++) {
1820 chain_remove_node_(chain, node);
1821 chain_append_node_(chain, node);
1829 FLAC__metadata_chain_merge_padding(chain);
1839 iterator->chain = 0;
1852 FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain)
1855 FLAC__ASSERT(0 != chain);
1856 FLAC__ASSERT(0 != chain->head);
1858 iterator->chain = chain;
1859 iterator->current = chain->head;
1927 chain_delete_node_(iterator->chain, iterator->current);