get h.265 video file from pcap rtp capture - video-capture

I am trying to extract video file from h.265 encoded & unencrypted rtsp/rtp pcap capture. I tried extracting rtp stream raw data and tried play it using vlc but not working. Is there any way can i get h.265 video file from pcap capture.

Actually, it is a tricky thing. A similar concept was implemented by http://ucsniff.sourceforge.net/videosnarf.html for h264, but they don't support h265 so I adopted the method. The main idea is that you have to add some parts that are missing.
As it is mentioned in https://www.rfc-editor.org/rfc/rfc7798 the header is like this:
+---------------+---------------+
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F| Type | LayerId | TID |
+-------------+-----------------+
You have to add the removed header for every elementary stream packet, which is 4 Bytes (00 00 00 01).
But we all know the h265 packets are too long and most of them are fragmented, and as I understand the players like VLC don't support fragmentation. So you have to reassemble them.
This process is only for fragmented packets types (like 49). You have an additional header which is like this:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E| FuType |
+---------------+
the bits S and E tells you how to reassemble the packets. The first packet in the sequence has S,E = 1,0 and others continue with S,E = 0,0 (maybe multiple packets) and the final one has S,E = 0,1. All the payload bytes are concatenated then a new header is created by replacing the type in the main header with the FuType mentioned here like this (and don't forget the 4Byte header):
+---------------+---------------+--------------
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--------------
|F| FuType | LayerId | TID | all the concatenated payloads
+-------------+-----------------+---------------
Just remember you have to keep both the fragmented and nonfragmented payload since most of the unfragmented packets have crucial information like picture size which cannot be omitted. The elementary stream can be played by SMplayer or you can use VLC.
For VLC you have to set the demuxer to h265.

Related

Managing EOF in Trx Library

I am using the TRX library to process the ISO8583 Message. I am receiving a Raw data EOF character. But the last byte is not removed from the buffer as it's not defined in the packager and it's causing an issue in parsing the next transaction. How to manage this?
And while sending a response back how to add EOF character?
Normally, this kind of stuff (protocol characters) is removed before decoding ISO8583 data.
For example, you read 100 bytes from the socket. And it's ISO data + EOF character. You would remove EOF character and process 99 bytes of ISO data through a decoder.
And reverse is true when you send data. You encode your data first then add EOF character. The resulting byte array goes into the socket.
Sorry, I don't know anything about TRX library, but, hopefully, general advice helps you somewhat.

Verifying Checksum value through Wireshark

I'm trying to verify the validity of a checksum value of a UDP packet by checking the packet with Wireshark.
In this specific packet I'm looking at, the values of the UDP headers are as follows:
Source port: 53 (0000 0000 0011 0101)
Destination port: 64992 (1111 1101 1110 0000)
Length: 64 (0000 0000 0100 0000)
Now if these values are added, the sum is 65109 (1111 1110 0101 0101)
So I expect the checksum value to be 426 (0001 1010 1010) which is 1's complement of the sum.
But in Wireshark, the checksum value is 0x63c7, and it says that this checksum is correct.
I'd like to know where I'm mistaken.
Any help or push in the right direction would be greatly appreciated.
Thanks in advance.
If you reference RFC 768, you will find the details you need to properly compute the checksum:
Checksum is the 16-bit one's complement of the one's complement sum of a
pseudo header of information from the IP header, the UDP header, and the
data, padded with zero octets at the end (if necessary) to make a
multiple of two octets.
The pseudo header conceptually prefixed to the UDP header contains the
source address, the destination address, the protocol, and the UDP
length. This information gives protection against misrouted datagrams.
This checksum procedure is the same as is used in TCP.
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| source address |
+--------+--------+--------+--------+
| destination address |
+--------+--------+--------+--------+
| zero |protocol| UDP length |
+--------+--------+--------+--------+
If the computed checksum is zero, it is transmitted as all ones (the
equivalent in one's complement arithmetic). An all zero transmitted
checksum value means that the transmitter generated no checksum (for
debugging or for higher level protocols that don't care).
If you want to see how Wireshark's UDP dissector handles it, you can look at the source code for packet-udp.c. Basically, after setting up the data inputs properly, it essentially just calls the in_cksum() function in the in_cksum.c file to compute it.
You might also want to take a look at RFC 1071, "Computing the Internet Checksum".

Barcode Scanner Decoding

I am experience some trouble decoding the output of a 1D Chinese Barcode Reader. The reader uses a USB interface and connects as a Keyboard HID device (which I have no problem with). After interfacing the device with Labview and generating the inf driver file I tried reading device interrupt data from a test barcode in the configuration manual "000200" the output of the Device is sent serially and is as follows "39 39 39 31 39 39 40".
I am guessing that 40 is the escape character the 39 is 0 and the 31 is 2.
After doing some research I could not find the relevant key code table for this encoding. I have tried disabling all other encoding formats using the configuration manual (39, full ascii, int 2 to 5..).
The module was able to read Upper case letter and send an additional character noting that it is an Upper Case
The device stopped reading the barcode after disabling the Code 128. I re-enabled this option and reading was successful. however the code 128 table have the "G" assigned to the 39 output and not the 0 which messes up the reading.
Did anyone work with the following format? if so which key code is it? or should I map the character set manually?
The following is a link to the purchased Module:
Reader
Thank you it is much appreciated!
As per this answer, a USB HID device sends USB usage codes, not ASCII character codes. That answer links to the lengthy official documentation on usb.org, but this document from microsoft.com appears to be a concise summary. If those links break in future, a web search for usb hid key codes or similar should find an equivalent.
Looking at the HID Usage ID column on the Microsoft document, the code for '0' is 27 in hexadecimal, which is 39 in decimal. '2' is 1F which is 31, and 40 decimal is 28 hex which corresponds to Return. That would be consistent with the output you're seeing, assuming you're reporting it as a sequence of decimal values. As you've observed, a capital letter is sent as two codes, the first of which will probably correspond to the 'shift' key in the HID usage table.
You could try searching or asking around for a LabVIEW VI to translate these codes into ASCII characters but it's probably quicker to build your own based on the table linked above. To test it, you could use a barcode generator program or webpage to create barcodes for all the characters you want to be able to decode and check that scanning them with your device gives the correct output.

THE Size Of Udp Packets

i want to know if we have a simple udp packet that has a string in it how much the size of udp packet will be
for exmaple we have a udp packet that has a string in it
the string is:stackoverflow.com
ok now how much the size of the udp packet will be?
i was thinking that may the size of udp packets that have a text in it be like a size of text file with the same text in packet?
so if the file have this text and the size is 1 kilobites
test
if the packet has same text will the size be same as text file?
The size of a UDP datagram is the size of the data inside it (payload) plus the size of the UDP and IP headers. The payload can be up to 65507 bytes for IPv4 transported over IP with no additional options in the header.
It's up to you how you create the payload. "test" could be as little as 4 bytes using a single-byte character set with no terminator or length indicator. Really, it's up to you to create a payload structure that you are able to decode at your receiver.
Add 8 octets for UDP header, another 12 for IPv4.
It gets a bit more complicated if you need to calculate the lower layer, e.g. ethernet frame

Bzip2 block header: 1AY&SY

This is the question about bzip2 archive format. Any Bzip2 archive consists of file header, one or more blocks and tail structure. All blocks should start with "1AY&SY", 6 bytes of BCD-encoded digits of the Pi number, 0x314159265359. According to the source of bzip2:
/*--
A 6-byte block header, the value chosen arbitrarily
as 0x314159265359 :-). A 32 bit value does not really
give a strong enough guarantee that the value will not
appear by chance in the compressed datastream. Worst-case
probability of this event, for a 900k block, is about
2.0e-3 for 32 bits, 1.0e-5 for 40 bits and 4.0e-8 for 48 bits.
For a compressed file of size 100Gb -- about 100000 blocks --
only a 48-bit marker will do. NB: normal compression/
decompression do *not* rely on these statistical properties.
They are only important when trying to recover blocks from
damaged files.
--*/
The question is: Is it true, that all bzip2 archives will have blocks with start aligned to byte boundary? I mean all archives created by reference implementation of bzip2, the bzip2-1.0.5+ utility.
I think that bzip2 may parse the stream not as byte stream but as bit stream (the block itself is encoded by huffman, which is not byte-aligned by design).
So, in other words: If grep -c 1AY&SY greater (huffman may generate 1AY&SY inside block) or equal to count of bzip2 blocks in the file?
BZIP2 looks at a bit stream.
From http://blastedbio.blogspot.com/2011/11/random-access-to-bzip2.html:
Anyway, the important bits are that a BZIP2 file contains one or more
"streams", which are byte aligned, each containing one (zero?) or more
"blocks", which are not byte aligned, followed by an end of stream
marker (the six bytes 0x177245385090 which is the square root of pi as
a binary coded decimal (BCD), a four byte checksum, and empty bits for
byte alignment).
The bzip2 wikipedia article also alludes to bit-block alignment (see the File Format section), which seems to be inline from what I remember from school (had to implement the algorithm...).