00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "ogg_new_stream_handler.h"
00041
00042 #include <string.h>
00043
00044 splt_ogg_new_stream_handler *splt_ogg_nsh_new(splt_state *state, splt_ogg_state *oggstate,
00045 ogg_stream_state *stream_out, const char *output_fname, int write_header_packets,
00046 ogg_stream_state *optional_stream_in)
00047 {
00048 splt_ogg_new_stream_handler *nsh = malloc(sizeof(*nsh));
00049
00050 if (nsh == NULL)
00051 {
00052 return NULL;
00053 }
00054
00055 memset(nsh, 0x0, sizeof(*nsh));
00056
00057 nsh->header_packet_counter = TOTAL_HEADER_PACKETS;
00058 nsh->state = state;
00059 nsh->oggstate = oggstate;
00060 nsh->stream_out = stream_out;
00061 nsh->output_fname = output_fname;
00062 nsh->write_header_packets = write_header_packets;
00063 nsh->optional_stream_in = optional_stream_in;
00064
00065 return nsh;
00066 }
00067
00068 void splt_ogg_nsh_free(splt_ogg_new_stream_handler **nsh)
00069 {
00070 if (!nsh || !*nsh)
00071 {
00072 return;
00073 }
00074
00075 free(*nsh);
00076 *nsh = NULL;
00077 }
00078
00079 void splt_ogg_initialise_for_new_stream(splt_ogg_new_stream_handler *nsh,
00080 ogg_page *page, long *cutpoint, long previous_granulepos)
00081 {
00082 splt_ogg_state *oggstate = nsh->oggstate;
00083
00084 ogg_stream_state *stream_in = nsh->optional_stream_in;
00085 if (nsh->optional_stream_in == NULL)
00086 {
00087 stream_in = oggstate->stream_in;
00088 }
00089
00090 ogg_stream_clear(stream_in);
00091 ogg_stream_init(stream_in, ogg_page_serialno(page));
00092
00093 if (cutpoint != NULL && *cutpoint != 0)
00094 {
00095 *cutpoint -= previous_granulepos;
00096 }
00097
00098 nsh->header_packet_counter = 0;
00099 }
00100
00101 int splt_ogg_new_stream_needs_header_packet(splt_ogg_new_stream_handler *nsh)
00102 {
00103 return nsh->header_packet_counter < TOTAL_HEADER_PACKETS;
00104 }
00105
00106 void splt_ogg_new_stream_handle_header_packet(splt_ogg_new_stream_handler *nsh, ogg_packet *packet, int *error)
00107 {
00108 splt_ogg_state *oggstate = nsh->oggstate;
00109
00110 if (!nsh->write_header_packets)
00111 {
00112 nsh->header_packet_counter++;
00113 return;
00114 }
00115
00116 splt_state *state = nsh->state;
00117
00118 if (nsh->header_packet_counter == 0)
00119 {
00120 splt_ogg_free_oggstate_headers(oggstate);
00121
00122 oggstate->headers = malloc(sizeof(splt_v_packet) * TOTAL_HEADER_PACKETS);
00123 if (oggstate->headers == NULL)
00124 {
00125 *error = SPLT_ERROR_CANNOT_ALLOCATE_MEMORY;
00126 return;
00127 }
00128 memset(oggstate->headers, 0, sizeof(splt_v_packet) * TOTAL_HEADER_PACKETS);
00129
00130 splt_ogg_free_vorbis_comment(&oggstate->vc, oggstate->cloned_vorbis_comment);
00131 vorbis_info_clear(oggstate->vi);
00132 vorbis_info_init(oggstate->vi);
00133 }
00134
00135 oggstate->headers[nsh->header_packet_counter] = splt_ogg_clone_packet(packet, error);
00136 if (*error < 0)
00137 {
00138 return;
00139 }
00140
00141 if (vorbis_synthesis_headerin(oggstate->vi, &oggstate->vc, packet) < 0)
00142 {
00143 *error = SPLT_ERROR_INVALID;
00144 splt_e_set_error_data(state, splt_t_get_filename_to_split(state));
00145 return;
00146 }
00147 oggstate->cloned_vorbis_comment = SPLT_FALSE;
00148
00149 nsh->header_packet_counter++;
00150
00151 if (nsh->write_header_packets && nsh->header_packet_counter == TOTAL_HEADER_PACKETS)
00152 {
00153 oggstate->serial++;
00154
00155 ogg_stream_clear(nsh->stream_out);
00156 ogg_stream_init(nsh->stream_out, oggstate->serial);
00157
00158 splt_ogg_put_tags(state, error);
00159 if (*error < 0) { return; }
00160
00161 splt_ogg_set_tags_in_headers(oggstate, error);
00162 if (*error < 0) { return; }
00163
00164 splt_ogg_write_header_packets(state, oggstate, nsh->stream_out, nsh->output_fname, error);
00165 }
00166 }
00167