J'ai un peu avancé sur la question mais le décodage global ne fonctionne pas.
Tout d'abord, j'ai récupéré quelques données du SDP que j'avais oublié (profile-level-id et sprop-parameter-set) afin d'alimenter les champs profile_idc, level_idc, extradata et extradata_size de ma structure AvCodecContext.
Ensuite j'ai séparé le décodage des paquets dits Coded Slice, SPS, PPS et NAL_IDR_SLICE.
Pour faire simple, les paquets Coded Slice allégés du header RTP sont directement passés au décodeur (avcodec_decode_video) avec le préfixe 0x000001. La fonction me renvoie bien la taille du paquet
ConsumedBytes (indique que tous les bytes ont été utilisés pour le décodage) et le paramètre
GotPicture indiquant que la frame est bien décodée devient supérieur à zéro à la suite du décodage.
Code C/C++ :
uint8_t start_sequence[]= {0, 0, 1};
int size= recv(id_de_la_socket,(char*) rtpReceive,65535,0);
char *z = new char[size-16+sizeof(start_sequence)];
memcpy(z,&start_sequence,sizeof(start_sequence));
memcpy(z+sizeof(start_sequence),rtpReceive+16,size-16);
ConsumedBytes = avcodec_decode_video(codecContext,pFrame,&GotPicture,(uint8_t*)z,size-16+sizeof(start_sequence));
delete z;
Les paquets SPS et PPS subissent les mêmes instructions. Cependant, le &GotPicture reste à zéro ce qui est normal.
A chaque fois qu'un nouveau couple SPS/PPS est trouvé, j'actualise les champs extradata et extradata_size de mon AvCodecContext. Cela devrait normalement me permettre de décoder ma prochaine Idr frame ...
Mes iDR Frame sont fragmentés selon le type FU-A. J'ai donc tenté deux méthodes pour les décoder :
1) à chaque fragment ayant le start_bit à 1, je lui préfixe la séquence 0x000001 et l'envoie à avcodec_decode_video. J'envoie le reste des fragments FU-A jusqu'au paquet ayant le end_bit =1.
2) je préfixe la séquence 0x000001 au premier paquet FU-A et lui concatène ensuite tous les autres fragments arrivant. Une fois de dernier fragment arrivé, j'envoie cette chaîne au décodeur.
Dans les deux cas la fonction ne me renvoie pas d'erreurs (ConsumedBytes >0) cependant elle ne détecte aucune frame (GotPicture reste à zéro).
Avez-vous des idées ? Qu'est-ce que je règle mal ? Quelle autre méthode puis-je employer ?
Merci d'avance