int mpeg1_2_video_packetizer_c::process(packet_cptr packet) { if (0.0 > m_fps) extract_fps(packet->data->get_buffer(), packet->data->get_size()); if (!m_aspect_ratio_extracted) extract_aspect_ratio(packet->data->get_buffer(), packet->data->get_size()); if (m_framed) return process_framed(packet); int state = m_parser.GetState(); if ((MPV_PARSER_STATE_EOS == state) || (MPV_PARSER_STATE_ERROR == state)) return FILE_STATUS_DONE; memory_cptr old_memory = packet->data; unsigned char *data_ptr = old_memory->get_buffer(); int new_bytes = old_memory->get_size(); if (packet->has_timecode()) m_parser.AddTimecode(packet->timecode); do { int bytes_to_add = (m_parser.GetFreeBufferSpace() < new_bytes) ? m_parser.GetFreeBufferSpace() : new_bytes; if (0 < bytes_to_add) { m_parser.WriteData(data_ptr, bytes_to_add); data_ptr += bytes_to_add; new_bytes -= bytes_to_add; } state = m_parser.GetState(); while (MPV_PARSER_STATE_FRAME == state) { MPEGFrame *frame = m_parser.ReadFrame(); if (NULL == frame) break; if (NULL == m_hcodec_private) create_private_data(); packet_cptr new_packet = packet_cptr(new packet_t(new memory_c(frame->data, frame->size, true), frame->timecode, frame->duration, frame->firstRef, frame->secondRef)); new_packet->time_factor = MPEG2_PICTURE_TYPE_FRAME == frame->pictureStructure ? 1 : 2; put_sequence_headers_into_codec_state(new_packet); video_packetizer_c::process(new_packet); frame->data = NULL; delete frame; state = m_parser.GetState(); } } while (0 < new_bytes); return FILE_STATUS_MOREDATA; }
int pcm_packetizer_c::process(packet_cptr packet) { if (packet->has_timecode() && (packet->data->get_size() >= m_min_packet_size)) return process_packaged(packet); m_buffer.add(packet->data->get_buffer(), packet->data->get_size()); while (m_buffer.get_size() >= m_packet_size) { add_packet(new packet_t(memory_c::clone(m_buffer.get_buffer(), m_packet_size), m_samples_output * m_s2tc, m_samples_per_packet * m_s2tc)); m_buffer.remove(m_packet_size); m_samples_output += m_samples_per_packet; } return FILE_STATUS_MOREDATA; }
int mpeg1_2_video_packetizer_c::process_unframed(packet_cptr packet) { int state = m_parser.GetState(); if ((MPV_PARSER_STATE_EOS == state) || (MPV_PARSER_STATE_ERROR == state)) return FILE_STATUS_DONE; auto old_memory = packet->data; auto data_ptr = old_memory->get_buffer(); int new_bytes = old_memory->get_size(); if (packet->has_timecode()) m_parser.AddTimecode(packet->timecode); do { int bytes_to_add = std::min<int>(m_parser.GetFreeBufferSpace(), new_bytes); if (0 < bytes_to_add) { m_parser.WriteData(data_ptr, bytes_to_add); data_ptr += bytes_to_add; new_bytes -= bytes_to_add; } state = m_parser.GetState(); while (MPV_PARSER_STATE_FRAME == state) { auto frame = std::shared_ptr<MPEGFrame>(m_parser.ReadFrame()); if (!frame) break; if (!m_hcodec_private) create_private_data(); packet_cptr new_packet = packet_cptr(new packet_t(new memory_c(frame->data, frame->size, true), frame->timecode, frame->duration, frame->refs[0], frame->refs[1])); new_packet->time_factor = MPEG2_PICTURE_TYPE_FRAME == frame->pictureStructure ? 1 : 2; remove_stuffing_bytes_and_handle_sequence_headers(new_packet); generic_video_packetizer_c::process(new_packet); frame->data = nullptr; state = m_parser.GetState(); } } while (0 < new_bytes); return FILE_STATUS_MOREDATA; }
int opus_packetizer_c::process(packet_cptr packet) { try { auto toc = mtx::opus::toc_t::decode(packet->data); mxdebug_if(m_debug, boost::format("TOC: %1%\n") % toc); if (!packet->has_timecode() || (timecode_c::ns(packet->timecode) == m_previous_provided_timecode)) packet->timecode = m_next_calculated_timecode.to_ns(); else m_previous_provided_timecode = timecode_c::ns(packet->timecode); packet->duration = toc.packet_duration.to_ns(); m_next_calculated_timecode = timecode_c::ns(packet->timecode + packet->duration); add_packet(packet); } catch (mtx::opus::exception &ex) { mxdebug_if(m_debug, boost::format("Exception: %1%\n") % ex.what()); } return FILE_STATUS_MOREDATA; }
int mpeg4_p10_es_video_packetizer_c::process(packet_cptr packet) { try { if (packet->has_timecode()) m_parser.add_timecode(packet->timecode); m_parser.add_bytes(packet->data->get_buffer(), packet->data->get_size()); flush_frames(); } catch (nalu_size_length_x &error) { mxerror_tid(m_ti.m_fname, m_ti.m_id, boost::format(Y("This AVC/h.264 contains frames that are too big for the current maximum NALU size. " "You have to re-run mkvmerge and set the maximum NALU size to %1% for this track " "(command line parameter '--nalu-size-length %2%:%1%').\n")) % error.get_required_length() % m_ti.m_id); } catch (mtx::exception &error) { mxerror_tid(m_ti.m_fname, m_ti.m_id, boost::format(Y("mkvmerge encountered broken or unparsable data in this AVC/h.264 video track. " "Either your file is damaged (which mkvmerge cannot cope with yet) or this is a bug in mkvmerge itself. " "The error message was:\n%1%\n")) % error.error()); } return FILE_STATUS_MOREDATA; }
void timestamp_calculator_c::add_timecode(packet_cptr const &packet) { if (packet->has_timecode()) add_timecode(timestamp_c::ns(packet->timecode)); }