mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2025-01-04 09:15:05 +00:00
Support for AVC/h.264 elementary streams with short markers (0x00 0x00 0x01 instead of 0x00 0x00 0x00 0x01).
This commit is contained in:
parent
a4fd05dc2d
commit
25df94521b
@ -1,5 +1,8 @@
|
|||||||
2007-01-03 Moritz Bunkus <moritz@bunkus.org>
|
2007-01-03 Moritz Bunkus <moritz@bunkus.org>
|
||||||
|
|
||||||
|
* mkvmerge: bug fix: Support for AVC/h.264 elementary streams with
|
||||||
|
short markers (0x00 0x00 0x01 instead of 0x00 0x00 0x00 0x01).
|
||||||
|
|
||||||
* mkvmerge: Removed the "--engage allow_avc_in_vfw_mode" hack.
|
* mkvmerge: Removed the "--engage allow_avc_in_vfw_mode" hack.
|
||||||
|
|
||||||
* mkvmerge: enhancement: Added "x264" to the list of recognized
|
* mkvmerge: enhancement: Added "x264" to the list of recognized
|
||||||
|
@ -1056,7 +1056,7 @@ mpeg4::p10::avc_es_parser_c::add_bytes(unsigned char *buffer,
|
|||||||
int size) {
|
int size) {
|
||||||
memory_slice_cursor_c cursor;
|
memory_slice_cursor_c cursor;
|
||||||
unsigned char *new_buffer;
|
unsigned char *new_buffer;
|
||||||
uint32_t marker;
|
uint32_t marker, marker_size = 0, previous_marker_size = 0;
|
||||||
int previous_pos = -1, new_size;
|
int previous_pos = -1, new_size;
|
||||||
|
|
||||||
if ((NULL != m_unparsed_buffer.get()) &&
|
if ((NULL != m_unparsed_buffer.get()) &&
|
||||||
@ -1064,23 +1064,31 @@ mpeg4::p10::avc_es_parser_c::add_bytes(unsigned char *buffer,
|
|||||||
cursor.add_slice(m_unparsed_buffer);
|
cursor.add_slice(m_unparsed_buffer);
|
||||||
cursor.add_slice(buffer, size);
|
cursor.add_slice(buffer, size);
|
||||||
|
|
||||||
if (4 <= cursor.get_remaining_size()) {
|
if (3 <= cursor.get_remaining_size()) {
|
||||||
marker = (unsigned int)cursor.get_char() << 24 |
|
marker = 1 << 24 |
|
||||||
(unsigned int)cursor.get_char() << 16 |
|
(unsigned int)cursor.get_char() << 16 |
|
||||||
(unsigned int)cursor.get_char() << 8 |
|
(unsigned int)cursor.get_char() << 8 |
|
||||||
(unsigned int)cursor.get_char();
|
(unsigned int)cursor.get_char();
|
||||||
previous_pos = -1;
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (0x00000001 == marker) {
|
if (0x00000001 == marker)
|
||||||
|
marker_size = 4;
|
||||||
|
else if (0x00000001 == (marker & 0x00ffffff))
|
||||||
|
marker_size = 3;
|
||||||
|
|
||||||
|
if (0 != marker_size) {
|
||||||
if (-1 != previous_pos) {
|
if (-1 != previous_pos) {
|
||||||
new_size = cursor.get_position() - previous_pos - 8;
|
new_size = cursor.get_position() - previous_pos -
|
||||||
|
previous_marker_size - marker_size;
|
||||||
new_buffer = (unsigned char *)safemalloc(new_size);
|
new_buffer = (unsigned char *)safemalloc(new_size);
|
||||||
cursor.copy(new_buffer, previous_pos + 4, new_size);
|
cursor.copy(new_buffer, previous_pos + previous_marker_size,
|
||||||
|
new_size);
|
||||||
memory_cptr nalu(new memory_c(new_buffer, new_size, true));
|
memory_cptr nalu(new memory_c(new_buffer, new_size, true));
|
||||||
handle_nalu(nalu);
|
handle_nalu(nalu);
|
||||||
}
|
}
|
||||||
previous_pos = cursor.get_position() - 4;
|
previous_pos = cursor.get_position() - marker_size;
|
||||||
|
previous_marker_size = marker_size;
|
||||||
|
marker_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cursor.char_available())
|
if (!cursor.char_available())
|
||||||
@ -1106,9 +1114,12 @@ mpeg4::p10::avc_es_parser_c::add_bytes(unsigned char *buffer,
|
|||||||
void
|
void
|
||||||
mpeg4::p10::avc_es_parser_c::flush() {
|
mpeg4::p10::avc_es_parser_c::flush() {
|
||||||
if ((NULL != m_unparsed_buffer.get()) ||
|
if ((NULL != m_unparsed_buffer.get()) ||
|
||||||
(5 <= m_unparsed_buffer->get_size()))
|
(5 <= m_unparsed_buffer->get_size())) {
|
||||||
handle_nalu(clone_memory(m_unparsed_buffer->get() + 4,
|
int marker_size = get_uint32_be(m_unparsed_buffer->get()) == 0x0000001 ?
|
||||||
m_unparsed_buffer->get_size() - 4));
|
4 : 3;
|
||||||
|
handle_nalu(clone_memory(m_unparsed_buffer->get() + marker_size,
|
||||||
|
m_unparsed_buffer->get_size() - marker_size));
|
||||||
|
}
|
||||||
m_unparsed_buffer = memory_cptr(NULL);
|
m_unparsed_buffer = memory_cptr(NULL);
|
||||||
if (m_have_incomplete_frame) {
|
if (m_have_incomplete_frame) {
|
||||||
m_frames.push_back(m_incomplete_frame);
|
m_frames.push_back(m_incomplete_frame);
|
||||||
|
Loading…
Reference in New Issue
Block a user